From ca2cb7298cfd398284b31bac2dcaa80076d53295 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 15:13:19 +0100 Subject: [PATCH 01/55] Another attempt at fixing the yarn CI failure --- .github/workflows/e2e.yml | 2 ++ packages/cli-v3/e2e/fixtures/monorepo-react-email/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 905b4991c..1a6a2352a 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -17,6 +17,8 @@ jobs: matrix: os: [buildjet-8vcpu-ubuntu-2204, windows-latest] package-manager: ["npm", "pnpm", "yarn"] + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false steps: - name: ⬇️ Checkout repo uses: actions/checkout@v3 diff --git a/packages/cli-v3/e2e/fixtures/monorepo-react-email/package.json b/packages/cli-v3/e2e/fixtures/monorepo-react-email/package.json index 2cc47eb00..13bd9c7ff 100644 --- a/packages/cli-v3/e2e/fixtures/monorepo-react-email/package.json +++ b/packages/cli-v3/e2e/fixtures/monorepo-react-email/package.json @@ -1,7 +1,7 @@ { "name": "monorepo-react-email", "private": true, - "packageManager": "pnpm@8.15.5+sha256.4b4efa12490e5055d59b9b9fc9438b7d581a6b7af3b5675eb5c5f447cee1a589", + "packageManager": "yarn@4.2.2+sha256.1aa43a5304405be7a7cb9cb5de7b97de9c4e8ddd3273e4dad00d6ae3eb39f0ef", "engines": { "pnpm": "8.15.5", "yarn": "4.2.2" From c738ef39cb8f6453e8ab1c4bd5a53ea8e41e5a0e Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Mon, 16 Sep 2024 15:15:28 +0100 Subject: [PATCH 02/55] Fix for runs.list with from/to Date or timestamp --- .changeset/new-items-glow.md | 5 +++ .../v3/ApiRunListPresenter.server.ts | 25 +++++++++++++-- .../core/src/v3/utils/flattenAttributes.ts | 5 +++ references/v3-catalog/src/trigger/tags.ts | 31 ++++++++++++------- 4 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 .changeset/new-items-glow.md diff --git a/.changeset/new-items-glow.md b/.changeset/new-items-glow.md new file mode 100644 index 000000000..6453aa00b --- /dev/null +++ b/.changeset/new-items-glow.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/core": patch +--- + +OTEL attributes can include Dates that will be formatted as ISO strings diff --git a/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts b/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts index 21b4f956f..ac504c653 100644 --- a/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts @@ -8,6 +8,27 @@ import { ApiRetrieveRunPresenter } from "./ApiRetrieveRunPresenter.server"; import { RunListOptions, RunListPresenter } from "./RunListPresenter.server"; import { BasePresenter } from "./basePresenter.server"; +const CoercedDate = z.preprocess((arg) => { + if (arg === undefined || arg === null) { + return; + } + + if (typeof arg === "number") { + return new Date(arg); + } + + if (typeof arg === "string") { + const num = Number(arg); + if (!isNaN(num)) { + return new Date(num); + } + + return new Date(arg); + } + + return arg; +}, z.date().optional()); + const SearchParamsSchema = z.object({ "page[size]": z.coerce.number().int().positive().min(1).max(100).optional(), "page[after]": z.string().optional(), @@ -95,8 +116,8 @@ const SearchParamsSchema = z.object({ return z.NEVER; }), - "filter[createdAt][from]": z.coerce.date().optional(), - "filter[createdAt][to]": z.coerce.date().optional(), + "filter[createdAt][from]": CoercedDate, + "filter[createdAt][to]": CoercedDate, "filter[createdAt][period]": z.string().optional(), }); diff --git a/packages/core/src/v3/utils/flattenAttributes.ts b/packages/core/src/v3/utils/flattenAttributes.ts index 6a3a13b73..71fd691ec 100644 --- a/packages/core/src/v3/utils/flattenAttributes.ts +++ b/packages/core/src/v3/utils/flattenAttributes.ts @@ -33,6 +33,11 @@ export function flattenAttributes( return result; } + if (obj instanceof Date) { + result[prefix || ""] = obj.toISOString(); + return result; + } + for (const [key, value] of Object.entries(obj)) { const newPrefix = `${prefix ? `${prefix}.` : ""}${Array.isArray(obj) ? `[${key}]` : key}`; if (Array.isArray(value)) { diff --git a/references/v3-catalog/src/trigger/tags.ts b/references/v3-catalog/src/trigger/tags.ts index ce3416b5d..bd513dc01 100644 --- a/references/v3-catalog/src/trigger/tags.ts +++ b/references/v3-catalog/src/trigger/tags.ts @@ -1,9 +1,8 @@ -import { RunTags } from "@trigger.dev/core/v3"; -import { logger, runs, tags, task, tasks } from "@trigger.dev/sdk/v3"; -import { simpleChildTask } from "./subtasks"; +import { logger, runs, task, tasks } from "@trigger.dev/sdk/v3"; +import { simpleChildTask } from "./subtasks.js"; type Payload = { - tags: RunTags; + tags: string | string[]; }; export const triggerRunsWithTags = task({ @@ -16,6 +15,22 @@ export const triggerRunsWithTags = task({ { tags: payload.tags } ); + //runs in the past 5 seconds, as a date + const from = new Date(); + from.setSeconds(from.getSeconds() - 5); + const result2 = await runs.list({ tag: payload.tags, from }); + logger.log("list with Date()", { length: result2.data.length, data: result2.data }); + + //runs in the past 5 seconds, as a number timestamp + const result3 = await runs.list({ tag: payload.tags, from: from.getTime() - 5000 }); + logger.log("list with timestamp", { length: result3.data.length, data: result3.data }); + + logger.log("run usage", { + costInCents: result2.data[0].costInCents, + baseCostInCents: result2.data[0].baseCostInCents, + durationMs: result2.data[0].durationMs, + }); + await simpleChildTask.triggerAndWait( { message: "triggerAndWait from triggerRunsWithTags" }, { tags: payload.tags } @@ -71,13 +86,5 @@ export const triggerRunsWithTags = task({ baseCostInCents: run.baseCostInCents, durationMs: run.durationMs, }); - - const result2 = await runs.list({ tag: payload.tags }); - logger.log("trigger runs ", { length: result2.data.length, data: result2.data }); - logger.log("run usage", { - costInCents: result2.data[0].costInCents, - baseCostInCents: result2.data[0].baseCostInCents, - durationMs: result2.data[0].durationMs, - }); }, }); From cf13fbdf32726292cefd7d4d40e8743331685c03 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 15:30:32 +0100 Subject: [PATCH 03/55] Updating docs for the move from beta -> latest (with new build system) (#1299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add triggerAndWait().unwrap() to more easily get at the output or throw the subtask error * Add taskId and runId to SubtaskUnwrapError * WIP docs update beta -> latest * trigger.dev init now adds @trigger.dev/build to devDependencies * How it works doc * Restructure some docs and update the cli commands * Config file docs, plus aptGet and ffmpeg extensions * Update to latest from beta docs * Add runtime to templates * Add --runtime option to the init CLI command * A bunch more doc updates after feedback * Document triggerAndWait with unwrap and result types * beta -> latest in the webapp * CLI update check no longer references beta * Add major release * Leave changeset beta, back to normal package release * Fixed default dirs option in init command * exclude windows-yarn variation of cli e2e tests because it’s buggy * Remove cache to try and fix yarn e2e test workflow errors --- .changeset/cuddly-penguins-cross.md | 8 + .changeset/itchy-jars-pay.md | 5 + .changeset/ninety-countries-swim.md | 5 + .changeset/old-feet-brush.md | 5 + .changeset/pre.json | 2 +- .changeset/stale-actors-camp.md | 5 + .changeset/thick-trains-work.md | 5 + .github/workflows/e2e.yml | 5 +- apps/webapp/app/components/SetupCommands.tsx | 2 +- .../route.tsx | 2 +- docs/cli-init-commands.mdx | 18 +- docs/cli-list-profiles-commands.mdx | 12 +- docs/cli-login-commands.mdx | 11 +- docs/cli-logout-commands.mdx | 12 +- docs/cli-update-commands.mdx | 12 +- docs/cli-whoami-commands.mdx | 12 +- docs/config/config-file.mdx | 631 ++++++++++++++++++ docs/config/extensions/custom.mdx | 0 docs/config/extensions/esbuild-plugins.mdx | 0 docs/config/extensions/overview.mdx | 5 + docs/config/extensions/prisma.mdx | 5 + docs/deploy-environment-variables.mdx | 146 ++-- docs/github-actions.mdx | 27 +- docs/guides/bun.mdx | 113 ++++ docs/guides/frameworks/nextjs.mdx | 50 +- docs/guides/frameworks/nodejs.mdx | 22 +- .../supabase-edge-functions-basic.mdx | 10 +- ...abase-edge-functions-database-webhooks.mdx | 10 +- docs/guides/new-build-system-preview.mdx | 2 +- docs/guides/use-cases/upgrading-from-v2.mdx | 2 +- docs/how-it-works.mdx | 452 +++++++++++++ docs/images/opentelemetry-trace.png | Bin 0 -> 510047 bytes docs/management/overview.mdx | 8 +- docs/mint.json | 90 ++- docs/open-source-self-hosting.mdx | 34 +- docs/snippets/cli-commands-deploy.mdx | 76 ++- docs/snippets/cli-commands-develop.mdx | 44 +- docs/snippets/step-cli-dev.mdx | 6 +- docs/snippets/step-cli-init.mdx | 6 +- docs/snippets/trigger-tasks-nextjs.mdx | 14 +- docs/snippets/worker-failed-to-start.mdx | 51 -- .../overview.mdx} | 4 +- .../scheduled.mdx} | 0 docs/trigger-config.mdx | 274 -------- docs/trigger-folder.mdx | 25 - docs/triggering.mdx | 142 ++-- docs/troubleshooting.mdx | 51 +- docs/upgrading-beta.mdx | 431 ++++++++++++ docs/upgrading-packages.mdx | 10 +- packages/build/src/extensions/core.ts | 2 + packages/build/src/extensions/core/aptGet.ts | 27 + packages/build/src/extensions/core/ffmpeg.ts | 40 ++ packages/cli-v3/package.json | 3 +- packages/cli-v3/src/commands/init.ts | 25 +- packages/cli-v3/src/commands/update.ts | 24 +- .../cli-v3/src/utilities/initialBanner.ts | 5 +- .../templates/trigger.config.mjs.template | 1 + .../templates/trigger.config.ts.template | 1 + packages/trigger-sdk/src/v3/shared.ts | 101 ++- packages/trigger-sdk/src/v3/tasks.ts | 3 + pnpm-lock.yaml | 185 +---- references/v3-catalog/package.json | 4 +- references/v3-catalog/src/trigger/binaries.ts | 172 +---- references/v3-catalog/src/trigger/simple.ts | 34 +- references/v3-catalog/trigger.config.ts | 61 +- 65 files changed, 2434 insertions(+), 1116 deletions(-) create mode 100644 .changeset/cuddly-penguins-cross.md create mode 100644 .changeset/itchy-jars-pay.md create mode 100644 .changeset/ninety-countries-swim.md create mode 100644 .changeset/old-feet-brush.md create mode 100644 .changeset/stale-actors-camp.md create mode 100644 .changeset/thick-trains-work.md create mode 100644 docs/config/config-file.mdx create mode 100644 docs/config/extensions/custom.mdx create mode 100644 docs/config/extensions/esbuild-plugins.mdx create mode 100644 docs/config/extensions/overview.mdx create mode 100644 docs/config/extensions/prisma.mdx create mode 100644 docs/guides/bun.mdx create mode 100644 docs/how-it-works.mdx create mode 100644 docs/images/opentelemetry-trace.png delete mode 100644 docs/snippets/worker-failed-to-start.mdx rename docs/{tasks-overview.mdx => tasks/overview.mdx} (98%) rename docs/{tasks-scheduled.mdx => tasks/scheduled.mdx} (100%) delete mode 100644 docs/trigger-config.mdx delete mode 100644 docs/trigger-folder.mdx create mode 100644 docs/upgrading-beta.mdx create mode 100644 packages/build/src/extensions/core/aptGet.ts create mode 100644 packages/build/src/extensions/core/ffmpeg.ts diff --git a/.changeset/cuddly-penguins-cross.md b/.changeset/cuddly-penguins-cross.md new file mode 100644 index 000000000..c4db00256 --- /dev/null +++ b/.changeset/cuddly-penguins-cross.md @@ -0,0 +1,8 @@ +--- +"@trigger.dev/sdk": major +"trigger.dev": major +"@trigger.dev/build": major +"@trigger.dev/core": major +--- + +Release 3.0.0 diff --git a/.changeset/itchy-jars-pay.md b/.changeset/itchy-jars-pay.md new file mode 100644 index 000000000..ed54cc897 --- /dev/null +++ b/.changeset/itchy-jars-pay.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Add ffmpeg build extension diff --git a/.changeset/ninety-countries-swim.md b/.changeset/ninety-countries-swim.md new file mode 100644 index 000000000..417a6a6e0 --- /dev/null +++ b/.changeset/ninety-countries-swim.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Add --runtime option to the init CLI command diff --git a/.changeset/old-feet-brush.md b/.changeset/old-feet-brush.md new file mode 100644 index 000000000..caaaa6a5e --- /dev/null +++ b/.changeset/old-feet-brush.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +trigger.dev init now adds @trigger.dev/build to devDependencies diff --git a/.changeset/pre.json b/.changeset/pre.json index 92f3c36af..a9c272441 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "beta", "initialVersions": { "coordinator": "0.0.1", diff --git a/.changeset/stale-actors-camp.md b/.changeset/stale-actors-camp.md new file mode 100644 index 000000000..ac5462046 --- /dev/null +++ b/.changeset/stale-actors-camp.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +Add triggerAndWait().unwrap() to more easily get at the output or throw the subtask error diff --git a/.changeset/thick-trains-work.md b/.changeset/thick-trains-work.md new file mode 100644 index 000000000..5d70a2278 --- /dev/null +++ b/.changeset/thick-trains-work.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Add aptGet build extension to easily add system packages to install diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 1a6a2352a..535f94f9b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -16,9 +16,7 @@ jobs: fail-fast: false matrix: os: [buildjet-8vcpu-ubuntu-2204, windows-latest] - package-manager: ["npm", "pnpm", "yarn"] - env: - YARN_ENABLE_IMMUTABLE_INSTALLS: false + package-manager: ["npm", "pnpm"] steps: - name: ⬇️ Checkout repo uses: actions/checkout@v3 @@ -34,7 +32,6 @@ jobs: uses: buildjet/setup-node@v3 with: node-version: 20.11.1 - cache: "pnpm" - name: 📥 Download deps run: pnpm install --frozen-lockfile --filter trigger.dev... diff --git a/apps/webapp/app/components/SetupCommands.tsx b/apps/webapp/app/components/SetupCommands.tsx index 510e58d77..4071444ee 100644 --- a/apps/webapp/app/components/SetupCommands.tsx +++ b/apps/webapp/app/components/SetupCommands.tsx @@ -132,7 +132,7 @@ export function TriggerDevStep({ extra }: { extra?: string }) { } // Trigger.dev version 3 setup commands -const v3PackageTag = "beta"; +const v3PackageTag = "latest"; function getApiUrlArg() { const appOrigin = useAppOrigin(); diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx index 11524ce98..349bad884 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx @@ -1147,7 +1147,7 @@ function ConnectedDevWarning() { Runs usually start within 1 second in{" "} . Check you're running the - CLI: npx trigger.dev@beta dev + CLI: npx trigger.dev@latest dev diff --git a/docs/cli-init-commands.mdx b/docs/cli-init-commands.mdx index f83b07139..5329404ae 100644 --- a/docs/cli-init-commands.mdx +++ b/docs/cli-init-commands.mdx @@ -9,27 +9,32 @@ Run the command like this: ```bash npm -npx trigger.dev@beta init +npx trigger.dev@latest init ``` ```bash pnpm -pnpm dlx trigger.dev@beta init +pnpm dlx trigger.dev@latest init ``` ```bash yarn -yarn dlx trigger.dev@beta init +yarn dlx trigger.dev@latest init ``` ## Options + + By default, the init command assumes you are using TypeScript. Use this flag to initialize a + project that uses JavaScript. + + The project ref to use when initializing the project. - The version of the `@trigger.dev/sdk` package to install. Defaults to `3.0.0-beta.56`. + The version of the `@trigger.dev/sdk` package to install. Defaults to `latest`. @@ -53,7 +58,8 @@ yarn dlx trigger.dev@beta init - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to "log". + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to "log". @@ -64,4 +70,4 @@ yarn dlx trigger.dev@beta init Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/cli-list-profiles-commands.mdx b/docs/cli-list-profiles-commands.mdx index 416347dd7..4687811ae 100644 --- a/docs/cli-list-profiles-commands.mdx +++ b/docs/cli-list-profiles-commands.mdx @@ -9,15 +9,15 @@ Run the command like this: ```bash npm -npx trigger.dev@beta list-profiles +npx trigger.dev@latest list-profiles ``` ```bash pnpm -pnpm dlx trigger.dev@beta list-profiles +pnpm dlx trigger.dev@latest list-profiles ``` ```bash yarn -yarn dlx trigger.dev@beta list-profiles +yarn dlx trigger.dev@latest list-profiles ``` @@ -25,16 +25,16 @@ yarn dlx trigger.dev@beta list-profiles ## Options - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to `log`. Opt-out of sending telemetry data. - ## Standard options Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/cli-login-commands.mdx b/docs/cli-login-commands.mdx index 085055744..d20f9338d 100644 --- a/docs/cli-login-commands.mdx +++ b/docs/cli-login-commands.mdx @@ -9,15 +9,15 @@ Run the command like this: ```bash npm -npx trigger.dev@beta login +npx trigger.dev@latest login ``` ```bash pnpm -pnpm dlx trigger.dev@beta login +pnpm dlx trigger.dev@latest login ``` ```bash yarn -yarn dlx trigger.dev@beta login +yarn dlx trigger.dev@latest login ``` @@ -33,7 +33,8 @@ yarn dlx trigger.dev@beta login - Sets the CLI log level. Available options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This setting doesn't affect the log level of your trigger.dev tasks. The default is `log`. + Sets the CLI log level. Available options are `debug`, `info`, `log`, `warn`, `error`, and `none`. + This setting doesn't affect the log level of your trigger.dev tasks. The default is `log`. @@ -48,4 +49,4 @@ yarn dlx trigger.dev@beta login Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/cli-logout-commands.mdx b/docs/cli-logout-commands.mdx index 5031ce33f..5b28eb260 100644 --- a/docs/cli-logout-commands.mdx +++ b/docs/cli-logout-commands.mdx @@ -9,15 +9,15 @@ Run the command like this: ```bash npm -npx trigger.dev@beta logout +npx trigger.dev@latest logout ``` ```bash pnpm -pnpm dlx trigger.dev@beta logout +pnpm dlx trigger.dev@latest logout ``` ```bash yarn -yarn dlx trigger.dev@beta logout +yarn dlx trigger.dev@latest logout ``` @@ -33,16 +33,16 @@ yarn dlx trigger.dev@beta logout - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to `log`. Opt-out of sending telemetry data. - ## Standard options Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/cli-update-commands.mdx b/docs/cli-update-commands.mdx index e4b63145f..7a07b9d9b 100644 --- a/docs/cli-update-commands.mdx +++ b/docs/cli-update-commands.mdx @@ -9,15 +9,15 @@ Run the command like this: ```bash npm -npx trigger.dev@beta update +npx trigger.dev@latest update ``` ```bash pnpm -pnpm dlx trigger.dev@beta update +pnpm dlx trigger.dev@latest update ``` ```bash yarn -yarn dlx trigger.dev@beta update +yarn dlx trigger.dev@latest update ``` @@ -25,16 +25,16 @@ yarn dlx trigger.dev@beta update ## Options - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to `log`. Opt-out of sending telemetry data. - ## Standard options Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/cli-whoami-commands.mdx b/docs/cli-whoami-commands.mdx index 284b32ecd..1e51d3f73 100644 --- a/docs/cli-whoami-commands.mdx +++ b/docs/cli-whoami-commands.mdx @@ -9,15 +9,15 @@ Run the command like this: ```bash npm -npx trigger.dev@beta whoami +npx trigger.dev@latest whoami ``` ```bash pnpm -pnpm dlx trigger.dev@beta whoami +pnpm dlx trigger.dev@latest whoami ``` ```bash yarn -yarn dlx trigger.dev@beta whoami +yarn dlx trigger.dev@latest whoami ``` @@ -33,16 +33,16 @@ yarn dlx trigger.dev@beta whoami - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to `log`. Opt-out of sending telemetry data. - ## Standard options Shows the help information for the command. - \ No newline at end of file + diff --git a/docs/config/config-file.mdx b/docs/config/config-file.mdx new file mode 100644 index 000000000..7c898e494 --- /dev/null +++ b/docs/config/config-file.mdx @@ -0,0 +1,631 @@ +--- +title: "The trigger.config.ts file" +sidebarTitle: "Configuration" +description: "This file is used to configure your project and how it's built." +--- + +import BundlePackages from "/snippets/bundle-packages.mdx"; + +The `trigger.config.ts` file is used to configure your Trigger.dev project. It is a TypeScript file at the root of your project that exports a default configuration object. Here's an example: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //Your project ref (you can see it on the Project settings page in the dashboard) + project: "proj_gtcwttqhhtlasxgfuhxs", + //The paths for your trigger folders + dirs: ["./trigger"], + retries: { + //If you want to retry a task in dev mode (when using the CLI) + enabledInDev: false, + //the default retry settings. Used if you don't specify on a task. + default: { + maxAttempts: 3, + minTimeoutInMs: 1000, + maxTimeoutInMs: 10000, + factor: 2, + randomize: true, + }, + }, +}); +``` + +The config file handles a lot of things, like: + +- Specifying where your trigger tasks are located using the `dirs` option. +- Setting the default retry settings. +- Configuring OpenTelemetry instrumentations. +- Customizing the build process. +- Adding global task lifecycle functions. + + + The config file is bundled with your project, so code imported in the config file is also bundled, + which can have an effect on build times and cold start duration. One important qualification is + anything defined in the `build` config is automatically stripped out of the config file, and + imports used inside build config with be tree-shaken out. + + +## Lifecycle functions + +You can add lifecycle functions to get notified when any task starts, succeeds, or fails using `onStart`, `onSuccess` and `onFailure`: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + onSuccess: async (payload, output, { ctx }) => { + console.log("Task succeeded", ctx.task.id); + }, + onFailure: async (payload, error, { ctx }) => { + console.log("Task failed", ctx.task.id); + }, + onStart: async (payload, { ctx }) => { + console.log("Task started", ctx.task.id); + }, + init: async (payload, { ctx }) => { + console.log("I run before any task is run"); + }, +}); +``` + +Read more about task lifecycle functions in the [tasks overview](/tasks-overview). + +## Instrumentations + +We use OpenTelemetry (OTEL) for our run logs. This means you get a lot of information about your tasks with no effort. But you probably want to add more information to your logs. For example, here's all the Prisma calls automatically logged: + +![The run log](/images/auto-instrumentation.png) + +Here we add Prisma and OpenAI instrumentations to your `trigger.config.ts` file. + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { PrismaInstrumentation } from "@prisma/instrumentation"; +import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; + +export default defineConfig({ + //..other stuff + instrumentations: [new PrismaInstrumentation(), new OpenAIInstrumentation()], +}); +``` + +There is a [huge library of instrumentations](https://opentelemetry.io/ecosystem/registry/?language=js) you can easily add to your project like this. + +Some ones we recommend: + +| Package | Description | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| `@opentelemetry/instrumentation-undici` | Logs all fetch calls (inc. Undici fetch) | +| `@opentelemetry/instrumentation-fs` | Logs all file system calls | +| `@opentelemetry/instrumentation-http` | Logs all HTTP calls | +| `@prisma/instrumentation` | Logs all Prisma calls, you need to [enable tracing](https://github.com/prisma/prisma/tree/main/packages/instrumentation) | +| `@traceloop/instrumentation-openai` | Logs all OpenAI calls | + +## Runtime + +We currently only officially support the `node` runtime, but you can try our experimental `bun` runtime by setting the `runtime` option in your config file: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + runtime: "bun", +}); +``` + +See our [Bun guide](/guides/bun) for more information. + +## Default machine + +You can specify the default machine for all tasks in your project: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + defaultMachine: "large-1x", +}); +``` + +See our [machines documentation](/machines) for more information. + +## Log level + +You can set the log level for your project: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + logLevel: "debug", +}); +``` + +The `logLevel` only determines which logs are sent to the Trigger.dev instance when using the `logger` API. All `console` based logs are always sent. + +## Build configuration + +You can customize the build process using the `build` option: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + // Don't bundle these packages + external: ["header-generator"], + }, +}); +``` + + + The `trigger.config.ts` file is included in the bundle, but with the `build` configuration + stripped out. These means any imports only used inside the `build` configuration are also removed + from the final bundle. + + +### External + +All code is bundled by default, but you can exclude some packages from the bundle using the `external` option: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + external: ["header-generator"], + }, +}); +``` + +When a package is excluded from the bundle, it will be added to a dynamically generated package.json file in the build directory. The version of the package will be the same as the version found in your `node_modules` directory. + +Each entry in the external should be a package name, not necessarily the import path. For example, if you want to exclude the `ai` package, but you are importing `ai/rsc`, you should just include `ai` in the `external` array: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + external: ["ai"], + }, +}); +``` + + + Any packages that install or build a native binary should be added to external, as native binaries + cannot be bundled. For example, `re2`, `sharp`, and `sqlite3` should be added to external. + + +### JSX + +You can customize the `jsx` options that are passed to `esbuild` using the `jsx` option: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + jsx: { + // Use the Fragment component instead of React.Fragment + fragment: "Fragment", + // Use the h function instead of React.createElement + factory: "h", + // Turn off automatic runtime + automatic: false, + }, + }, +}); +``` + +By default we enabled [esbuild's automatic JSX runtime](https://esbuild.github.io/content-types/#auto-import-for-jsx) which means you don't need to import `React` in your JSX files. You can disable this by setting `automatic` to `false`. + +See the [esbuild JSX documentation](https://esbuild.github.io/content-types/#jsx) for more information. + +### Conditions + +You can add custom [import conditions](https://esbuild.github.io/api/#conditions) to your build using the `conditions` option: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + conditions: ["react-server"], + }, +}); +``` + +These conditions effect how imports are resolved during the build process. For example, the `react-server` condition will resolve `ai/rsc` to the server version of the `ai/rsc` export. + +Custom conditions will also be passed to the `node` runtime when running your tasks. + +### Extensions + +Build extension allow you to hook into the build system and customize the build process or the resulting bundle and container image (in the case of deploying). You can use pre-built extensions by installing the `@trigger.dev/build` package into your `devDependencies`, or you can create your own. + +#### additionalFiles + +Import the `additionalFiles` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { additionalFiles } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [ + additionalFiles({ files: ["wrangler/wrangler.toml", "./assets/**", "./fonts/**"] }), + ], + }, +}); +``` + +This will copy the files specified in the `files` array to the build directory. The `files` array can contain globs. The output paths will match the path of the file, relative to the root of the project. + +The root of the project is the directory that contains the trigger.config.ts file + +#### `additionalPackages` + +Import the `additionalPackages` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { additionalPackages } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [additionalPackages({ packages: ["wrangler"] })], + }, +}); +``` + +This allows you to include additional packages in the build that are not automatically included via imports. This is useful if you want to install a package that includes a CLI tool that you want to invoke in your tasks via `exec`. We will try to automatically resolve the version of the package but you can specify the version by using the `@` symbol: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [additionalPackages({ packages: ["wrangler@1.19.0"] })], + }, +}); +``` + +#### `emitDecoratorMetadata` + +If you need support for the `emitDecoratorMetadata` typescript compiler option, import the `emitDecoratorMetadata` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; + +export default defineConfig({ + project: "", + build: { + extensions: [emitDecoratorMetadata()], + }, +}); +``` + +This is usually required if you are using certain ORMs, like TypeORM, that require this option to be enabled. It's not enabled by default because there is a performance cost to enabling it. + + + emitDecoratorMetadata works by hooking into the esbuild bundle process and using the TypeScript + compiler API to compile files where we detect the use of decorators. This means you must have + `emitDecoratorMetadata` enabled in your `tsconfig.json` file, as well as `typescript` installed in + your `devDependencies`. + + +#### Prisma + +If you are using Prisma, you should use the prisma build extension. + +- Automatically handles copying prisma files to the build directory. +- Generates the prisma client during the deploy process +- Optionally will migrate the database during the deploy process +- Support for TypedSQL and multiple schema files. + +You can use it for a simple Prisma setup like this: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + build: { + extensions: [ + prismaExtension({ + version: "5.19.0", // optional, we'll automatically detect the version if not provided + schema: "prisma/schema.prisma", + }), + ], + }, +}); +``` + + + This does not have any effect when running the `dev` command, only when running the `deploy` + command. + + +If you want to also run migrations during the build process, you can pass in the `migrate` option: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + migrate: true, + directUrlEnvVarName: "DATABASE_URL_UNPOOLED", // optional - the name of the environment variable that contains the direct database URL if you are using a direct database URL + }), + ], + }, +}); +``` + +If you have multiple `generator` statements defined in your schema file, you can pass in the `clientGenerator` option to specify the `prisma-client-js` generator, which will prevent other generators from being generated: + + + +```prisma schema.prisma +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DATABASE_URL_UNPOOLED") +} + +// We only want to generate the prisma-client-js generator +generator client { + provider = "prisma-client-js" +} + +generator kysely { + provider = "prisma-kysely" + output = "../../src/kysely" + enumFileName = "enums.ts" + fileName = "types.ts" +} +``` + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + clientGenerator: "client", + }), + ], + }, +}); +``` + + + +If you are using [TypedSQL](https://www.prisma.io/typedsql), you'll need to enable it via the `typedSql` option: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + typedSql: true, + }), + ], + }, +}); +``` + + + The `prismaExtension` will inject the `DATABASE_URL` environment variable into the build process + when running the `deploy` command. This means the CLI needs to have `process.env.DATABASE_URL` set + at the time of calling the `deploy` command. You can do this via a `.env` file and passing the + `--env-file .env` option to the deploy command or via shell environment variables. This goes for direct database URLs as well. + +These environment variables are only used during the build process and are not embedded in the final image. + + + +#### syncEnvVars + +The `syncEnvVars` build extension replaces the deprecated `resolveEnvVars` export. Check out our [syncEnvVars documentation](/deploy-environment-variables#sync-env-vars-from-another-service) for more information. + +#### audioWaveform + +Previously, we installed [Audio Waveform](https://github.com/bbc/audiowaveform) in the build image. That's been moved to a build extension: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [audioWaveform()], // uses verson 1.1.0 of audiowaveform by default + }, +}); +``` + +#### ffmpeg + +You can add the `ffmpeg` build extension to your build process: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { ffmpeg } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [ffmpeg()], + }, +}); +``` + +By default, this will install the version of `ffmpeg` that is available in the Debian package manager. If you need a specific version, you can pass in the version as an argument: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { ffmpeg } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [ffmpeg({ version: "6.0-4" })], + }, +}); +``` + +This extension will also add the `FFMPEG_PATH` and `FFPROBE_PATH` to your environment variables, making it easy to use popular ffmpeg libraries like `fluent-ffmpeg`. + +#### esbuild plugins + +You can easily add existing or custom esbuild plugins to your build process using the `esbuildPlugin` extension: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { esbuildPlugin } from "@trigger.dev/build/extensions"; +import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + esbuildPlugin( + sentryEsbuildPlugin({ + org: process.env.SENTRY_ORG, + project: process.env.SENTRY_PROJECT, + authToken: process.env.SENTRY_AUTH_TOKEN, + }), + // optional - only runs during the deploy command, and adds the plugin to the end of the list of plugins + { placement: "last", target: "deploy" } + ), + ], + }, +}); +``` + +#### aptGet + +You can install system packages into the deployed image using using the `aptGet` extension: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { aptGet } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [aptGet({ packages: ["ffmpeg"] })], + }, +}); +``` + +If you want to install a specific version of a package, you can specify the version like this: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [aptGet({ packages: ["ffmpeg=6.0-4"] })], + }, +}); +``` + +#### Custom extensions + +You can create your own extensions to further customize the build process. Extensions are an object with a `name` and zero or more lifecycle hooks (`onBuildStart` and `onBuildComplete`) that allow you to modify the `BuildContext` object that is passed to the build process through adding layers. For example, this is how the `aptGet` extension is implemented: + +```ts +import { BuildExtension } from "@trigger.dev/core/v3/build"; + +export type AptGetOptions = { + packages: string[]; +}; + +export function aptGet(options: AptGetOptions): BuildExtension { + return { + name: "aptGet", + onBuildComplete(context) { + if (context.target === "dev") { + return; + } + + context.logger.debug("Adding apt-get layer", { + pkgs: options.packages, + }); + + context.addLayer({ + id: "apt-get", + image: { + pkgs: options.packages, + }, + }); + }, + }; +} +``` + +Instead of creating this function and worrying about types, you can define an extension inline in your `trigger.config.ts` file: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + //..other stuff + build: { + extensions: [ + { + name: "aptGet", + onBuildComplete(context) { + if (context.target === "dev") { + return; + } + + context.logger.debug("Adding apt-get layer", { + pkgs: ["ffmpeg"], + }); + + context.addLayer({ + id: "apt-get", + image: { + pkgs: ["ffmpeg"], + }, + }); + }, + }, + ], + }, +}); +``` + +We'll be expanding the documentation on how to create custom extensions in the future, but for now you are encouraged to look at the existing extensions in the `@trigger.dev/build` package for inspiration, which you can see in our repo [here](https://github.com/triggerdotdev/trigger.dev/tree/main/packages/build/src/extensions) diff --git a/docs/config/extensions/custom.mdx b/docs/config/extensions/custom.mdx new file mode 100644 index 000000000..e69de29bb diff --git a/docs/config/extensions/esbuild-plugins.mdx b/docs/config/extensions/esbuild-plugins.mdx new file mode 100644 index 000000000..e69de29bb diff --git a/docs/config/extensions/overview.mdx b/docs/config/extensions/overview.mdx new file mode 100644 index 000000000..4d5e406a5 --- /dev/null +++ b/docs/config/extensions/overview.mdx @@ -0,0 +1,5 @@ +--- +title: "Overview" +sidebarTitle: "Overview" +description: "This file is used to configure your project and how it's bundled." +--- diff --git a/docs/config/extensions/prisma.mdx b/docs/config/extensions/prisma.mdx new file mode 100644 index 000000000..79f7cf952 --- /dev/null +++ b/docs/config/extensions/prisma.mdx @@ -0,0 +1,5 @@ +--- +title: "Prisma" +sidebarTitle: "Prisma" +description: "This file is used to configure your project and how it's bundled." +--- diff --git a/docs/deploy-environment-variables.mdx b/docs/deploy-environment-variables.mdx index 9b18d5058..d9d510bd8 100644 --- a/docs/deploy-environment-variables.mdx +++ b/docs/deploy-environment-variables.mdx @@ -74,8 +74,8 @@ You can use our SDK to get and manipulate environment variables. You can also ea We have a complete set of SDK functions (and REST API) you can use to directly manipulate environment variables. -| Function | Description | -| ----------------------------------------------------- | ----------------------------------------------------------- | +| Function | Description | +| -------------------------------------------------- | ----------------------------------------------------------- | | [envvars.list()](/management/envvars/list) | List all environment variables | | [envvars.upload()](/management/envvars/import) | Upload multiple env vars. You can override existing values. | | [envvars.create()](/management/envvars/create) | Create a new environment variable | @@ -85,93 +85,91 @@ We have a complete set of SDK functions (and REST API) you can use to directly m ### Sync env vars from another service -You could use the SDK functions above but it's much easier to use our `resolveEnvVars` function in your `trigger.config` file. +You could use the SDK functions above but it's much easier to use our `syncEnvVars` build extension in your `trigger.config` file. + + + To use the `syncEnvVars` build extension, you should first install the `@trigger.dev/build` + package into your devDependencies. + In this example we're using env vars from [Infisical](https://infisical.com). -```ts /trigger.config.ts -import type { TriggerConfig, ResolveEnvironmentVariablesFunction } from "@trigger.dev/sdk/v3"; +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { syncEnvVars } from "@trigger.dev/build/extensions/core"; +import { InfisicalClient } from "@infisical/sdk"; -//This runs when you run the deploy command or the dev command -export const resolveEnvVars: ResolveEnvironmentVariablesFunction = async ({ - //the project ref (starting with "proj_") - projectRef, - //any existing env vars from a .env file or Trigger.dev - env, - //"dev", "staging", or "prod" - environment, -}) => { - //the existing environment variables from Trigger.dev (or your local .env file) - if (env.INFISICAL_CLIENT_ID === undefined || env.INFISICAL_CLIENT_SECRET === undefined) { - //returning undefined won't modify the existing env vars - return; - } +export default defineConfig({ + build: { + extensions: [ + syncEnvVars(async (ctx) => { + const client = new InfisicalClient({ + clientId: process.env.INFISICAL_CLIENT_ID, + clientSecret: process.env.INFISICAL_CLIENT_SECRET, + }); - const client = new InfisicalClient({ - clientId: env.INFISICAL_CLIENT_ID, - clientSecret: env.INFISICAL_CLIENT_SECRET, - }); + const secrets = await client.listSecrets({ + environment: ctx.environment, + projectId: process.env.INFISICAL_PROJECT_ID!, + }); - const secrets = await client.listSecrets({ - environment, - projectId: env.INFISICAL_PROJECT_ID!, - }); - - return { - variables: secrets.map((secret) => ({ - name: secret.secretKey, - value: secret.secretValue, - })), - // this defaults to true - // override: true, - }; -}; - -//the rest of your config file -export const config: TriggerConfig = { - project: "proj_1234567890", - //etc -}; + return secrets.map((secret) => ({ + name: secret.secretKey, + value: secret.secretValue, + })); + }), + ], + }, +}); ``` -#### Local development - -When you [develop locally](/cli-dev) `resolveEnvVars()` will inject the env vars from [Infisical](https://infisical.com) into your local `process.env`. - #### Deploy When you run the [CLI deploy command](/cli-deploy) directly or using [GitHub Actions](/github-actions) it will sync the environment variables from [Infisical](https://infisical.com) to Trigger.dev. This means they'll appear on the Environment Variables page so you can confirm that it's worked. This means that you need to redeploy your Trigger.dev tasks if you change the environment variables in [Infisical](https://infisical.com). -### The variables return type + + The `process.env.INFISICAL_CLIENT_ID`, `process.env.INFISICAL_CLIENT_SECRET` and + `process.env.INFISICAL_PROJECT_ID` will need to be supplied to the `deploy` CLI command. You can + do this via the `--env-file .env` flag or by setting them as environment variables in your + terminal. + -You can return `variables` as an object with string keys and values, or an array of names + values. +#### Dev + +`syncEnvVars` does not have any effect when running the `dev` command locally. If you want to inject environment variables from another service into your local environment you can do so via a `.env` file or just supplying them as environment variables in your terminal. Most services will have a CLI tool that allows you to run a command with environment variables set: + +```sh +infisical run -- npx trigger.dev@latest dev +``` + +Any environment variables set in the CLI command will be available to your local Trigger.dev tasks. + +### The syncEnvVars callback return type + +You can return env vars as an object with string keys and values, or an array of names + values. ```ts return { - variables: { - MY_ENV_VAR: "my value", - MY_OTHER_ENV_VAR: "my other value", - }, + MY_ENV_VAR: "my value", + MY_OTHER_ENV_VAR: "my other value", }; ``` or ```ts -return { - variables: [ - { - name: "MY_ENV_VAR", - value: "my value", - }, - { - name: "MY_OTHER_ENV_VAR", - value: "my other value", - }, - ], -}; +return [ + { + name: "MY_ENV_VAR", + value: "my value", + }, + { + name: "MY_OTHER_ENV_VAR", + value: "my other value", + }, +]; ``` This should mean that for most secret services you won't need to convert the data into a different format. @@ -184,11 +182,11 @@ Securely pass a Google credential JSON file to your Trigger.dev task using envir - In your terminal, run the following command and copy the resulting base64 string: +In your terminal, run the following command and copy the resulting base64 string: - ``` - base64 path/to/your/service-account-file.json - ``` +``` +base64 path/to/your/service-account-file.json +``` @@ -207,13 +205,15 @@ GOOGLE_CREDENTIALS_BASE64="" Add the following code to your Trigger.dev task: ```ts -import { google } from 'googleapis'; +import { google } from "googleapis"; -const credentials = JSON.parse(Buffer.from(process.env.GOOGLE_CREDENTIALS_BASE64, 'base64').toString('utf8')); +const credentials = JSON.parse( + Buffer.from(process.env.GOOGLE_CREDENTIALS_BASE64, "base64").toString("utf8") +); const auth = new google.auth.GoogleAuth({ credentials, - scopes: ['https://www.googleapis.com/auth/cloud-platform'], + scopes: ["https://www.googleapis.com/auth/cloud-platform"], }); const client = await auth.getClient(); @@ -227,4 +227,4 @@ You can now use the `client` object to make authenticated requests to Google API - \ No newline at end of file + diff --git a/docs/github-actions.mdx b/docs/github-actions.mdx index 1a9206ea3..385459d34 100644 --- a/docs/github-actions.mdx +++ b/docs/github-actions.mdx @@ -41,7 +41,7 @@ jobs: env: TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }} run: | - npx trigger.dev@beta deploy + npx trigger.dev@latest deploy ``` ```yaml .github/workflows/release-trigger-staging.yml @@ -70,7 +70,7 @@ jobs: env: TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }} run: | - npx trigger.dev@beta deploy --env staging + npx trigger.dev@latest deploy --env staging ``` @@ -81,29 +81,36 @@ If you already have a GitHub action file, you can just add the final step "🚀 -Go to your profile page and click on the ["Personal Access Tokens"](https://cloud.trigger.dev/account/tokens) tab. + + Go to your profile page and click on the ["Personal Access + Tokens"](https://cloud.trigger.dev/account/tokens) tab. + -Click on 'Settings' -> 'Secrets and variables' -> 'Actions' -> 'New repository secret' + + Click on 'Settings' -> 'Secrets and variables' -> 'Actions' -> 'New repository secret' + -Add the name `TRIGGER_ACCESS_TOKEN` and the value of your access token. ![Add TRIGGER_ACCESS_TOKEN in GitHub](/images/github-access-token.png) + + Add the name `TRIGGER_ACCESS_TOKEN` and the value of your access token. ![Add TRIGGER_ACCESS_TOKEN + in GitHub](/images/github-access-token.png) + - - ## Version pinning -The CLI and `@trigger.dev/*` package versions need to be in sync, otherwise there will be errors and unpredictable behavior. Hence, the `deploy` command will automatically fail during CI on any version mismatches. +The CLI and `@trigger.dev/*` package versions need to be in sync with the `trigger.dev` CLI, otherwise there will be errors and unpredictable behavior. Hence, the `deploy` command will automatically fail during CI on any version mismatches. Tip: add the deploy command to your `package.json` file to keep versions managed in the same place. For example: ```json { "scripts": { - "deploy:trigger-prod": "npx trigger.dev@3.0.0-beta.34 deploy", - "deploy:trigger": "npx trigger.dev@3.0.0-beta.34 deploy --env staging" + "deploy:trigger-prod": "npx trigger.dev@3.0.0 deploy", + "deploy:trigger": "npx trigger.dev@3.0.0 deploy --env staging" } } ``` + Your workflow file will follow the version specified in the `package.json` script, like so: ```yaml .github/workflows/release-trigger.yml diff --git a/docs/guides/bun.mdx b/docs/guides/bun.mdx new file mode 100644 index 000000000..8efea3f4d --- /dev/null +++ b/docs/guides/bun.mdx @@ -0,0 +1,113 @@ +--- +title: "Bun guide" +sidebarTitle: "Bun" +description: "This guide will show you how to setup Trigger.dev with Bun" +icon: "js" +--- + +import Prerequisites from "/snippets/framework-prerequisites.mdx"; +import CliRunTestStep from "/snippets/step-run-test.mdx"; +import CliViewRunStep from "/snippets/step-view-run.mdx"; + +We now have experimental support for Bun. This guide will show you have to setup Trigger.dev in your existing Bun project, test an example task, and view the run. + + + The trigger.dev CLI does not yet support Bun. So you will need to run the CLI using Node.js. But + Bun will still be used to execute your tasks, even in the `dev` environment. + + + + +## Initial setup + + + + +The easiest way to get started is to use the CLI. It will add Trigger.dev to your existing project, create a `/trigger` folder and give you an example task. + +Run this command in the root of your project to get started: + + + +```bash npm +npx trigger.dev@latest init --runtime bun +``` + +```bash pnpm +pnpm dlx trigger.dev@latest init --runtime bun +``` + +```bash yarn +yarn dlx trigger.dev@latest init --runtime bun +``` + + + +It will do a few things: + +1. Log you into the CLI if you're not already logged in. +2. Create a `trigger.config.ts` file in the root of your project. +3. Ask where you'd like to create the `/trigger` directory. +4. Create the `/src/trigger` directory with an example task, `/src/trigger/example.[ts/js]`. + +Install the "Hello World" example task when prompted. We'll use this task to test the setup. + + + + + + Open the `/src/trigger/example.ts` file and replace the contents with the following: + + ```ts example.ts + import { Database } from "bun:sqlite"; + import { task } from "@trigger.dev/sdk/v3"; + + export const bunTask = task({ + id: "bun-task", + run: async (payload: { query: string }) => { + const db = new Database(":memory:"); + const query = db.query("select 'Hello world' as message;"); + console.log(query.get()); // => { message: "Hello world" } + + return { + message: "Query executed", + }; + }, + }); + + ``` + + + + + +The CLI `dev` command runs a server for your tasks. It watches for changes in your `/trigger` directory and communicates with the Trigger.dev platform to register your tasks, perform runs, and send data back and forth. + +It can also update your `@trigger.dev/*` packages to prevent version mismatches and failed deploys. You will always be prompted first. + + + +```bash npm +npx trigger.dev@latest dev +``` + +```bash pnpm +pnpm dlx trigger.dev@latest dev +``` + +```bash yarn +yarn dlx trigger.dev@latest dev +``` + + + + + + + + + + +## Known issues + +- Certain OpenTelemetry instrumentation will not work with Bun, because Bun does not support Node's `register` hook. This means that some libraries that rely on this hook will not work with Bun. diff --git a/docs/guides/frameworks/nextjs.mdx b/docs/guides/frameworks/nextjs.mdx index 7dea49af0..50c96fbce 100644 --- a/docs/guides/frameworks/nextjs.mdx +++ b/docs/guides/frameworks/nextjs.mdx @@ -5,16 +5,16 @@ description: "This guide will show you how to setup Trigger.dev in your existing icon: "N" --- -import Prerequisites from '/snippets/framework-prerequisites.mdx'; -import CliInitStep from '/snippets/step-cli-init.mdx'; -import CliDevStep from '/snippets/step-cli-dev.mdx'; -import CliRunTestStep from '/snippets/step-run-test.mdx'; -import CliViewRunStep from '/snippets/step-view-run.mdx'; -import UsefulNextSteps from '/snippets/useful-next-steps.mdx'; -import TriggerTaskNextjs from '/snippets/trigger-tasks-nextjs.mdx'; -import NextjsTroubleshootingMissingApiKey from '/snippets/nextjs-missing-api-key.mdx'; -import NextjsTroubleshootingButtonSyntax from '/snippets/nextjs-button-syntax.mdx'; -import WorkerFailedToStartWhenRunningDevCommand from '/snippets/worker-failed-to-start.mdx'; +import Prerequisites from "/snippets/framework-prerequisites.mdx"; +import CliInitStep from "/snippets/step-cli-init.mdx"; +import CliDevStep from "/snippets/step-cli-dev.mdx"; +import CliRunTestStep from "/snippets/step-run-test.mdx"; +import CliViewRunStep from "/snippets/step-view-run.mdx"; +import UsefulNextSteps from "/snippets/useful-next-steps.mdx"; +import TriggerTaskNextjs from "/snippets/trigger-tasks-nextjs.mdx"; +import NextjsTroubleshootingMissingApiKey from "/snippets/nextjs-missing-api-key.mdx"; +import NextjsTroubleshootingButtonSyntax from "/snippets/nextjs-button-syntax.mdx"; +import WorkerFailedToStartWhenRunningDevCommand from "/snippets/worker-failed-to-start.mdx"; This guide can be followed for both App and Pages router as well as Server Actions. @@ -91,11 +91,11 @@ Here are the steps to trigger your task in the Next.js App and Pages router and - + Create an `actions.ts` file in the `app/api` directory and add this code which imports your `helloWorldTask()` task. Make sure to include `"use server";` at the top of the file. - + ```ts app/api/actions.ts "use server"; @@ -120,7 +120,7 @@ Here are the steps to trigger your task in the Next.js App and Pages router and ``` - + For the purposes of this guide, we'll create a button with an `onClick` event that triggers your task. We'll add this to the `page.tsx` file so we can trigger the task by clicking the button. Make sure to import your task and include `"use client";` at the top of your file. @@ -166,31 +166,31 @@ Here are the steps to trigger your task in the Next.js App and Pages router and - Open your app in a browser, making sure the port number is the same as the one you're running your Next.js app on. For example, if you're running your Next.js app on port 3000, visit: + Open your app in a browser, making sure the port number is the same as the one you're running your Next.js app on. For example, if you're running your Next.js app on port 3000, visit: ```bash http://localhost:3000 ``` - + Run the dev server from Step 2. of the [Initial Setup](/guides/frameworks/nextjs#initial-setup) section above if it's not already running: - + ```bash npm - npx trigger.dev@beta dev + npx trigger.dev@latest dev ``` ```bash pnpm - pnpm dlx trigger.dev@beta dev + pnpm dlx trigger.dev@latest dev ``` ```bash yarn - yarn dlx trigger.dev@beta dev + yarn dlx trigger.dev@latest dev ``` - - Then click the button we created in your app to trigger the task. You should see the CLI log the task run with a link to view the logs. + + Then click the button we created in your app to trigger the task. You should see the CLI log the task run with a link to view the logs. ![Trigger.dev CLI showing a successful run](/images/trigger-cli-run-success.png) @@ -225,7 +225,7 @@ Here are the steps to trigger your task in the Next.js App and Pages router and "James" ); - res.status(200).json(handle); + res.status(200).json(handle); } ``` @@ -261,15 +261,15 @@ For this guide, we'll manually deploy your task by running the [CLI deploy comma ```bash npm -npx trigger.dev@beta deploy +npx trigger.dev@latest deploy ``` ```bash pnpm -pnpm dlx trigger.dev@beta deploy +pnpm dlx trigger.dev@latest deploy ``` ```bash yarn -yarn dlx trigger.dev@beta deploy +yarn dlx trigger.dev@latest deploy ``` diff --git a/docs/guides/frameworks/nodejs.mdx b/docs/guides/frameworks/nodejs.mdx index 504c80127..0924368d0 100644 --- a/docs/guides/frameworks/nodejs.mdx +++ b/docs/guides/frameworks/nodejs.mdx @@ -2,25 +2,25 @@ title: "Node.js setup guide" sidebarTitle: "Node.js" description: "This guide will show you how to setup Trigger.dev in your existing Node.js project, test an example task, and view the run." -icon: "JS" +icon: "node-js" --- -import Prerequisites from '/snippets/framework-prerequisites.mdx'; -import CliInitStep from '/snippets/step-cli-init.mdx'; -import CliDevStep from '/snippets/step-cli-dev.mdx'; -import CliRunTestStep from '/snippets/step-run-test.mdx'; -import CliViewRunStep from '/snippets/step-view-run.mdx'; -import UsefulNextSteps from '/snippets/useful-next-steps.mdx'; +import Prerequisites from "/snippets/framework-prerequisites.mdx"; +import CliInitStep from "/snippets/step-cli-init.mdx"; +import CliDevStep from "/snippets/step-cli-dev.mdx"; +import CliRunTestStep from "/snippets/step-run-test.mdx"; +import CliViewRunStep from "/snippets/step-view-run.mdx"; +import UsefulNextSteps from "/snippets/useful-next-steps.mdx"; ## Initial setup - - - - + + + + diff --git a/docs/guides/frameworks/supabase-edge-functions-basic.mdx b/docs/guides/frameworks/supabase-edge-functions-basic.mdx index b3b264d54..86e6489be 100644 --- a/docs/guides/frameworks/supabase-edge-functions-basic.mdx +++ b/docs/guides/frameworks/supabase-edge-functions-basic.mdx @@ -62,8 +62,8 @@ Replace the placeholder code in your `edge-function-trigger/index.ts` file with ```ts functions/edge-function-trigger/index.ts // Setup type definitions for built-in Supabase Runtime APIs import "jsr:@supabase/functions-js/edge-runtime.d.ts"; -// Import the Trigger.dev SDK - replace "" with the version of the SDK you are using, e.g. "3.0.0-beta.55". You can find this in your package.json file. -import { tasks } from "npm:@trigger.dev/sdk@/v3"; +// Import the Trigger.dev SDK - replace "" with the version of the SDK you are using, e.g. "3.0.0". You can find this in your package.json file. +import { tasks } from "npm:@trigger.dev/sdk@3.0.0/v3"; // Import your task type from your /trigger folder import type { helloWorldTask } from "../../../src/trigger/example.ts"; // 👆 **type-only** import @@ -139,15 +139,15 @@ Next, deploy your `hello-world` task to [Trigger.dev cloud](https://cloud.trigge ```bash npm -npx trigger.dev@beta deploy +npx trigger.dev@latest deploy ``` ```bash pnpm -pnpm dlx trigger.dev@beta deploy +pnpm dlx trigger.dev@latest deploy ``` ```bash yarn -yarn dlx trigger.dev@beta deploy +yarn dlx trigger.dev@latest deploy ``` diff --git a/docs/guides/frameworks/supabase-edge-functions-database-webhooks.mdx b/docs/guides/frameworks/supabase-edge-functions-database-webhooks.mdx index 4780966c3..9ca50a50e 100644 --- a/docs/guides/frameworks/supabase-edge-functions-database-webhooks.mdx +++ b/docs/guides/frameworks/supabase-edge-functions-database-webhooks.mdx @@ -73,8 +73,8 @@ Replace the `database-webhook` placeholder code with the following code: ```ts functions/database-webhook/index.ts import "jsr:@supabase/functions-js/edge-runtime.d.ts"; -// Import the Trigger.dev SDK - replace "" with the version of the SDK you are using, e.g. "3.0.0-beta.55". You can find this in your package.json file. -import { tasks } from "npm:@trigger.dev/sdk@/v3"; +// Import the Trigger.dev SDK - replace "" with the version of the SDK you are using, e.g. "3.0.0". You can find this in your package.json file. +import { tasks } from "npm:@trigger.dev/sdk@3.0.0/v3"; // Import your task type from your /trigger folder import type { helloWorldTask } from "../../../src/trigger/example.ts"; // 👆 **type-only** import @@ -190,15 +190,15 @@ To do this, run the following command in the terminal: ```bash npm -npx trigger.dev@beta deploy +npx trigger.dev@latest deploy ``` ```bash pnpm -pnpm dlx trigger.dev@beta deploy +pnpm dlx trigger.dev@latest deploy ``` ```bash yarn -yarn dlx trigger.dev@beta deploy +yarn dlx trigger.dev@latest deploy ``` diff --git a/docs/guides/new-build-system-preview.mdx b/docs/guides/new-build-system-preview.mdx index e78586384..984092cd2 100644 --- a/docs/guides/new-build-system-preview.mdx +++ b/docs/guides/new-build-system-preview.mdx @@ -25,7 +25,7 @@ You will also need to update your usage of the `trigger.dev` CLI to use the prev ```sh # old way -npx trigger.dev@beta dev +npx trigger.dev@latest dev # using the preview release npx trigger.dev@0.0.0-prerelease-20240911144933 dev diff --git a/docs/guides/use-cases/upgrading-from-v2.mdx b/docs/guides/use-cases/upgrading-from-v2.mdx index e0f4fccc1..f10a44f5f 100644 --- a/docs/guides/use-cases/upgrading-from-v2.mdx +++ b/docs/guides/use-cases/upgrading-from-v2.mdx @@ -170,7 +170,7 @@ async function yourBackendFunction() { 1. Make sure to upgrade all of your trigger.dev packages to v3 first. ```bash -npx @trigger.dev/cli@beta update --to beta +npx @trigger.dev/cli@latest update --to 3.0.0 ``` 2. Follow the [v3 quick start](/quick-start) to get started with v3. Our new CLI will take care of the rest. diff --git a/docs/how-it-works.mdx b/docs/how-it-works.mdx new file mode 100644 index 000000000..4f9369377 --- /dev/null +++ b/docs/how-it-works.mdx @@ -0,0 +1,452 @@ +--- +title: "How it works" +sidebarTitle: "How it works" +description: "Understand how Trigger.dev works and how it can help you." +--- + +## Introduction + +Trigger.dev v3 allows you to integrate long-running async tasks into your application and run them in the background. This allows you to offload tasks that take a long time to complete, such as sending multi-day email campaigns, processing videos, or running long chains of AI tasks. + +For example, the below task processes a video with `ffmpeg` and sends the results to an s3 bucket, then updates a database with the results and sends an email to the user. + +```ts /trigger/video.ts +import { logger, task } from "@trigger.dev/sdk/v3"; +import { updateVideoUrl } from "../db.js"; +import ffmpeg from "fluent-ffmpeg"; +import { Readable } from "node:stream"; +import type { ReadableStream } from "node:stream/web"; +import * as fs from "node:fs/promises"; +import * as path from "node:path"; +import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; +import { sendEmail } from "../email.js"; +import { getVideo } from "../db.js"; + +// Initialize S3 client +const s3Client = new S3Client({ + region: process.env.AWS_REGION, +}); + +export const convertVideo = task({ + id: "convert-video", + retry: { + maxAttempts: 5, + minTimeoutInMs: 1000, + maxTimeoutInMs: 10000, + factor: 2, + }, + run: async ({ videoId }: { videoId: string }) => { + const { url, userId } = await getVideo(videoId); + + const outputPath = path.join("/tmp", `output_${videoId}.mp4`); + + const response = await fetch(url); + + await new Promise((resolve, reject) => { + ffmpeg(Readable.fromWeb(response.body as ReadableStream)) + .videoFilters("scale=iw/2:ih/2") + .output(outputPath) + .on("end", resolve) + .on("error", reject) + .run(); + }); + + const processedContent = await fs.readFile(outputPath); + + // Upload to S3 + const s3Key = `processed-videos/output_${videoId}.mp4`; + + const uploadParams = { + Bucket: process.env.S3_BUCKET, + Key: s3Key, + Body: processedContent, + }; + + await s3Client.send(new PutObjectCommand(uploadParams)); + const s3Url = `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${s3Key}`; + + logger.info("Video converted", { videoId, s3Url }); + + // Update database + await updateVideoUrl(videoId, s3Url); + + await sendEmail( + userId, + "Video Processing Complete", + `Your video has been processed and is available at: ${s3Url}` + ); + + return { success: true, s3Url }; + }, +}); +``` + +Now in your application, you can trigger this task by calling: + +```ts +import { NextResponse } from "next/server"; +import { tasks } from "@trigger.dev/sdk/v3"; +import type { convertVideo } from "./trigger/video"; +// 👆 **type-only** import + +export async function POST(request: Request) { + const body = await request.json(); + + // Trigger the task, this will return before the task is completed + const handle = await tasks.trigger("convert-video", body); + + return NextResponse.json(handle); +} +``` + +This will schedule the task to run in the background and return a handle that you can use to check the status of the task. This allows your backend application to respond quickly to the user and offload the long-running task to Trigger.dev. + +## The CLI + +Trigger.dev comes with a CLI that allows you to initialize Trigger.dev into your project, deploy your tasks, and run your tasks locally. You can run it via `npx` like so: + +```sh +npx trigger.dev@latest login # Log in to your Trigger.dev account +npx trigger.dev@latest init # Initialize Trigger.dev in your project +npx trigger.dev@latest dev # Run your tasks locally +npx trigger.dev@latest deploy # Deploy your tasks to the Trigger.dev instance +``` + +All these commands work with the Trigger.dev cloud and/or your self-hosted instance. It supports multiple profiles so you can easily switch between different accounts or instances. + +```sh +npx trigger.dev@latest login --profile -a https://trigger.example.com # Log in to a specific profile into a self-hosted instance +npx trigger.dev@latest dev --profile # Initialize Trigger.dev in your project +npx trigger.dev@latest deploy --profile # Deploy your tasks to the Trigger.dev instance +``` + +## Trigger.dev architecture + +Trigger.dev implements a serverless architecture (without timeouts!) that allows you to run your tasks in a scalable and reliable way. When you run `npx trigger.dev@latest deploy`, we build and deploy your task code to your Trigger.dev instance. Then, when you trigger a task from your application, it's run in a secure, isolated environment with the resources you need to complete the task. A simplified diagram for a task execution looks like this: + +```mermaid +sequenceDiagram + participant App + participant Trigger.dev + participant Task Worker + + App->>Trigger.dev: Trigger task + Trigger.dev-->>App: Task handle + Trigger.dev->>Task Worker: Run task + Task Worker-->>Trigger.dev: Task completed +``` + +In reality there are many more components involved, such as the task queue, the task scheduler, and the task worker pool, logging (etc.), but this diagram gives you a high-level overview of how Trigger.dev works. + +## The Checkpoint-Resume System + +Trigger.dev implements a powerful Checkpoint-Resume System that enables efficient execution of long-running background tasks in a serverless-like environment. This system allows tasks to pause, checkpoint their state, and resume seamlessly, optimizing resource usage and enabling complex workflows. + +Here's how the Checkpoint-Resume System works: + +1. **Task Execution**: When a task is triggered, it runs in an isolated environment with all necessary resources. + +2. **Subtask Handling**: If a task needs to trigger a subtask, it can do so and wait for its completion using `triggerAndWait` + +3. **State Checkpointing**: While waiting for a subtask or during a programmed pause (e.g., `wait.for({ seconds: 30 })`), the system uses CRIU (Checkpoint/Restore In Userspace) to create a checkpoint of the task's entire state, including memory, CPU registers, and open file descriptors. + +4. **Resource Release**: After checkpointing, the parent task's resources are released, freeing up the execution environment. + +5. **Efficient Storage**: The checkpoint is efficiently compressed and stored on disk, ready to be restored when needed. + +6. **Event-Driven Resumption**: When a subtask completes or a wait period ends, Trigger.dev's event system triggers the restoration process. + +7. **State Restoration**: The checkpoint is loaded back into a new execution environment, restoring the task to its exact state before suspension. + +8. **Seamless Continuation**: The task resumes execution from where it left off, with any subtask results or updated state seamlessly integrated. + +This approach allows Trigger.dev to manage resources efficiently, handle complex task dependencies, and provide a virtually limitless execution time for your tasks, all while maintaining the simplicity and scalability of a serverless architecture. + +Example of a parent and child task using the Checkpoint-Resume System: + +```ts +import { task, wait } from "@trigger.dev/sdk/v3"; + +const parentTask = task({ + id: "parent-task", + run: async () => { + console.log("Starting parent task"); + + // This will cause the parent task to be checkpointed and suspended + const result = await childTask.triggerAndWait({ data: "some data" }); + + console.log("Child task result:", result); + + // This will also cause the task to be checkpointed and suspended + await wait.for({ seconds: 30 }); + + console.log("Resumed after 30 seconds"); + + return "Parent task completed"; + }, +}); + +const childTask = task({ + id: "child-task", + run: async (payload: { data: string }) => { + console.log("Starting child task with data:", payload.data); + + // Simulate some work + await sleep(5); + + return "Child task result"; + }, +}); +``` + +The diagram below illustrates the flow of the parent and child tasks using the Checkpoint-Resume System: + +```mermaid +sequenceDiagram + participant App + participant Trigger.dev + participant Parent Task + participant Child Task + participant CR System + participant Storage + + App->>Trigger.dev: Trigger parent task + Trigger.dev->>Parent Task: Start execution + Parent Task->>Child Task: Trigger child task + Parent Task->>CR System: Request snapshot + CR System->>Storage: Store snapshot + CR System-->>Parent Task: Confirm snapshot stored + Parent Task->>Trigger.dev: Release resources + + Child Task->>Trigger.dev: Complete execution + Trigger.dev->>CR System: Request parent task restoration + CR System->>Storage: Retrieve snapshot + CR System->>Parent Task: Restore state + Parent Task->>Trigger.dev: Resume execution + Parent Task->>Trigger.dev: Complete execution +``` + + + This is why, in the Trigger.dev Cloud, we don't charge for the time waiting for subtasks or the + time spent in a paused state. + + +## Durable execution + +Trigger.dev's Checkpoint-Resume System, combined with idempotency keys, enables durable execution of complex workflows. This approach allows for efficient retries and caching of results, ensuring that work is not unnecessarily repeated in case of failures. + +### How it works + +1. **Task breakdown**: Complex workflows are broken down into smaller, independent subtasks. +2. **Idempotency keys**: Each subtask is assigned a unique idempotency key. +3. **Result caching**: The output of each subtask is cached based on its idempotency key. +4. **Intelligent retries**: If a failure occurs, only the failed subtask and subsequent tasks are retried. + +### Example: Video processing workflow + +Let's rewrite the `convert-video` task above to be more durable: + + + +```ts /trigger/video.ts +import { idempotencyKeys, logger, task } from "@trigger.dev/sdk/v3"; +import { processVideo, sendUserEmail, uploadToS3 } from "./tasks.js"; +import { updateVideoUrl } from "../db.js"; + +export const convertVideo = task({ + id: "convert-video", + retry: { + maxAttempts: 5, + minTimeoutInMs: 1000, + maxTimeoutInMs: 10000, + factor: 2, + }, + run: async ({ videoId }: { videoId: string }) => { + // Automatically scope the idempotency key to this run, across retries + const idempotencyKey = await idempotencyKeys.create(videoId); + + // Process video + const { processedContent } = await processVideo + .triggerAndWait({ videoId }, { idempotencyKey }) + .unwrap(); // Calling unwrap will return the output of the subtask, or throw an error if the subtask failed + + // Upload to S3 + const { s3Url } = await uploadToS3 + .triggerAndWait({ processedContent, videoId }, { idempotencyKey }) + .unwrap(); + + // Update database + await updateVideoUrl(videoId, s3Url); + + // Send email, we don't need to wait for this to finish + await sendUserEmail.trigger({ videoId, s3Url }, { idempotencyKey }); + + return { success: true, s3Url }; + }, +}); +``` + +```ts /trigger/tasks.ts +import { task, logger } from "@trigger.dev/sdk/v3"; +import ffmpeg from "fluent-ffmpeg"; +import { Readable } from "node:stream"; +import type { ReadableStream } from "node:stream/web"; +import * as fs from "node:fs/promises"; +import * as path from "node:path"; +import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; +import { sendEmail } from "../email.js"; +import { getVideo } from "../db.js"; + +// Initialize S3 client +const s3Client = new S3Client({ + region: process.env.AWS_REGION, +}); + +export const processVideo = task({ + id: "process-video", + run: async ({ videoId }: { videoId: string }) => { + const { url } = await getVideo(videoId); + + const outputPath = path.join("/tmp", `output_${videoId}.mp4`); + const response = await fetch(url); + + await logger.trace("ffmpeg", async (span) => { + await new Promise((resolve, reject) => { + ffmpeg(Readable.fromWeb(response.body as ReadableStream)) + .videoFilters("scale=iw/2:ih/2") + .output(outputPath) + .on("end", resolve) + .on("error", reject) + .run(); + }); + }); + + const processedContent = await fs.readFile(outputPath); + + await fs.unlink(outputPath); + + return { processedContent: processedContent.toString("base64") }; + }, +}); + +export const uploadToS3 = task({ + id: "upload-to-s3", + run: async (payload: { processedContent: string; videoId: string }) => { + const { processedContent, videoId } = payload; + + const s3Key = `processed-videos/output_${videoId}.mp4`; + + const uploadParams = { + Bucket: process.env.S3_BUCKET, + Key: s3Key, + Body: Buffer.from(processedContent, "base64"), + }; + + await s3Client.send(new PutObjectCommand(uploadParams)); + const s3Url = `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${s3Key}`; + + return { s3Url }; + }, +}); + +export const sendUserEmail = task({ + id: "send-user-email", + run: async ({ videoId, s3Url }: { videoId: string; s3Url: string }) => { + const { userId } = await getVideo(videoId); + + return await sendEmail( + userId, + "Video Processing Complete", + `Your video has been processed and is available at: ${s3Url}` + ); + }, +}); +``` + + + +### How retries work + +Let's say the email sending fails in our video processing workflow. Here's how the retry process works: + +1. The main task throws an error and is scheduled for retry. +2. When retried, it starts from the beginning, but leverages cached results for completed subtasks. + +Here's a sequence diagram illustrating this process: + +```mermaid +sequenceDiagram + participant Main as Main Task + participant Process as Process Video + participant Upload as Upload to S3 + participant DB as Update Database + participant Email as Send Email + + Main->>Process: triggerAndWait (1st attempt) + Process-->>Main: Return result + Main->>Upload: triggerAndWait (1st attempt) + Upload-->>Main: Return result + Main->>DB: Update + Main->>Email: triggerAndWait (1st attempt) + Email--xMain: Fail + Main-->>Main: Schedule retry + + Main->>Process: triggerAndWait (2nd attempt) + Process-->>Main: Return cached result + Main->>Upload: triggerAndWait (2nd attempt) + Upload-->>Main: Return cached result + Main->>DB: Update (idempotent) + Main->>Email: triggerAndWait (2nd attempt) + Email-->>Main: Success +``` + +## The build system + +When you run `npx trigger.dev@latest deploy` or `npx trigger.dev@latest dev`, we build your task code using our build system, which is powered by [esbuild](https://esbuild.github.io/). When deploying, the code is packaged up into a Docker image and deployed to your Trigger.dev instance. When running in dev mode, the code is built and run locally on your machine. Some features of our build system include: + +- **Bundled by default**: Code + dependencies are bundled and tree-shaked by default. +- **Build extensions**: Use and write custom build extensions to transform your code or the resulting docker image. +- **ESM ouput**: We output to ESM, which allows tree-shaking and better performance. + +You can review the build output by running deploy with the `--dry-run` flag, which will output the Containerfile and the build output. + +Learn more about working with our build system in the [configuration docs](/config/config-file). + +## Dev mode + +When you run `npx trigger.dev@latest dev`, we run your task code locally on your machine. All scheduling is still done in the Trigger.dev server instance, but the task code is run locally. This allows you to develop and test your tasks locally before deploying them to the cloud, and is especially useful for debugging and testing. + +- The same build system is used in dev mode, so you can be sure that your code will run the same locally as it does in the cloud. +- Changes are automatically detected and a new version is spun up when you save your code. +- Add debuggers and breakpoints to your code and debug it locally. +- Each task is run in a separate process, so you can run multiple tasks in parallel. +- Auto-cancels tasks when you stop the dev server. + + + Trigger.dev currently does not support "offline" dev mode, where you can run tasks without an + internet connection. [Please let us know](feedback.trigger.dev) if this is a feature you + want/need. + + +## Staging and production environments + +Trigger.dev supports deploying to multiple "deployed" environments, such as staging and production. This allows you to test your tasks in a staging environment before deploying them to production. You can deploy to a new environment by running `npx trigger.dev@latest deploy --env `, where `` is the name of the environment you want to deploy to. Each environment has its own API Key, which you can use to trigger tasks in that environment. + +## OpenTelemetry + +The Trigger.dev logging and task dashboard is powered by OpenTelemetry traces and logs, which allows you to trace your tasks and auto-instrument your code. We also auto-correlate logs from subtasks and parent tasks, making it easy view the entire trace of a task execution. A single run of the video processing task above looks like this in the dashboard: + +![OpenTelemetry trace](/images/opentelemetry-trace.png) + +Because we use standard OpenTelemetry, you can instrument your code and OpenTelemetry compatible libraries to get detailed traces and logs of your tasks. The above trace instruments both Prisma and the AWS SDK: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { PrismaInstrumentation } from "@prisma/instrumentation"; +import { AwsInstrumentation } from "@opentelemetry/instrumentation-aws-sdk"; + +export default defineConfig({ + project: "", + instrumentations: [new PrismaInstrumentation(), new AwsInstrumentation()], +}); +``` diff --git a/docs/images/opentelemetry-trace.png b/docs/images/opentelemetry-trace.png new file mode 100644 index 0000000000000000000000000000000000000000..7939e05dc5c5da1ab2c653d9a6cb2d61976d4711 GIT binary patch literal 510047 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ⅆsiz1fnLX3B++MkOR_6*a*&t!Vfz$K7y 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�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 z%0A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

#Ce(VIQzjn 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 qA^ET_Make sure you use the `beta` tag when installing, as v3 is still in Developer Preview. - ```bash npm -npm i @trigger.dev/sdk@beta +npm i @trigger.dev/sdk@latest ``` ```bash pnpm -pnpm add @trigger.dev/sdk@beta +pnpm add @trigger.dev/sdk@latest ``` ```bash yarn -yarn add @trigger.dev/sdk@beta +yarn add @trigger.dev/sdk@latest ``` diff --git a/docs/mint.json b/docs/mint.json index 24083ce9f..254c934c7 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,7 +1,10 @@ { "$schema": "https://mintlify.com/schema.json", "name": "Trigger.dev", - "openapi": ["/openapi.yml", "/v3-openapi.yaml"], + "openapi": [ + "/openapi.yml", + "/v3-openapi.yaml" + ], "api": { "playground": { "mode": "simple" @@ -71,9 +74,20 @@ { "source": "/reattempting-replaying", "destination": "/replaying" + }, + { + "source": "/tasks-overview", + "destination": "/tasks/overview" + }, + { + "source": "/tasks-scheduled", + "destination": "/tasks/scheduled" + }, + { + "source": "/trigger-folder", + "destination": "/config/config-file" } ], - "anchors": [ { "name": "Guides", @@ -89,23 +103,35 @@ "navigation": [ { "group": "Getting Started", - "pages": ["introduction", "quick-start", "limits", "changelog", "roadmap"] + "pages": [ + "introduction", + "quick-start", + "how-it-works", + "upgrading-beta", + "limits" + ] }, { "group": "Fundamentals", "pages": [ - "trigger-folder", - "tasks-overview", + { + "group": "Tasks", + "pages": [ + "tasks/overview", + "tasks/scheduled" + ] + }, "triggering", "apikeys", - "tasks-regular", - "tasks-scheduled", - "trigger-config" + "config/config-file" ] }, { "group": "Development", - "pages": ["cli-dev", "run-tests"] + "pages": [ + "cli-dev", + "run-tests" + ] }, { "group": "Deployment", @@ -115,7 +141,9 @@ "github-actions", { "group": "Deployment integrations", - "pages": ["vercel-integration"] + "pages": [ + "vercel-integration" + ] } ] }, @@ -127,7 +155,13 @@ "errors-retrying", { "group": "Wait", - "pages": ["wait", "wait-for", "wait-until", "wait-for-event", "wait-for-request"] + "pages": [ + "wait", + "wait-for", + "wait-until", + "wait-for-event", + "wait-for-request" + ] }, "queue-concurrency", "versioning", @@ -145,7 +179,10 @@ "management/overview", { "group": "Tasks API", - "pages": ["management/tasks/trigger", "management/tasks/batch-trigger"] + "pages": [ + "management/tasks/trigger", + "management/tasks/batch-trigger" + ] }, { "group": "Runs API", @@ -183,7 +220,9 @@ }, { "group": "Projects API", - "pages": ["management/projects/runs"] + "pages": [ + "management/projects/runs" + ] } ] }, @@ -208,7 +247,13 @@ }, { "group": "Open source", - "pages": ["open-source-self-hosting", "open-source-contributing", "github-repo"] + "pages": [ + "open-source-self-hosting", + "open-source-contributing", + "github-repo", + "changelog", + "roadmap" + ] }, { "group": "Troubleshooting", @@ -223,12 +268,17 @@ }, { "group": "Help", - "pages": ["community", "help-slack", "help-email"] + "pages": [ + "community", + "help-slack", + "help-email" + ] }, { "group": "Frameworks", "pages": [ "guides/frameworks/nodejs", + "guides/bun", "guides/frameworks/nextjs", "guides/frameworks/remix", { @@ -244,11 +294,15 @@ }, { "group": "Dashboard", - "pages": ["guides/dashboard/creating-a-project"] + "pages": [ + "guides/dashboard/creating-a-project" + ] }, { "group": "Migrations", - "pages": ["guides/use-cases/upgrading-from-v2"] + "pages": [ + "guides/use-cases/upgrading-from-v2" + ] }, { "group": "Examples", @@ -265,4 +319,4 @@ "github": "https://github.com/triggerdotdev", "linkedin": "https://www.linkedin.com/company/triggerdotdev" } -} +} \ No newline at end of file diff --git a/docs/open-source-self-hosting.mdx b/docs/open-source-self-hosting.mdx index 342224478..2c005ac88 100644 --- a/docs/open-source-self-hosting.mdx +++ b/docs/open-source-self-hosting.mdx @@ -24,11 +24,20 @@ As self-hosted deployments tend to have unique requirements and configurations, Should the burden ever get too much, we'd be happy to see you on [Trigger.dev cloud](https://trigger.dev/pricing) where we deal with these concerns for you. -- The Docker [checkpoint command](https://docs.docker.com/reference/cli/docker/checkpoint/) is an experimental feature which may not work as expected. It won't be enabled by default. Instead, the containers will stay up and their processes frozen. They won't consume CPU but they _will_ consume RAM. -- The Docker provider does not currently enforce any resource limits. This means your tasks can consume up to the total machine CPU and RAM. Having no limits may be preferable when self-hosting, but can impact the performance of other services. -- The worker components (not the tasks!) have direct access to the Docker socket. This means they can run any Docker command. To restrict access, you may want to consider using [Docker Socket Proxy](https://github.com/Tecnativa/docker-socket-proxy). -- The task containers are running with host networking. This means there is no network isolation between them and the host machine. They will be able to access any networked service on the host. -- There is currently no support for adding multiple worker machines. This would require a more elaborate provider, or possibly a switch to Docker Swarm. This is not currently planned, but you are welcome to [contribute](https://github.com/triggerdotdev/trigger.dev/blob/main/CONTRIBUTING.md). + - The Docker [checkpoint command](https://docs.docker.com/reference/cli/docker/checkpoint/) is an + experimental feature which may not work as expected. It won't be enabled by default. Instead, the + containers will stay up and their processes frozen. They won't consume CPU but they _will_ consume + RAM. - The Docker provider does not currently enforce any resource limits. This means your tasks + can consume up to the total machine CPU and RAM. Having no limits may be preferable when + self-hosting, but can impact the performance of other services. - The worker components (not the + tasks!) have direct access to the Docker socket. This means they can run any Docker command. To + restrict access, you may want to consider using [Docker Socket + Proxy](https://github.com/Tecnativa/docker-socket-proxy). - The task containers are running with + host networking. This means there is no network isolation between them and the host machine. They + will be able to access any networked service on the host. - There is currently no support for + adding multiple worker machines. This would require a more elaborate provider, or possibly a + switch to Docker Swarm. This is not currently planned, but you are welcome to + [contribute](https://github.com/triggerdotdev/trigger.dev/blob/main/CONTRIBUTING.md). ## Requirements @@ -70,6 +79,7 @@ sudo apt-get install -y \ ### Trigger.dev setup 1. Clone the [Trigger.dev docker repository](https://github.com/triggerdotdev/docker) and checkout the v3 branch + ```bash git clone https://github.com/triggerdotdev/docker cd docker @@ -77,6 +87,7 @@ git checkout v3 ``` 2. Run the start script and follow the prompts + ```bash ./start.sh # hint: you can append -d to run in detached mode ``` @@ -163,7 +174,7 @@ docker login -u 5. You can now deploy v3 projects using the CLI with these flags: ```bash -npx trigger.dev@beta deploy --self-hosted --push +npx trigger.dev@latest deploy --self-hosted --push ``` ## Part 2: Split services @@ -201,9 +212,12 @@ scp -3 root@:docker/.env root@:docker/.env ## Checkpoint support -This requires an _experimental Docker feature_. Successfully checkpointing a task today, does not mean you will be able to restore it tomorrow. Your data may be lost. You've been warned! + + This requires an _experimental Docker feature_. Successfully checkpointing a task today, does not + mean you will be able to restore it tomorrow. Your data may be lost. You've been warned! + -Checkpointing allows you to save the state of a running container to disk and restore it later. This can be useful for +Checkpointing allows you to save the state of a running container to disk and restore it later. This can be useful for long-running tasks that need to be paused and resumed without losing state. Think fan-out and fan-in, or long waits in email campaigns. The checkpoints will be pushed to the same registry as the deployed images. Please see the [Registry setup](#registry-setup) section for more information. @@ -283,5 +297,5 @@ TRIGGER_TELEMETRY_DISABLED=1 To avoid being redirected to the Cloud login page when using the CLI, you can specify the URL of your self-hosted instance with the `-a` flag. For example: ``` -npx trigger.dev@beta login -a http://example.com -``` \ No newline at end of file +npx trigger.dev@latest login -a http://example.com +``` diff --git a/docs/snippets/cli-commands-deploy.mdx b/docs/snippets/cli-commands-deploy.mdx index 241f22fb9..90c625369 100644 --- a/docs/snippets/cli-commands-deploy.mdx +++ b/docs/snippets/cli-commands-deploy.mdx @@ -3,29 +3,30 @@ Run the command like this: ```bash npm -npx trigger.dev@beta deploy +npx trigger.dev@latest deploy ``` ```bash pnpm -pnpm dlx trigger.dev@beta deploy +pnpm dlx trigger.dev@latest deploy ``` ```bash yarn -yarn dlx trigger.dev@beta deploy +yarn dlx trigger.dev@latest deploy ``` -This will fail in CI if any version mismatches are detected. Ensure everything runs locally first using the [dev](/cli-dev) command and don't bypass the version checks! + + This will fail in CI if any version mismatches are detected. Ensure everything runs locally first + using the [dev](/cli-dev) command and don't bypass the version checks! + It performs a few steps to deploy: 1. Optionally updates packages when running locally. -2. Typechecks the code. -3. Compiles and bundles the code. -4. Checks that [environment variables](/deploy-environment-variables) are set. -5. Deploys the code to the cloud. -6. Registers the tasks as a new version in the environment (prod by default). +2. Compiles and bundles the code. +3. Deploys the code to the Trigger.dev instance. +4. Registers the tasks as a new version in the environment (prod by default). You can also setup [GitHub Actions](/github-actions) to deploy your tasks automatically. @@ -35,28 +36,33 @@ You can also setup [GitHub Actions](/github-actions) to deploy your tasks automa Defaults to `prod` but you can specify `staging`. - - Skips the pre-build typecheck step. + + The name of the config file, found where the command is run from. Defaults to `trigger.config.ts`. + + + + Load environment variables from a file. This will only hydrate the `process.env` of the CLI + process, not the tasks. + + + + Create a deployable build but don't deploy it. Prints out the build path so you can inspect it. Skip checking for `@trigger.dev` package updates. - - The platform to build the deployment image for. Defaults to `linux/amd64`. + + The project ref. Required if there is no config file. The log level to use (debug, info, log, warn, error, none). Defaults to `log`. - - The name of the config file, found where the command is run from. Defaults to `trigger.config.ts`. - - - - The project ref. Required if there is no config file. + + Turn off syncing environment variables with the Trigger.dev instance. ## Self-hosting @@ -68,17 +74,37 @@ These options are typically used when [self-hosting](/open-source-self-hosting) - Builds and loads the image using your local docker. Use the `--registry` option to specify the registry to push the image to when using `--self-hosted`, or just use `--push` to push to the default registry. + Builds and loads the image using your local docker. Use the `--registry` option to specify the + registry to push the image to when using `--self-hosted`, or just use `--push` to push to the + default registry. + + + + Loads the image into your local docker after building it. - **This option is coming soon.** The registry to push the image to when using --self-hosted. + Specify the registry to push the image to when using `--self-hosted`. - When using the --self-hosted flag, push the image to the default registry. (defaults to false when not using --registry) + When using the --self-hosted flag, push the image to the registry. - - **This option is coming soon.** Specify the tag to use when pushing the image to the registry. - \ No newline at end of file + + The namespace to use when pushing the image to the registry. For example, if pushing to Docker + Hub, the namespace is your Docker Hub username. + + +### Push to Docker Hub + +An example of deploying to Docker Hub when using a self-hosted setup: + +```bash +npx trigger.dev@latest deploy \ + --self-hosted \ + --load-image \ + --push \ + --registry docker.io \ + --namespace mydockerhubusername +``` diff --git a/docs/snippets/cli-commands-develop.mdx b/docs/snippets/cli-commands-develop.mdx index a29fddf54..720526eff 100644 --- a/docs/snippets/cli-commands-develop.mdx +++ b/docs/snippets/cli-commands-develop.mdx @@ -3,22 +3,22 @@ This runs a server on your machine that can execute Trigger.dev tasks: ```bash npm -npx trigger.dev@beta dev +npx trigger.dev@latest dev ``` ```bash pnpm -pnpm dlx trigger.dev@beta dev +pnpm dlx trigger.dev@latest dev ``` ```bash yarn -yarn dlx trigger.dev@beta dev +yarn dlx trigger.dev@latest dev ``` It will first perform an update check to prevent version mismatches, failed deploys, and other errors. You will always be prompted first. -You will see in the terminal that the server is running and listening for requests. When you run a task, you will see it in the terminal along with a link to view it in the dashboard. +You will see in the terminal that the server is running and listening for tasks. When you run a task, you will see it in the terminal along with a link to view it in the dashboard. It is worth noting that each task runs in a separate Node process. This means that if you have a long-running task, it will not block other tasks from running. @@ -32,28 +32,9 @@ It is worth noting that each task runs in a separate Node process. This means th The project ref. Required if there is no config file. - - You can use this flag to run the server in debug mode. This will allow you to attach a debugger to the server and debug your tasks. - - - -```bash npm -npx trigger.dev@beta dev --debugger -``` - -```bash pnpm -pnpm dlx trigger.dev@beta dev --debugger -``` - -```bash yarn -yarn dlx trigger.dev@beta dev --debugger -``` - - - - - - Enable OpenTelemetry debugging. + + Pass a custom path to an env file. We automatically detect `.env`, `.env.local`, + `.env.development`, and `.env.development.local` files. @@ -69,11 +50,8 @@ yarn dlx trigger.dev@beta dev --debugger - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. - - - - Opt-out of sending telemetry data. + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This + does not affect the log level of your trigger.dev tasks. Defaults to `log`. ## Standard options @@ -95,10 +73,10 @@ Then add something like this in your package.json scripts: ```json "scripts": { "dev": "concurrently --raw --kill-others npm:dev:*", - "dev:trigger": "npx trigger.dev@beta dev", + "dev:trigger": "npx trigger.dev@latest dev", // Add your framework-specific dev script here, for example: // "dev:next": "next dev", // "dev:remix": "remix dev", //... } -``` \ No newline at end of file +``` diff --git a/docs/snippets/step-cli-dev.mdx b/docs/snippets/step-cli-dev.mdx index ec62aedc6..28305706d 100644 --- a/docs/snippets/step-cli-dev.mdx +++ b/docs/snippets/step-cli-dev.mdx @@ -7,15 +7,15 @@ It can also update your `@trigger.dev/*` packages to prevent version mismatches ```bash npm -npx trigger.dev@beta dev +npx trigger.dev@latest dev ``` ```bash pnpm -pnpm dlx trigger.dev@beta dev +pnpm dlx trigger.dev@latest dev ``` ```bash yarn -yarn dlx trigger.dev@beta dev +yarn dlx trigger.dev@latest dev ``` diff --git a/docs/snippets/step-cli-init.mdx b/docs/snippets/step-cli-init.mdx index d75f2ade9..265f3d9c8 100644 --- a/docs/snippets/step-cli-init.mdx +++ b/docs/snippets/step-cli-init.mdx @@ -7,15 +7,15 @@ Run this command in the root of your project to get started: ```bash npm -npx trigger.dev@beta init +npx trigger.dev@latest init ``` ```bash pnpm -pnpm dlx trigger.dev@beta init +pnpm dlx trigger.dev@latest init ``` ```bash yarn -yarn dlx trigger.dev@beta init +yarn dlx trigger.dev@latest init ``` diff --git a/docs/snippets/trigger-tasks-nextjs.mdx b/docs/snippets/trigger-tasks-nextjs.mdx index 54fbdce84..b670b94b8 100644 --- a/docs/snippets/trigger-tasks-nextjs.mdx +++ b/docs/snippets/trigger-tasks-nextjs.mdx @@ -15,25 +15,25 @@ Run your Next.js app: ``` - + Run the dev server from Step 2. of the [Initial Setup](/guides/frameworks/nextjs#initial-setup) section above if it's not already running: - + ```bash npm - npx trigger.dev@beta dev + npx trigger.dev@latest dev ``` ```bash pnpm - pnpm dlx trigger.dev@beta dev + pnpm dlx trigger.dev@latest dev ``` ```bash yarn - yarn dlx trigger.dev@beta dev + yarn dlx trigger.dev@latest dev ``` - + Now visit the URL in your browser to trigger the task. Ensure the port number is the same as the one you're running your Next.js app on. For example, if you're running your Next.js app on port 3000, visit: ```bash @@ -44,4 +44,4 @@ Run your Next.js app: ![Trigger.dev CLI showing a successful run](/images/trigger-cli-run-success.png) - Visit the [Trigger.dev dashboard](https://cloud.trigger.dev) to see your run. \ No newline at end of file + Visit the [Trigger.dev dashboard](https://cloud.trigger.dev) to see your run. diff --git a/docs/snippets/worker-failed-to-start.mdx b/docs/snippets/worker-failed-to-start.mdx deleted file mode 100644 index 04843eb50..000000000 --- a/docs/snippets/worker-failed-to-start.mdx +++ /dev/null @@ -1,51 +0,0 @@ -### Worker failed to start when running Dev command - -An issue may occur when trying to run the development command for Trigger.dev when using certain packages like `@t3-oss/env-nextjs` or ORMs like Drizzle ORM. The error message typically indicates that there's a problem with importing ES modules in a CommonJS context. - -```bash Error message -X Error: Worker failed to start Error [ERR_REQUIRE_ESM]: require() of ES Module [...] not supported. -Instead change the require of index.js in [...] to a dynamic import() which is available in all CommonJS modules. -``` - -This issue is related to how Trigger.dev bundles code and interacts with certain ES module dependencies. - -To resolve this issue, follow these steps: - -1. In your `trigger.config.ts` file, add the problematic dependencies to the `dependenciesToBundle` array: - -```bash trigger.config.ts -export const config: TriggerConfig = { - // ... other config options - dependenciesToBundle: [ - /@t3-oss/, - "drizzle-orm", - /@neondatabase/, - // Add other problematic dependencies here - ], -}; -``` - -2. If you're using environment variables with `@t3-oss/env-nextjs`, implement a `resolveEnvVars` function in your config file: - -```bash trigger.config.ts -import { env } from "@/env"; -import type { ResolveEnvironmentVariablesFunction } from "@trigger.dev/sdk/v3"; - -export const resolveEnvVars: ResolveEnvironmentVariablesFunction = () => { - return { - variables: Object.keys(env).map((key) => ({ - name: key, - value: env[key as keyof typeof env]?.toString(), - })), - }; -}; -``` - -3. For users of packages that require WebSocket (like `@neondatabase/serverless`), you may need to set up a WebSocket polyfill if you're using Node.js versions earlier than 22. Add this to your code: - -```bash -import { neonConfig, Pool } from '@neondatabase/serverless'; -import ws from 'ws'; - -neonConfig.webSocketConstructor = ws; -``` \ No newline at end of file diff --git a/docs/tasks-overview.mdx b/docs/tasks/overview.mdx similarity index 98% rename from docs/tasks-overview.mdx rename to docs/tasks/overview.mdx index a1becca7c..37edc2323 100644 --- a/docs/tasks-overview.mdx +++ b/docs/tasks/overview.mdx @@ -1,10 +1,10 @@ --- title: "Tasks: Overview" -sidebarTitle: "Tasks" +sidebarTitle: "Overview" description: "Tasks are functions that can run for a long time and provide strong resilience to failure." --- -There are different types of tasks including [regular tasks](/tasks-regular) and [scheduled tasks](/tasks-scheduled). +There are different types of tasks including regular tasks and [scheduled tasks](/tasks/scheduled). ## Hello world task and how to trigger it diff --git a/docs/tasks-scheduled.mdx b/docs/tasks/scheduled.mdx similarity index 100% rename from docs/tasks-scheduled.mdx rename to docs/tasks/scheduled.mdx diff --git a/docs/trigger-config.mdx b/docs/trigger-config.mdx deleted file mode 100644 index 15e8cd40a..000000000 --- a/docs/trigger-config.mdx +++ /dev/null @@ -1,274 +0,0 @@ ---- -title: "The trigger.config.ts file" -sidebarTitle: "trigger.config file" -description: "This file is used to configure your project and how it's bundled." ---- - -import BundlePackages from '/snippets/bundle-packages.mdx'; - -Let's take a look at a basic `trigger.config.ts` file. This is generated for you when you follow [the quick start guide](/quick-start). This file is used to configure your project and how it's bundled. - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; - -export const config: TriggerConfig = { - //Your project ref (you can see it on the Project settings page in the dashboard) - project: "proj_gtcwttqhhtlasxgfuhxs", - retries: { - //If you want to retry a task in dev mode (when using the CLI) - enabledInDev: false, - //the default retry settings. Used if you don't specify on a task. - default: { - maxAttempts: 3, - minTimeoutInMs: 1000, - maxTimeoutInMs: 10000, - factor: 2, - randomize: true, - }, - }, - //The paths for your trigger folders - triggerDirectories: ["./trigger"], -}; -``` - -Most of the time you don't need to change anything in this file, or if you do then we will tell you when you the run the CLI command. - -## Global initialization - -You can run code before any task is run by adding a `init` function to your `trigger.config.ts` file. - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; - -export const config: TriggerConfig = { - //..other stuff - init: async (payload, { ctx }) => { - console.log("I run before any task is run"); - }, -}; -``` - -You'll have access to the run payload and the context object. Currently you cannot return anything from this function. - -## Lifecycle functions - -You can add lifecycle functions to get notified when any task starts, succeeds, or fails using `onStart`, `onSuccess` and `onFailure`: - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; - -export const config: TriggerConfig = { - //..other stuff - onSuccess: async (payload, output, { ctx }) => { - console.log("Task succeeded", ctx.task.id); - }, - onFailure: async (payload, error, { ctx }) => { - console.log("Task failed", ctx.task.id); - }, - onStart: async (payload, { ctx }) => { - console.log("Task started", ctx.task.id); - }, -}; -``` - -Read more about task lifecycle functions in the [tasks overview](/tasks-overview). - -## Instrumentations - -We use OpenTelemetry (OTEL) for our run logs. This means you get a lot of information about your tasks with no effort. But you probably want to add more information to your logs. For example, here's all the Prisma calls automatically logged: - -![The run log](/images/auto-instrumentation.png) - -Here we add Prisma and OpenAI instrumentations to your `trigger.config.ts` file. - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; -import { PrismaInstrumentation } from "@prisma/instrumentation"; -import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; - -export const config: TriggerConfig = { - //..other stuff - instrumentations: [new PrismaInstrumentation(), new OpenAIInstrumentation()], -}; -``` - -There is a [huge library of instrumentations](https://opentelemetry.io/ecosystem/registry/?language=js) you can easily add to your project like this. - -Some ones we recommend: - -| Package | Description | -| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `@opentelemetry/instrumentation-undici` | Logs all fetch calls (inc. Undici fetch) | -| `@opentelemetry/instrumentation-fs` | Logs all file system calls | -| `@opentelemetry/instrumentation-http` | Logs all HTTP calls | -| `@prisma/instrumentation` | Logs all Prisma calls, you need to [enable tracing](https://github.com/prisma/prisma/tree/main/packages/instrumentation) | -| `@traceloop/instrumentation-openai` | Logs all OpenAI calls | - -## Syncing environment variables - -You can sync environment variables from another service using the `resolveEnvVars` function. [Read the docs](/deploy-environment-variables#sync-env-vars-from-another-service) for more information. - -## ESM-only packages - -We'll let you know when running the CLI dev command if this is a problem. Some packages are ESM-only so they don't work directly from CJS when using Node.js. In that case you need to add them to the `dependenciesToBundle` array in your `trigger.config.ts` file. - - - -## Prisma (and other generators) - - - -```bash -✘ [ERROR] Error: @prisma/client did not initialize yet. Please run "prisma generate" and try to import it again. - -In case this error is unexpected for you, please report it in -https://pris.ly/prisma-prisma-bug-report -at new PrismaClient (/app/node_modules/.prisma/client/default.js:43:11) -at Object. (/lib/prisma.ts:7:33) -at Module.\_compile (node:internal/modules/cjs/loader:1356:14) -at Object.Module.\_extensions..js (node:internal/modules/cjs/loader:1414:10) -at Module.load (node:internal/modules/cjs/loader:1197:32) -at Function.Module.\_load (node:internal/modules/cjs/loader:1013:12) -at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12) -at node:internal/main/run_main_module:28:49 -``` - - - -Prisma works by generating a client from your `prisma.schema` file. This means you need to do a couple of things to get it to work with Trigger: - - - - - - - - ```json default path - { - "scripts": { - "postinstall": "prisma generate" - } - } - ``` - - ```json custom path - { - "scripts": { - "postinstall": "prisma generate --schema=./custom/path/to/schema.prisma" - } - } - ``` - - - - Anything you put in `postinstall` will be run as part of the install step. This is how Next.js recommends you set up Prisma anyway. - - - - - - ```ts trigger.config.ts - import type { TriggerConfig } from "@trigger.dev/sdk/v3"; - - export const config: TriggerConfig = { - //..other stuff - - // using the default path - additionalFiles: ["./prisma/schema.prisma"], - // or a custom path, for example in a monorepo - additionalFiles: ["../../custom/path/to/schema.prisma"], - - additionalPackages: ["prisma@5.11.0"], - }; - ``` - - This tells Trigger to bundle the Prisma client and the schema file. - - - - - -## TypeORM support - -We support using TypeORM with Trigger. You can use decorators in your entities and then use them in your tasks. Here's an example: - -```ts orm/index.ts -import "reflect-metadata"; -import { DataSource } from "typeorm"; -import { Entity, Column, PrimaryColumn } from "typeorm"; - -@Entity() -export class Photo { - @PrimaryColumn() - id!: number; - - @Column() - name!: string; - - @Column() - description!: string; - - @Column() - filename!: string; - - @Column() - views!: number; - - @Column() - isPublished!: boolean; -} - -export const AppDataSource = new DataSource({ - type: "postgres", - host: "localhost", - port: 5432, - username: "postgres", - password: "postgres", - database: "my-database", - entities: [Photo], - synchronize: true, - logging: false, -}); -``` - -And then in your trigger.config.ts file you can initialize the datasource using the `onStart` lifecycle function option: - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; -import { AppDataSource } from "@/trigger/orm"; - -export const config: TriggerConfig = { - // ... other options here - onStart: async (payload, { ctx }) => { - await AppDataSource.initialize(); - }, -}; -``` - -Now you are ready to use this in your tasks: - -```ts -import { task } from "@trigger.dev/sdk/v3"; -import { AppDataSource, Photo } from "./orm"; - -export const taskThatUsesDecorators = task({ - id: "task-that-uses-decorators", - run: async (payload: { message: string }) => { - console.log("Creating a photo..."); - - const photo = new Photo(); - photo.id = 2; - photo.name = "Me and Bears"; - photo.description = "I am near polar bears"; - photo.filename = "photo-with-bears.jpg"; - photo.views = 1; - photo.isPublished = true; - - await AppDataSource.manager.save(photo); - }, -}); -``` - -## Troubleshooting - -If you have an issue with bundling checkout our [troubleshooting guide](/troubleshooting). diff --git a/docs/trigger-folder.mdx b/docs/trigger-folder.mdx deleted file mode 100644 index 1f6fd4bd6..000000000 --- a/docs/trigger-folder.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "/trigger folders" -description: "Your tasks live inside /trigger folders. Code in these is bundled and deployed together." ---- - -## What gets bundled? - -We automatically bundle everything for your tasks. This includes: - -- Your tasks (they can be in any file inside a /trigger folder, they just need to be exported with a name). -- Imported npm packages. -- Other imports from your code. - -Mostly this means you shouldn't need to think about what gets bundled. Just write your tasks and we'll take care of the rest. If you need to alter the bundling you use the [trigger.config file](/trigger-config). - -## Multiple `/trigger` folders - -You can have multiple `/trigger` folders in your repository. - -- Each `/trigger` folder can have many tasks exported from it. -- Each file inside a `/trigger` folder can export many tasks. - -### (Optional) configuration - -It is possible to manually set one or more folders as `/trigger` folders in your [trigger.config file](/trigger-config). diff --git a/docs/triggering.mdx b/docs/triggering.mdx index 0765a5107..d69bfd5df 100644 --- a/docs/triggering.mdx +++ b/docs/triggering.mdx @@ -5,20 +5,20 @@ description: "Tasks need to be triggered in order to run." Trigger tasks **from your backend**: -| Function | This works | What it does | -| -------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `tasks.trigger()` | Anywhere | Triggers a task and gets a handle you can use to fetch and manage the run. [Read more](#tasks-trigger) | -| `tasks.batchTrigger()` | Anywhere | Triggers a task multiple times and gets a handle you can use to fetch and manage the runs. [Read more](#tasks-batchtrigger) | -| `tasks.triggerAndPoll()` | Anywhere | Triggers a task and then polls the run until it’s complete. [Read more](#tasks-triggerandpoll) | +| Function | This works | What it does | +| ------------------------ | ---------- | --------------------------------------------------------------------------------------------------------------------------- | +| `tasks.trigger()` | Anywhere | Triggers a task and gets a handle you can use to fetch and manage the run. [Read more](#tasks-trigger) | +| `tasks.batchTrigger()` | Anywhere | Triggers a task multiple times and gets a handle you can use to fetch and manage the runs. [Read more](#tasks-batchtrigger) | +| `tasks.triggerAndPoll()` | Anywhere | Triggers a task and then polls the run until it’s complete. [Read more](#tasks-triggerandpoll) | Trigger tasks **from inside a run**: -| Function | This works | What it does | -| -------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `yourTask.trigger()` | Anywhere | Triggers a task and gets a handle you can use to monitor and manage the run. It does not wait for the result. [Read more](#task-trigger) | -| `yourTask.batchTrigger()` | Anywhere | Triggers a task multiple times and gets a handle you can use to monitor and manage the runs. It does not wait for the results. [Read more](#task-batchtrigger) | -| `yourTask.triggerAndWait()` | Inside task | Triggers a task and then waits until it's complete. You get the result data to continue with. [Read more](#task-triggerandwait) | -| `yourTask.batchTriggerAndWait()` | Inside task | Triggers a task multiple times in parallel and then waits until they're all complete. You get the resulting data to continue with. [Read more](#task-batchtriggerandwait) | +| Function | This works | What it does | +| -------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `yourTask.trigger()` | Anywhere | Triggers a task and gets a handle you can use to monitor and manage the run. It does not wait for the result. [Read more](#task-trigger) | +| `yourTask.batchTrigger()` | Anywhere | Triggers a task multiple times and gets a handle you can use to monitor and manage the runs. It does not wait for the results. [Read more](#task-batchtrigger) | +| `yourTask.triggerAndWait()` | Inside task | Triggers a task and then waits until it's complete. You get the result data to continue with. [Read more](#task-triggerandwait) | +| `yourTask.batchTriggerAndWait()` | Inside task | Triggers a task multiple times in parallel and then waits until they're all complete. You get the resulting data to continue with. [Read more](#task-batchtriggerandwait) | Additionally, [scheduled tasks](/tasks-scheduled) get **automatically** triggered on their schedule and webhooks when receiving a webhook. @@ -46,7 +46,9 @@ You can use Next.js Server Actions but [you need to be careful with bundling](/g Triggers a single run of a task with the payload you pass in, and any options you specify, without needing to import the task. - By using `tasks.trigger()`, you can pass in the task type as a generic argument, giving you full type checking. Make sure you use a `type` import so that your task code is not imported into your application. + By using `tasks.trigger()`, you can pass in the task type as a generic argument, giving you full + type checking. Make sure you use a `type` import so that your task code is not imported into your + application. @@ -103,7 +105,9 @@ export async function action({ request, params }: ActionFunctionArgs) { Triggers multiples runs of a task with the payloads you pass in, and any options you specify, without needing to import the task. - By using `tasks.batchTrigger()`, you can pass in the task type as a generic argument, giving you full type checking. Make sure you use a `type` import so that your task code is not imported into your application. + By using `tasks.batchTrigger()`, you can pass in the task type as a generic argument, giving you + full type checking. Make sure you use a `type` import so that your task code is not imported into + your application. @@ -159,7 +163,9 @@ export async function action({ request, params }: ActionFunctionArgs) { Triggers a single run of a task with the payload you pass in, and any options you specify, and then polls the run until it's complete. - By using `tasks.triggerAndPoll()`, you can pass in the task type as a generic argument, giving you full type checking. Make sure you use a `type` import so that your task code is not imported into your application. + By using `tasks.triggerAndPoll()`, you can pass in the task type as a generic argument, giving you + full type checking. Make sure you use a `type` import so that your task code is not imported into + your application. @@ -313,7 +319,7 @@ export const loopTask = task({ export const parentTask = task({ id: "parent-task", run: async (payload: string) => { - const result = await batchChildTask.triggerAndWait("some-data"); + const result = await childTask.triggerAndWait("some-data"); console.log("Result", result); //...do stuff with the result @@ -321,6 +327,58 @@ export const parentTask = task({ }); ``` +The `result` object is a "Result" type that needs to be checked to see if the child task run was successful: + +```ts /trigger/parent.ts +export const parentTask = task({ + id: "parent-task", + run: async (payload: string) => { + const result = await childTask.triggerAndWait("some-data"); + + if (result.ok) { + console.log("Result", result.output); // result.output is the typed return value of the child task + } else { + console.error("Error", result.error); // result.error is the error that caused the run to fail + } + }, +}); +``` + +If instead you just want to get the output of the child task, and throw an error if the child task failed, you can use the `unwrap` method: + +```ts /trigger/parent.ts +export const parentTask = task({ + id: "parent-task", + run: async (payload: string) => { + const output = await childTask.triggerAndWait("some-data").unwrap(); + console.log("Output", output); + }, +}); +``` + +You can also catch the error if the child task fails and get more information about the error: + +```ts /trigger/parent.ts +import { task, SubtaskUnwrapError } from "@trigger.dev/sdk/v3"; +export const parentTask = task({ + id: "parent-task", + run: async (payload: string) => { + try { + const output = await childTask.triggerAndWait("some-data").unwrap(); + console.log("Output", output); + } catch (error) { + if (error instanceof SubtaskUnwrapError) { + console.error("Error in fetch-post-task", { + runId: error.runId, + taskId: error.taskId, + cause: error.cause, + }); + } + } + }, +}); +``` + This method should only be used inside a task. If you use it outside a task, it will throw an error. @@ -379,45 +437,45 @@ export const loopTask = task({ When using `batchTriggerAndWait`, you have full control over how to handle failures within the batch. The method returns an array of run results, allowing you to inspect each run's outcome individually and implement custom error handling. - Here's how you can manage run failures: +Here's how you can manage run failures: - 1. **Inspect individual run results**: Each run in the returned array has an `ok` property indicating success or failure. +1. **Inspect individual run results**: Each run in the returned array has an `ok` property indicating success or failure. - 2. **Access error information**: For failed runs, you can examine the `error` property to get details about the failure. +2. **Access error information**: For failed runs, you can examine the `error` property to get details about the failure. - 3. **Choose your failure strategy**: You have two main options: - - **Fail the entire batch**: Throw an error if any run fails, causing the parent task to reattempt. - - **Continue despite failures**: Process the results without throwing an error, allowing the parent task to continue. +3. **Choose your failure strategy**: You have two main options: - 4. **Implement custom logic**: You can create sophisticated handling based on the number of failures, types of errors, or other criteria. + - **Fail the entire batch**: Throw an error if any run fails, causing the parent task to reattempt. + - **Continue despite failures**: Process the results without throwing an error, allowing the parent task to continue. - Here's an example of how you might handle run failures: +4. **Implement custom logic**: You can create sophisticated handling based on the number of failures, types of errors, or other criteria. + +Here's an example of how you might handle run failures: ```ts /trigger/batchTriggerAndWait.ts - const result = await batchChildTask.batchTriggerAndWait([ - { payload: "item1" }, - { payload: "item2" }, - { payload: "item3" }, - ]); +const result = await batchChildTask.batchTriggerAndWait([ + { payload: "item1" }, + { payload: "item2" }, + { payload: "item3" }, +]); - // Result will contain the finished runs. - // They're only finished if they have succeeded or failed. - // "Failed" means all attempts failed +// Result will contain the finished runs. +// They're only finished if they have succeeded or failed. +// "Failed" means all attempts failed - for (const run of result.runs) { +for (const run of result.runs) { + // Check if the run succeeded + if (run.ok) { + logger.info("Batch task run succeeded", { output: run.output }); + } else { + logger.error("Batch task run error", { error: run.error }); - // Check if the run succeeded - if (run.ok) { - logger.info("Batch task run succeeded", { output: run.output }); - } else { - logger.error("Batch task run error", { error: run.error }); - - //You can choose if you want to throw an error and fail the entire run - throw new Error(`Fail the entire run because ${run.id} failed`); - } + //You can choose if you want to throw an error and fail the entire run + throw new Error(`Fail the entire run because ${run.id} failed`); } +} ``` @@ -472,7 +530,7 @@ await myTask.trigger({ some: "data" }, { delay: "2024-12-01T00:00:00" }); // Delay using a Date object await myTask.trigger({ some: "data" }, { delay: new Date(Date.now() + 1000 * 60 * 60) }); // Delay using a timezone -await myTask.trigger({ some: "data" }, { delay: new Date('2024-07-23T11:50:00+02:00') }); +await myTask.trigger({ some: "data" }, { delay: new Date("2024-07-23T11:50:00+02:00") }); ``` Runs that are delayed and have not been enqueued yet will display in the dashboard with a "Delayed" status: diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index bceaa8953..4802a68b4 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -3,10 +3,9 @@ title: "Common problems" description: "Some common problems you might experience and their solutions" --- -import NextjsTroubleshootingMissingApiKey from '/snippets/nextjs-missing-api-key.mdx'; -import NextjsTroubleshootingButtonSyntax from '/snippets/nextjs-button-syntax.mdx'; -import RateLimitHitUseBatchTrigger from '/snippets/rate-limit-hit-use-batchtrigger.mdx'; -import WorkerFailedToStartWhenRunningDevCommand from '/snippets/worker-failed-to-start.mdx'; +import NextjsTroubleshootingMissingApiKey from "/snippets/nextjs-missing-api-key.mdx"; +import NextjsTroubleshootingButtonSyntax from "/snippets/nextjs-button-syntax.mdx"; +import RateLimitHitUseBatchTrigger from "/snippets/rate-limit-hit-use-batchtrigger.mdx"; ## Development @@ -30,37 +29,20 @@ Then change the permissions of the npm folder (if 1 doesn't work): sudo chown -R $(whoami) ~/.npm ``` - ## Deployment Running the [trigger.dev deploy] command builds and deploys your code. Sometimes there can be issues building your code. You can run the deploy command with `--log-level debug` at the end. This will spit out a lot of information about the deploy. If you can't figure out the problem from the information below please join [our Discord](https://trigger.dev/discord) and create a help forum post. Do NOT share the extended debug logs publicly as they might reveal private information about your project. +You can also review the build by supplying the `--dry-run` flag. This will build your project but not deploy it. You can then inspect the build output on your machine. + Here are some common problems and their solutions: -### `Typecheck failed, aborting deployment` - -We typecheck your code before deploying. If the typecheck fails, the deployment is aborted. You should see logs with details about the typecheck failure. - -You can skip typechecking, by adding the `--skip-typecheck` flag when calling deploy. - -### `Error: Cannot find module 'X'` - -This errors occurs if we can't figure out how to automatically import some code. You can fix this by adding it to the `dependenciesToBundle` array in the [trigger.config file](/trigger-config). - - - ### `Failed to build project image: Error building image` There should be a link below the error message to the full build logs on your machine. Take a look at these to see what went wrong. Join [our Discord](https://trigger.dev/discord) and you share it privately with us if you can't figure out what's going wrong. Do NOT share these publicly as the verbose logs might reveal private information about your project. -### `Deployment timed out` - -The last stage of deployment is to run it on our servers – we register the new versions of your tasks with the dashboard during this step. We allow 3 mins for this to succeed or fail. If it fails then you'll see this error. - -The first thing to do is to try again. If that fails then join [our Discord](https://trigger.dev/discord) and create a Help forum post with a link to your deployment. - ### `Deployment encountered an error` Usually there will be some useful guidance below this message. If you can't figure out what's going wrong then join [our Discord](https://trigger.dev/discord) and create a Help forum post with a link to your deployment. @@ -68,6 +50,7 @@ Usually there will be some useful guidance below this message. If you can't figu ## Project setup issues ### `The requested module 'node:events' does not provide an export named 'addAbortListener'` + If you see this error it means you're not a supported version of Node: ``` @@ -81,10 +64,11 @@ Node.js v19.9.0 You need to be on at least these minor versions: | Version | Minimum | -| ----- | ------- | -| 18 | 18.16+ | -| 20 | 20.11+ | -| 21 | 21.0+ | +| ------- | ------- | +| 18 | 18.20+ | +| 20 | 20.5+ | +| 21 | 21.0+ | +| 22 | 22.0+ | ## Runtime issues @@ -94,7 +78,7 @@ Your code is deployed separately from the rest of your app(s) so you need to mak ### `Error: @prisma/client did not initialize yet.` -Prisma uses code generation to create the client from your schema file. This means you need to add a bit of config so we can generate this file before your tasks run: [read the guide](/trigger-config#prisma-and-other-generators). +Prisma uses code generation to create the client from your schema file. This means you need to add a bit of config so we can generate this file before your tasks run: [read the guide](/config/config-file#prisma). ### When triggering subtasks the parent task finishes too soon @@ -102,7 +86,7 @@ Make sure that you always use `await` when you call `trigger`, `triggerAndWait`, ### Rate limit exceeded - + View the [rate limits](/limits) page for more information. @@ -147,11 +131,10 @@ Or change the tsconfig jsx setting: { "compilerOptions": { //... - "jsx": "react-jsx" - }, + "jsx": "react-jsx" + } } ``` - - - + + diff --git a/docs/upgrading-beta.mdx b/docs/upgrading-beta.mdx new file mode 100644 index 000000000..65af28bd0 --- /dev/null +++ b/docs/upgrading-beta.mdx @@ -0,0 +1,431 @@ +--- +title: "Upgrade to new build system" +sidebarTitle: "Beta upgrade" +description: "How to update to 3.0.0 from the beta" +--- + +The Trigger.dev packages are now at version `3.0.x` in the `latest` tag. This is our first official release of v3 under the latest tag, and we recommend anyone still using packages in the `beta` tag to upgrade to the latest version. This guide will help you upgrade your project to the latest version of Trigger.dev. + +The major changes in this release are a new build system, which is more flexible and powerful than the previous build system. We've also made some changes to the `trigger.dev` CLI to improve the developer experience. + +The main features of the new build sytem are: + +- **Bundling by default**: All dependencies are bundled by default, so you no longer need to specify which dependencies to bundle. This solves a whole bunch of issues related to monorepos. +- **Build extensions**: A new way to extend the build process with custom logic. This is a more flexible and powerful way to extend the build process compared to the old system. (including custom esbuild plugin support) +- **Improved configuration**: We've migrated to using [c12](https://github.com/unjs/c12) to power our configuration system. +- **Improved error handling**: We now do a much better job of reporting of any errors that happen during the indexing process by loading your trigger task files dynamically. +- **Improved cold start times**: Previously, we would load all your trigger task files at once, which could lead to long cold start times. Now we load your trigger task files dynamically, which should improve cold start times. + +## Update packages + +To use the new build system, you have to update to use our latest packages. Update the `@trigger.dev/sdk` package in your package.json: + +```json +"@trigger.dev/sdk": "^3.0.0", +``` + +You will also need to update your usage of the `trigger.dev` CLI to use the latest release. If you run the CLI via `npx` you can update to the latest release like so: + +```sh +# old way +npx trigger.dev@3.0.0-beta.56 dev + +# using the latest release +npx trigger.dev@latest dev +``` + +If you've added the `trigger.dev` CLI to your `devDependencies`, then you should update the version to point to the latest release: + +```json +"trigger.dev": "^3.0.0", +``` + +Once you do that make sure you re-install your dependencies using `npm i` or the equivalent with your preferred package manager. + +If you deploy using GitHub actions, make sure you update the version there too. + +## Update your `trigger.config.ts` + +The new build system does not effect your trigger task files at all, so those can remain unchanged. However, you may need to make changes to your `trigger.config.ts` file. + +### `defineConfig` + +You should now import the `defineConfig` function from `@trigger.dev/sdk/v3` and export the config as the default export: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "", +}); +``` + +### Deprecated: `dependenciesToBundle` + +The new build system will bundle all dependencies by default, so `dependenciesToBundle` no longer makes any sense and can be removed. + +#### Externals + +Now that all dependencies are bundled, there are some situations where bundling a dependency doesn't work, and needs to be made external (e.g. when a dependency includes a native module). You can now specify these dependencies as build externals in the `defineConfig` function: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "", + build: { + external: ["native-module"], + }, +}); +``` + +`external` is an array of strings, where each string is the name of a dependency that should be made external. Glob expressions are also supported and use the [minimatch](https://github.com/isaacs/minimatch) matcher. + +### additionalFiles + +The `additionalFiles` option has been moved to our new build extension system. + +To use build extensions, you'll need to add the `@trigger.dev/build` package to your `devDependencies`: + +```sh +npm add @trigger.dev/build@latest -D +``` + +Now you can import the `additionalFiles` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { additionalFiles } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + additionalFiles({ files: ["wrangler/wrangler.toml", "./assets/**", "./fonts/**"] }), + ], + }, +}); +``` + +### additionalPackages + +The `additionalPackages` option has been moved to our new build extension system. + +To use build extensions, you'll need to add the `@trigger.dev/build` package to your `devDependencies`: + +```sh +npm add @trigger.dev/build@latest -D +``` + +Now you can import the `additionalPackages` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { additionalPackages } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + project: "", + build: { + extensions: [additionalPackages({ packages: ["wrangler"] })], + }, +}); +``` + +### resolveEnvVars + +The `resolveEnvVars` export has been moved to our new build extension system. + +To use build extensions, you'll need to add the `@trigger.dev/build` package to your `devDependencies`: + +```sh +npm add @trigger.dev/build@latest -D +``` + +Now you can import the `syncEnvVars` build extension and use it in your `trigger.config.ts` file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { syncEnvVars } from "@trigger.dev/build/extensions/core"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + syncEnvVars(async (params) => { + return { + MY_ENV_VAR: "my-value", + }; + }), + ], + }, +}); +``` + +The `syncEnvVars` callback function works very similarly to the deprecated `resolveEnvVars` handler, but now instead of returning an object with a `variables` key that contains the environment variables, you return an object with the environment variables directly (see the example above). + +One other difference is now `params.env` only contains the environment variables that are set in the Trigger.dev environment variables, and not the environment variables from the process. If you want to access the environment variables from the process, you can use `process.env`. + +See the [syncEnvVars](/deploy-environment-variables#sync-env-vars-from-another-service) documentation for more information. + +### emitDecoratorMetadata + +If you make use of decorators in your code, and have enabled the `emitDecoratorMetadata` tsconfig compiler option, you'll need to enable this in the new build sytem using the `emitDecoratorMetadata` build extension: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; + +export default defineConfig({ + project: "", + build: { + extensions: [emitDecoratorMetadata()], + }, +}); +``` + +### Prisma + +We've created a build extension to support using Prisma in your Trigger.dev tasks. To use this extension, you'll need to add the `@trigger.dev/build` package to your `devDependencies`: + +```sh +npm add @trigger.dev/build@latest -D +``` + +Then you can import the `prismaExtension` build extension and use it in your `trigger.config.ts` file, passing in the path to your Prisma schema file: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + }), + ], + }, +}); +``` + +This will make sure that your prisma client is generated during the build process when deploying to Trigger.dev. + + + This does not have any effect when running the `dev` command, so you'll need to make sure you + generate your client locally first. + + +If you want to also run migrations during the build process, you can pass in the `migrate` option: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + migrate: true, + directUrlEnvVarName: "DATABASE_URL_UNPOOLED", // optional - the name of the environment variable that contains the direct database URL if you are using a direct database URL + }), + ], + }, +}); +``` + +If you have multiple `generator` statements defined in your schema file, you can pass in the `clientGenerator` option to specify the `prisma-client-js` generator, which will prevent other generators from being generated: + + + +```prisma schema.prisma +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DATABASE_URL_UNPOOLED") +} + +// We only want to generate the prisma-client-js generator +generator client { + provider = "prisma-client-js" +} + +generator kysely { + provider = "prisma-kysely" + output = "../../src/kysely" + enumFileName = "enums.ts" + fileName = "types.ts" +} +``` + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + clientGenerator: "client", + }), + ], + }, +}); +``` + + + +### audioWaveform + +Previously, we installed [Audio Waveform](https://github.com/bbc/audiowaveform) in the build image. That's been moved to a build extension: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; + +export default defineConfig({ + project: "", + build: { + extensions: [audioWaveform()], // uses verson 1.1.0 of audiowaveform by default + }, +}); +``` + +### esbuild plugins + +You can now add esbuild plugins to customize the build process using the `esbuildPlugin` build extension. The example below shows how to automatically upload sourcemaps to Sentry using their esbuild plugin: + +```ts +import { defineConfig } from "@trigger.dev/sdk/v3"; +import { esbuildPlugin } from "@trigger.dev/build/extensions"; +import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin"; + +export default defineConfig({ + project: "", + build: { + extensions: [ + esbuildPlugin( + sentryEsbuildPlugin({ + org: process.env.SENTRY_ORG, + project: process.env.SENTRY_PROJECT, + authToken: process.env.SENTRY_AUTH_TOKEN, + }), + // optional - only runs during the deploy command, and adds the plugin to the end of the list of plugins + { placement: "last", target: "deploy" } + ), + ], + }, +}); +``` + +## Changes to the `trigger.dev` CLI + +### No more typechecking during deploy + +We no longer run typechecking during the deploy command. This was causing issues with some projects, and we found that it wasn't necessary to run typechecking during the deploy command. If you want to run typechecking before deploying to Trigger.dev, you can run the `tsc` command before running the `deploy` command. + +```sh +tsc && npx trigger.dev@latest deploy +``` + +Or if you are using GitHub actions, you can add an additional step to run the `tsc` command before deploying to Trigger.dev. + +```yaml +- name: Install dependencies + run: npm install + +- name: Typecheck + run: npx tsc + +- name: 🚀 Deploy Trigger.dev + env: + TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }} + run: | + npx trigger.dev@latest deploy +``` + +### deploy `--dry-run` + +You can now inspect the build output of your project without actually deploying it to Trigger.dev by using the `--dry-run` flag: + +```sh +npx trigger.dev@latest deploy --dry-run +``` + +This will save the build output and print the path to the build output directory. If you face any issues with deploying, please include the build output in your issue report. + +### `--env-file` + +You can now pass the path to your local `.env` file using the `--env-file` flag during `dev` and `deploy` commands: + +```sh +npx trigger.dev@latest dev --env-file ../../.env +npx trigger.dev@latest deploy --env-file ../../.env +``` + +The `.env` file works slightly differently in `dev` vs `deploy`: + +- In `dev`, the `.env` file is loaded into the CLI's `process.env` and also into the environment variables of the Trigger.dev environment. +- In `deploy`, the `.env` file is loaded into the CLI's `process.env` but not into the environment variables of the Trigger.dev environment. If you want to sync the environment variables from the `.env` file to the Trigger.dev environment variables, you can use the `syncEnvVars` build extension. + +### dev debugging in VS Code + +Debugging your tasks code in `dev` is now supported via VS Code, without having to pass in any additional flags. Create a launch configuration in `.vscode/launch.json`: + +```json launch.json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Trigger.dev: Dev", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "npx", + "runtimeArgs": ["trigger.dev@latest", "dev"], + "skipFiles": ["/**"], + "sourceMaps": true + } + ] +} +``` + +Then you can start debugging your tasks code by selecting the `Trigger.dev: Dev` configuration in the debug panel, and set breakpoints in your tasks code. + +### TRIGGER_ACCESS_TOKEN in dev + +You can now authenticate the `dev` command using the `TRIGGER_ACCESS_TOKEN` environment variable. Previously this was only supported in the `deploy` command. + +```sh +TRIGGER_ACCESS_TOKEN= npx trigger.dev@latest dev +``` + +### Better deploy support for self-hosters + +You can now specify a custom registry and namespace when deploying via a self-hosted instance of Trigger.dev: + +```sh +npx trigger.dev@latest deploy \ + --self-hosted \ + --load-image \ + --push \ + --registry docker.io \ + --namespace mydockerhubusername +``` + +All you have to do is create a repository in dockerhub that matches the project ref of your Trigger.dev project (e.g. `proj_rrkpdguyagvsoktglnod`) + + + Docker Hub will automatically create a repository the first time you push, which is public by + default. If you want to keep these images private, make sure you create the repository before you + first run the `deploy` command + + +## Known issues + +- Path aliases are not yet support in your `trigger.config.ts` file. To workaround this issue you'll need to rewrite path aliases to their relative paths. (See [this](https://github.com/unjs/jiti/issues/166) and [this](https://knip.dev/reference/known-issues#path-aliases-in-config-files)) for more info. +- `*.test.ts` and `.spec.ts` files inside the trigger dirs will be bundled and could cause issues. You'll need to move these files outside of the trigger dirs to avoid this issue. diff --git a/docs/upgrading-packages.mdx b/docs/upgrading-packages.mdx index 91e70f65e..197c19f22 100644 --- a/docs/upgrading-packages.mdx +++ b/docs/upgrading-packages.mdx @@ -9,7 +9,7 @@ description: "When we release fixes and new features we recommend you upgrade yo Run this command in your project: ```sh -npx trigger.dev@beta update +npx trigger.dev@latest update ``` This will update all of the Trigger.dev packages in your project to the latest version. @@ -19,11 +19,11 @@ This will update all of the Trigger.dev packages in your project to the latest v When you run the CLI locally use the latest version for the `dev` and `deploy` commands: ```sh -npx trigger.dev@beta dev +npx trigger.dev@latest dev ``` ```sh -npx trigger.dev@beta deploy +npx trigger.dev@latest deploy ``` These commands will also give you the option to upgrade if you are behind on versions. @@ -44,7 +44,7 @@ You can deploy using [GitHub Actions](/github-actions). We recommend that you lo In the steps you'll see a `run` command. It will run the trigger.dev deploy CLI command. Make - sure to update this version to the latest version (e.g. `npx trigger.dev@3.0.0-beta.48 deploy`). + sure to update this version to the latest version (e.g. `npx trigger.dev@3.0.0 deploy`). @@ -57,7 +57,7 @@ For example: ```json { "devDependencies": { - "trigger.dev": "3.0.0-beta.48" + "trigger.dev": "3.0.0" } } ``` diff --git a/packages/build/src/extensions/core.ts b/packages/build/src/extensions/core.ts index 0abd6c10f..2adddbaa0 100644 --- a/packages/build/src/extensions/core.ts +++ b/packages/build/src/extensions/core.ts @@ -1,3 +1,5 @@ export * from "./core/additionalFiles.js"; export * from "./core/additionalPackages.js"; export * from "./core/syncEnvVars.js"; +export * from "./core/aptGet.js"; +export * from "./core/ffmpeg.js"; diff --git a/packages/build/src/extensions/core/aptGet.ts b/packages/build/src/extensions/core/aptGet.ts new file mode 100644 index 000000000..c6d0b51e6 --- /dev/null +++ b/packages/build/src/extensions/core/aptGet.ts @@ -0,0 +1,27 @@ +import { BuildExtension } from "@trigger.dev/core/v3/build"; + +export type AptGetOptions = { + packages: string[]; +}; + +export function aptGet(options: AptGetOptions): BuildExtension { + return { + name: "aptGet", + onBuildComplete(context) { + if (context.target === "dev") { + return; + } + + context.logger.debug("Adding apt-get layer", { + pkgs: options.packages, + }); + + context.addLayer({ + id: "apt-get", + image: { + pkgs: options.packages, + }, + }); + }, + }; +} diff --git a/packages/build/src/extensions/core/ffmpeg.ts b/packages/build/src/extensions/core/ffmpeg.ts new file mode 100644 index 000000000..84a91d706 --- /dev/null +++ b/packages/build/src/extensions/core/ffmpeg.ts @@ -0,0 +1,40 @@ +import { BuildExtension } from "@trigger.dev/core/v3/build"; + +export type FfmpegOptions = { + version?: string; +}; + +/** + * Add ffmpeg to the build, and automatically set the FFMPEG_PATH and FFPROBE_PATH environment variables. + * @param options.version The version of ffmpeg to install. If not provided, the latest version will be installed. + * + * @returns The build extension. + */ +export function ffmpeg(options: FfmpegOptions = {}): BuildExtension { + return { + name: "ffmpeg", + onBuildComplete(context) { + if (context.target === "dev") { + return; + } + + context.logger.debug("Adding ffmpeg", { + options, + }); + + context.addLayer({ + id: "ffmpeg", + image: { + pkgs: options.version ? [`ffmpeg=${options.version}`] : ["ffmpeg"], + }, + deploy: { + env: { + FFMPEG_PATH: "/usr/bin/ffmpeg", + FFPROBE_PATH: "/usr/bin/ffprobe", + }, + override: true, + }, + }); + }, + }; +} diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 4d648b28c..91ca0ceda 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -29,7 +29,8 @@ "dist" ], "bin": { - "triggerdev": "./dist/esm/index.js" + "triggerdev": "./dist/esm/index.js", + "trigger": "./dist/esm/index.js" }, "tshy": { "selfLink": false, diff --git a/packages/cli-v3/src/commands/init.ts b/packages/cli-v3/src/commands/init.ts index 370e8ae58..df60445cf 100644 --- a/packages/cli-v3/src/commands/init.ts +++ b/packages/cli-v3/src/commands/init.ts @@ -7,7 +7,7 @@ import { Command, Option as CommandOption } from "commander"; import { applyEdits, findNodeAtLocation, getNodeValue, modify, parseTree } from "jsonc-parser"; import { writeFile } from "node:fs/promises"; import { join, relative, resolve } from "node:path"; -import { addDependency, detectPackageManager } from "nypm"; +import { addDependency, addDevDependency, detectPackageManager } from "nypm"; import { resolveTSConfig } from "pkg-types"; import { z } from "zod"; import { CliApiClient } from "../apiClient.js"; @@ -37,8 +37,9 @@ import { login } from "./login.js"; const InitCommandOptions = CommonCommandOptions.extend({ projectRef: z.string().optional(), overrideConfig: z.boolean().default(false), - tag: z.string().default("beta"), + tag: z.string().default("latest"), skipPackageInstall: z.boolean().default(false), + runtime: z.string().default("node"), pkgArgs: z.string().optional(), gitRef: z.string().default("main"), javascript: z.boolean().default(false), @@ -60,7 +61,12 @@ export function configureInitCommand(program: Command) { .option( "-t, --tag ", "The version of the @trigger.dev/sdk package to install", - "beta" + "latest" + ) + .option( + "-r, --runtime ", + "Which runtime to use for the project. Currently only supports node and bun", + "node" ) .option("--skip-package-install", "Skip installing the @trigger.dev/sdk package") .option("--override-config", "Override the existing config file if it exists") @@ -434,6 +440,15 @@ async function installPackages(dir: string, options: InitCommandOptions) { installSpinner.stop(`@trigger.dev/sdk@${options.tag} installed`); + installSpinner.start(`Adding @trigger.dev/build@${options.tag} to devDependencies`); + + await addDevDependency(`@trigger.dev/build@${options.tag}`, { + cwd: projectDir, + silent: true, + }); + + installSpinner.stop(`@trigger.dev/build@${options.tag} installed`); + span.end(); } catch (e) { if (options.logLevel === "debug") { @@ -481,15 +496,17 @@ async function writeConfigFile( "cli.projectDir": projectDir, "cli.templatePath": templateUrl, "cli.outputPath": outputPath, + "cli.runtime": options.runtime, }); const result = await createFileFromTemplate({ templateUrl, replacements: { projectRef: project.externalRef, + runtime: options.runtime, triggerDirectoriesOption: triggerDir.isCustomValue ? `\n dirs: ["${triggerDir.location}"],` - : `\n dirs: ["/src/trigger"],`, + : `\n dirs: ["./src/trigger"],`, }, outputPath, override: options.overrideConfig, diff --git a/packages/cli-v3/src/commands/update.ts b/packages/cli-v3/src/commands/update.ts index aa608c4ba..f22fe9fd3 100644 --- a/packages/cli-v3/src/commands/update.ts +++ b/packages/cli-v3/src/commands/update.ts @@ -77,7 +77,7 @@ export async function updateTriggerPackages( prettyWarning( "You're not running the latest CLI version, please consider updating ASAP", `Current: ${cliVersion}\nLatest: ${newCliVersion}`, - "Run latest: npx trigger.dev@beta" + "Run latest: npx trigger.dev@latest" ); hasOutput = true; @@ -108,25 +108,9 @@ export async function updateTriggerPackages( mismatches.push(dep); } - const extractRelease = (version: string) => { - const release = Number(version.split("3.0.0-beta.")[1]); - return release || undefined; - }; - - let isDowngrade = false; - const targetRelease = extractRelease(targetVersion); - - if (targetRelease) { - isDowngrade = mismatches.some((dep) => { - const depRelease = extractRelease(dep.version); - - if (!depRelease) { - return false; - } - - return depRelease > targetRelease; - }); - } + const isDowngrade = mismatches.some((dep) => { + return dep.version > targetVersion; + }); return { mismatches, diff --git a/packages/cli-v3/src/utilities/initialBanner.ts b/packages/cli-v3/src/utilities/initialBanner.ts index 45b4ef39b..034f48329 100644 --- a/packages/cli-v3/src/utilities/initialBanner.ts +++ b/packages/cli-v3/src/utilities/initialBanner.ts @@ -72,10 +72,7 @@ export function printDevBanner(printTopBorder = true) { async function doUpdateCheck(): Promise { try { // default cache for update check is 1 day - const meta = await getLatestVersion( - `trigger.dev@${VERSION.startsWith("3.0.0-beta") ? "beta" : "latest"}`, - { force: true } - ); + const meta = await getLatestVersion("trigger.dev@latest", { force: true }); if (!meta.version) { return; diff --git a/packages/cli-v3/templates/trigger.config.mjs.template b/packages/cli-v3/templates/trigger.config.mjs.template index 6a440ed3c..7b5c122dd 100644 --- a/packages/cli-v3/templates/trigger.config.mjs.template +++ b/packages/cli-v3/templates/trigger.config.mjs.template @@ -2,6 +2,7 @@ import { defineConfig } from "@trigger.dev/sdk/v3"; export default defineConfig({ project: "${projectRef}", + runtime: "${runtime}", logLevel: "log", retries: { enabledInDev: true, diff --git a/packages/cli-v3/templates/trigger.config.ts.template b/packages/cli-v3/templates/trigger.config.ts.template index 6a440ed3c..7b5c122dd 100644 --- a/packages/cli-v3/templates/trigger.config.ts.template +++ b/packages/cli-v3/templates/trigger.config.ts.template @@ -2,6 +2,7 @@ import { defineConfig } from "@trigger.dev/sdk/v3"; export default defineConfig({ project: "${projectRef}", + runtime: "${runtime}", logLevel: "log", retries: { enabledInDev: true, diff --git a/packages/trigger-sdk/src/v3/shared.ts b/packages/trigger-sdk/src/v3/shared.ts index 62ca7e128..029436648 100644 --- a/packages/trigger-sdk/src/v3/shared.ts +++ b/packages/trigger-sdk/src/v3/shared.ts @@ -263,6 +263,47 @@ export type TaskRunResult = error: unknown; }; +export class SubtaskUnwrapError extends Error { + public readonly taskId: string; + public readonly runId: string; + public readonly cause?: unknown; + + constructor(taskId: string, runId: string, subtaskError: unknown) { + if (subtaskError instanceof Error) { + super(`Error in ${taskId}: ${subtaskError.message}`, { cause: subtaskError }); + this.name = "SubtaskUnwrapError"; + } else { + super(`Error in ${taskId}`, { cause: subtaskError }); + this.name = "SubtaskUnwrapError"; + } + + this.taskId = taskId; + this.runId = runId; + } +} + +export class TaskRunPromise extends Promise> { + constructor( + executor: ( + resolve: (value: TaskRunResult | PromiseLike>) => void, + reject: (reason?: any) => void + ) => void, + private readonly taskId: string + ) { + super(executor); + } + + unwrap(): Promise { + return this.then((result) => { + if (result.ok) { + return result.output; + } else { + throw new SubtaskUnwrapError(this.taskId, result.id, result.error); + } + }); + } +} + export type BatchResult = { id: string; runs: TaskRunResult[]; @@ -311,7 +352,7 @@ export interface Task * } * ``` */ - triggerAndWait: (payload: TInput, options?: TaskRunOptions) => Promise>; + triggerAndWait: (payload: TInput, options?: TaskRunOptions) => TaskRunPromise; /** * Batch trigger multiple task runs with the given payloads, and wait for the results. Returns the results of the task runs. @@ -512,20 +553,28 @@ export function createTask< customQueue ); }, - triggerAndWait: async (payload, options) => { + triggerAndWait: (payload, options) => { const taskMetadata = taskCatalog.getTaskManifest(params.id); - return await triggerAndWait_internal( - taskMetadata && taskMetadata.exportName - ? `${taskMetadata.exportName}.triggerAndWait()` - : `triggerAndWait()`, - params.id, - payload, - { - queue: customQueue, - ...options, - } - ); + return new TaskRunPromise((resolve, reject) => { + triggerAndWait_internal( + taskMetadata && taskMetadata.exportName + ? `${taskMetadata.exportName}.triggerAndWait()` + : `triggerAndWait()`, + params.id, + payload, + { + queue: customQueue, + ...options, + } + ) + .then((result) => { + resolve(result); + }) + .catch((error) => { + reject(error); + }); + }, params.id); }, batchTriggerAndWait: async (items) => { const taskMetadata = taskCatalog.getTaskManifest(params.id); @@ -614,19 +663,27 @@ export async function trigger( * } * ``` */ -export async function triggerAndWait( +export function triggerAndWait( id: TaskIdentifier, payload: TaskPayload, options?: TaskRunOptions, requestOptions?: ApiRequestOptions -): Promise>> { - return await triggerAndWait_internal, TaskOutput>( - "tasks.triggerAndWait()", - id, - payload, - options, - requestOptions - ); +): TaskRunPromise> { + return new TaskRunPromise>((resolve, reject) => { + triggerAndWait_internal, TaskOutput>( + "tasks.triggerAndWait()", + id, + payload, + options, + requestOptions + ) + .then((result) => { + resolve(result); + }) + .catch((error) => { + reject(error); + }); + }, id); } /** diff --git a/packages/trigger-sdk/src/v3/tasks.ts b/packages/trigger-sdk/src/v3/tasks.ts index 0e84d586c..53cddf8d9 100644 --- a/packages/trigger-sdk/src/v3/tasks.ts +++ b/packages/trigger-sdk/src/v3/tasks.ts @@ -6,8 +6,11 @@ import { trigger, triggerAndPoll, triggerAndWait, + SubtaskUnwrapError, } from "./shared.js"; +export { SubtaskUnwrapError }; + import type { TaskOptions, Task, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54305948e..950ed17cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1362,12 +1362,6 @@ importers: references/v3-catalog: dependencies: - '@ffmpeg-installer/ffmpeg': - specifier: ^1.1.0 - version: 1.1.0 - '@ffprobe-installer/ffprobe': - specifier: ^2.1.2 - version: 2.1.2 '@infisical/sdk': specifier: ^2.1.9 version: 2.3.5 @@ -1413,6 +1407,9 @@ importers: execa: specifier: ^8.0.1 version: 8.0.1 + fluent-ffmpeg: + specifier: ^2.1.3 + version: 2.1.3 header-generator: specifier: ^2.1.55 version: 2.1.55 @@ -1504,6 +1501,9 @@ importers: '@types/email-reply-parser': specifier: ^1.4.2 version: 1.4.2 + '@types/fluent-ffmpeg': + specifier: ^2.1.26 + version: 2.1.26 '@types/node': specifier: 20.4.2 version: 20.4.2 @@ -5993,161 +5993,6 @@ packages: resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} engines: {node: '>=14'} - /@ffmpeg-installer/darwin-arm64@4.1.5: - resolution: {integrity: sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/darwin-x64@4.1.0: - resolution: {integrity: sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/ffmpeg@1.1.0: - resolution: {integrity: sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==} - optionalDependencies: - '@ffmpeg-installer/darwin-arm64': 4.1.5 - '@ffmpeg-installer/darwin-x64': 4.1.0 - '@ffmpeg-installer/linux-arm': 4.1.3 - '@ffmpeg-installer/linux-arm64': 4.1.4 - '@ffmpeg-installer/linux-ia32': 4.1.0 - '@ffmpeg-installer/linux-x64': 4.1.0 - '@ffmpeg-installer/win32-ia32': 4.1.0 - '@ffmpeg-installer/win32-x64': 4.1.0 - dev: false - - /@ffmpeg-installer/linux-arm64@4.1.4: - resolution: {integrity: sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/linux-arm@4.1.3: - resolution: {integrity: sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/linux-ia32@4.1.0: - resolution: {integrity: sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/linux-x64@4.1.0: - resolution: {integrity: sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/win32-ia32@4.1.0: - resolution: {integrity: sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@ffmpeg-installer/win32-x64@4.1.0: - resolution: {integrity: sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/darwin-arm64@5.0.1: - resolution: {integrity: sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/darwin-x64@5.1.0: - resolution: {integrity: sha512-J+YGscZMpQclFg31O4cfVRGmDpkVsQ2fZujoUdMAAYcP0NtqpC49Hs3SWJpBdsGB4VeqOt5TTm1vSZQzs1NkhA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/ffprobe@2.1.2: - resolution: {integrity: sha512-ZNvwk4f2magF42Zji2Ese16SMj9BS7Fui4kRjg6gTYTxY3gWZNpg85n4MIfQyI9nimHg4x/gT6FVkp/bBDuBwg==} - engines: {node: '>=14.21.2'} - optionalDependencies: - '@ffprobe-installer/darwin-arm64': 5.0.1 - '@ffprobe-installer/darwin-x64': 5.1.0 - '@ffprobe-installer/linux-arm': 5.2.0 - '@ffprobe-installer/linux-arm64': 5.2.0 - '@ffprobe-installer/linux-ia32': 5.2.0 - '@ffprobe-installer/linux-x64': 5.2.0 - '@ffprobe-installer/win32-ia32': 5.1.0 - '@ffprobe-installer/win32-x64': 5.1.0 - dev: false - - /@ffprobe-installer/linux-arm64@5.2.0: - resolution: {integrity: sha512-X1VvWtlLs6ScP73biVLuHD5ohKJKsMTa0vafCESOen4mOoNeLAYbxOVxDWAdFz9cpZgRiloFj5QD6nDj8E28yQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/linux-arm@5.2.0: - resolution: {integrity: sha512-PF5HqEhCY7WTWHtLDYbA/+rLS+rhslWvyBlAG1Fk8VzVlnRdl93o6hy7DE2kJgxWQbFaR3ZktPQGEzfkrmQHvQ==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/linux-ia32@5.2.0: - resolution: {integrity: sha512-TFVK5sasXyXhbIG7LtPRDmtkrkOsInwKcL43iEvEw+D9vCS2rc//mn9/0Q+BR0UoJEiMK4+ApYr/3LLVUBPOCQ==} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/linux-x64@5.2.0: - resolution: {integrity: sha512-D3UeqTLYPNs7pBWPLUYGehPdRVqU8eACox4OZy3pZUZatxye2YKlvBwEfaLdL1v2Z4FOAlLUhms0kY8m8kqSRA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/win32-ia32@5.1.0: - resolution: {integrity: sha512-5O3vOoNRxmut0/Nu9vSazTdSHasrr+zPT2B3Hm7kjmO3QVFcIfVImS6ReQnZeSy8JPJOqXts5kX5x/3KOX54XQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@ffprobe-installer/win32-x64@5.1.0: - resolution: {integrity: sha512-jMGYeAgkrdn4e2vvYt/qakgHRE3CPju4bn5TmdPfoAm1BlX1mY9cyMd8gf5vSzI8gH8Zq5WQAyAkmekX/8TSTg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - /@floating-ui/core@0.7.3: resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} dev: false @@ -14550,6 +14395,12 @@ packages: '@types/serve-static': 1.15.0 dev: true + /@types/fluent-ffmpeg@2.1.26: + resolution: {integrity: sha512-0JVF3wdQG+pN0ImwWD0bNgJiKF2OHg/7CDBHw5UIbRTvlnkgGHK6V5doE54ltvhud4o31/dEiHm23CAlxFiUQg==} + dependencies: + '@types/node': 18.19.20 + dev: true + /@types/gradient-string@1.1.2: resolution: {integrity: sha512-zIet2KvHr2dkOCPI5ggQQ+WJVyfBSFaqK9sNelhgDjlE2K3Fu2muuPJwu5aKM3xoWuc3WXudVEMUwI1QWhykEQ==} dependencies: @@ -16129,6 +15980,10 @@ packages: hasBin: true dev: true + /async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + dev: false + /async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true @@ -19707,6 +19562,14 @@ packages: /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + dependencies: + async: 0.2.10 + which: 1.3.1 + dev: false + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} diff --git a/references/v3-catalog/package.json b/references/v3-catalog/package.json index 1525750df..26f987282 100644 --- a/references/v3-catalog/package.json +++ b/references/v3-catalog/package.json @@ -16,8 +16,7 @@ "generate:prisma": "prisma generate --sql" }, "dependencies": { - "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@ffprobe-installer/ffprobe": "^2.1.2", + "fluent-ffmpeg": "^2.1.3", "@infisical/sdk": "^2.1.9", "@opentelemetry/api": "1.4.1", "@prisma/client": "5.19.0", @@ -68,6 +67,7 @@ "@types/email-reply-parser": "^1.4.2", "@types/node": "20.4.2", "@types/react": "^18.3.1", + "@types/fluent-ffmpeg": "^2.1.26", "esbuild": "^0.19.11", "prisma": "5.19.0", "prisma-kysely": "^1.8.0", diff --git a/references/v3-catalog/src/trigger/binaries.ts b/references/v3-catalog/src/trigger/binaries.ts index 2a5796cdd..d7a6da8b5 100644 --- a/references/v3-catalog/src/trigger/binaries.ts +++ b/references/v3-catalog/src/trigger/binaries.ts @@ -1,159 +1,33 @@ -import { logger, task } from "@trigger.dev/sdk/v3"; -import { chmod, writeFile } from "node:fs/promises"; +import { task } from "@trigger.dev/sdk/v3"; +import ffmpeg from "fluent-ffmpeg"; +import * as path from "node:path"; import { Readable } from "node:stream"; -import { ReadableStream } from "stream/web"; -import { basename } from "node:path"; -import YTDlpWrap from "yt-dlp-wrap"; -import ffmpeg from "@ffmpeg-installer/ffmpeg"; +import type { ReadableStream } from "node:stream/web"; -export const ytDlp = task({ - id: "yt-dlp", - run: async () => { - const releaseArtifact = "yt-dlp_linux"; - const filePath = `./${releaseArtifact}`; - const fileURL = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/${releaseArtifact}`; - - await YTDlpWrap.downloadFile(fileURL, filePath); - await chmod(filePath, "777"); - - logger.log("downloaded", { filePath, fileURL }); - - const ytDlpWrap = new YTDlpWrap(filePath); - const version = await ytDlpWrap.getVersion(); - - logger.log("version", { version }); +export const convertVideo = task({ + id: "convert-video", + retry: { + maxAttempts: 5, + minTimeoutInMs: 1000, + maxTimeoutInMs: 10000, + factor: 2, }, -}); + run: async ({ url }: { url: string }) => { + const outputPath = path.join("/tmp", `output_${Date.now()}.mp4`); -async function getFfprobe() { - const ffprobe = await import("@ffprobe-installer/ffprobe"); + const response = await fetch(url); - logger.log("ffprobeInstaller", ffprobe); - - return ffprobe; -} - -async function ffprobeVersion() { - const ffprobe = await getFfprobe(); - const childProcess = await execute(ffprobe.path, ["-version"]); - - logger.log("ffprobe -version", { - output: childProcess.stdout.split("\n")[0], - }); -} - -async function ffmpegVersion() { - logger.log("ffmpegInstaller", ffmpeg); - - const childProcess = await execute(ffmpeg.path, ["-version"]); - - logger.log("ffmpeg -version", { - output: childProcess.stdout.split("\n")[0], - }); -} - -export const ffprobeInstaller = task({ - id: "ffprobe-installer", - run: async () => { - await ffprobeVersion(); - }, -}); - -export const ffmpegInstaller = task({ - id: "ffmpeg-installer", - run: async () => { - await ffmpegVersion(); - }, -}); - -const videoUrl = - "https://upload.wikimedia.org/wikipedia/commons/0/07/Fractal-zoom-1-03-Mandelbrot_Buzzsaw.ogv"; -const videoPath = "./video.ogv"; - -async function downloadVideo() { - logger.log("downloading video", { url: videoUrl }); - - const response = await fetch(videoUrl); - - if (!response.body) { - throw new Error("No readable stream"); - } - - const readStream = Readable.fromWeb(response.body as ReadableStream); - await writeFile(videoPath, readStream); - - logger.log("finished downloading", { outputPath: videoPath }); -} - -async function execute(file: string, args?: readonly string[]) { - const { execa } = await import("execa"); - - logger.log(`execute: ${basename(file)}`, { args }); - const childProcess = await execa(file, args); - - if (childProcess.exitCode !== 0) { - logger.error("Non-zero exit code", { - stderr: childProcess.stderr, - stdout: childProcess.stdout, + await new Promise((resolve, reject) => { + ffmpeg(Readable.fromWeb(response.body as ReadableStream)) + .videoFilters("scale=iw/2:ih/2") + .output(outputPath) + .on("end", resolve) + .on("error", reject) + .run(); }); - throw new Error("Non-zero exit code"); - } - return childProcess; -} + console.log(`Video converted to ${outputPath}`); -async function probeVideo() { - const ffprobe = await getFfprobe(); - const args = ["-hide_banner", "-print_format", "json", "-show_format", videoPath]; - - logger.log("probing video", { videoPath }); - const childProcess = await execute(ffprobe.path, args); - - logger.log("video info", { - output: JSON.parse(childProcess.stdout), - }); -} - -export const ffprobeInfo = task({ - id: "ffprobe-info", - run: async () => { - await ffprobeVersion(); - await downloadVideo(); - await probeVideo(); - }, -}); - -async function convertVideo() { - const outputPath = "./video.webm"; - logger.log("converting video", { input: videoPath, output: outputPath }); - - const childProcess = await execute(ffmpeg.path, [ - "-hide_banner", - "-y", // overwrite output, don't prompt - "-i", - videoPath, - // seek to 25s - "-ss", - "25", - // stop after 5s - "-t", - "5", - outputPath, - ]); - - logger.log("video converted", { - input: videoPath, - output: outputPath, - stderr: childProcess.stderr, - stdout: childProcess.stdout, - }); -} - -export const ffmpegConvert = task({ - id: "ffmpeg-convert", - run: async () => { - await ffmpegVersion(); - await downloadVideo(); - await convertVideo(); + return { success: true, outputPath }; }, }); diff --git a/references/v3-catalog/src/trigger/simple.ts b/references/v3-catalog/src/trigger/simple.ts index 1d6aa2071..4db91ac0f 100644 --- a/references/v3-catalog/src/trigger/simple.ts +++ b/references/v3-catalog/src/trigger/simple.ts @@ -1,5 +1,5 @@ import "server-only"; -import { logger, task, tasks, wait } from "@trigger.dev/sdk/v3"; +import { logger, SubtaskUnwrapError, task, tasks, wait } from "@trigger.dev/sdk/v3"; import { traceAsync } from "@/telemetry.js"; import { HeaderGenerator } from "header-generator"; @@ -31,14 +31,22 @@ export const fetchPostTask = task({ export const anyPayloadTask = task({ id: "any-payload-task", run: async (payload: any) => { - const result = await tasks.triggerAndWait("fetch-post-task", { - url: "https://jsonplaceholder.typicode.com/posts/1", - }); + try { + const { url, method } = await tasks + .triggerAndWait("fetch-post-task", { + url: "https://jsonplaceholder.typicode.comasdqdasd/posts/1", + }) + .unwrap(); - if (result.ok) { - logger.info("Result from fetch-post-task 211111sss", { output: result.output }); - } else { - logger.error("Error from fetch-post-task", { error: result.error }); + console.log("Result from fetch-post-task 211111sss", { output: { url, method } }); + } catch (error) { + if (error instanceof SubtaskUnwrapError) { + console.error("Error in fetch-post-task", { + runId: error.runId, + taskId: error.taskId, + cause: error.cause, + }); + } } return { @@ -126,10 +134,12 @@ export const parentTask = task({ await wait.for({ seconds: 5 }); - const childTaskResponse = await childTask.triggerAndWait({ - message: payload.message, - forceError: false, - }); + const childTaskResponse = await childTask + .triggerAndWait({ + message: payload.message, + forceError: false, + }) + .unwrap(); logger.info("Child task response", { childTaskResponse }); diff --git a/references/v3-catalog/trigger.config.ts b/references/v3-catalog/trigger.config.ts index 2f2c66d92..356060918 100644 --- a/references/v3-catalog/trigger.config.ts +++ b/references/v3-catalog/trigger.config.ts @@ -1,41 +1,15 @@ import { InfisicalClient } from "@infisical/sdk"; +import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin"; import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; import { esbuildPlugin } from "@trigger.dev/build"; import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; +import { ffmpeg, syncEnvVars } from "@trigger.dev/build/extensions/core"; import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; -import { defineConfig, ResolveEnvironmentVariablesFunction } from "@trigger.dev/sdk/v3"; -import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin"; +import { defineConfig } from "@trigger.dev/sdk/v3"; export { handleError } from "./src/handleError.js"; -export const resolveEnvVars: ResolveEnvironmentVariablesFunction = async (ctx) => { - if ( - process.env.INFISICAL_CLIENT_ID === undefined || - process.env.INFISICAL_CLIENT_SECRET === undefined || - process.env.INFISICAL_PROJECT_ID === undefined - ) { - return; - } - - const client = new InfisicalClient({ - clientId: process.env.INFISICAL_CLIENT_ID, - clientSecret: process.env.INFISICAL_CLIENT_SECRET, - }); - - const secrets = await client.listSecrets({ - environment: ctx.environment, - projectId: process.env.INFISICAL_PROJECT_ID, - }); - - return { - variables: secrets.map((secret) => ({ - name: secret.secretKey, - value: secret.secretValue, - })), - }; -}; - export default defineConfig({ runtime: "node", project: "yubjwjsfkxnylobaqvqz", @@ -43,7 +17,7 @@ export default defineConfig({ instrumentations: [new OpenAIInstrumentation()], additionalFiles: ["wrangler/wrangler.toml"], retries: { - enabledInDev: true, + enabledInDev: false, default: { maxAttempts: 10, minTimeoutInMs: 5_000, @@ -63,6 +37,7 @@ export default defineConfig({ build: { conditions: ["react-server"], extensions: [ + ffmpeg(), emitDecoratorMetadata(), audioWaveform(), prismaExtension({ @@ -80,7 +55,31 @@ export default defineConfig({ }), { placement: "last", target: "deploy" } ), + syncEnvVars(async (ctx) => { + if ( + !process.env.INFISICAL_CLIENT_ID || + !process.env.INFISICAL_CLIENT_SECRET || + !process.env.INFISICAL_PROJECT_ID + ) { + return; + } + + const client = new InfisicalClient({ + clientId: process.env.INFISICAL_CLIENT_ID, + clientSecret: process.env.INFISICAL_CLIENT_SECRET, + }); + + const secrets = await client.listSecrets({ + environment: ctx.environment, + projectId: process.env.INFISICAL_PROJECT_ID, + }); + + return secrets.map((secret) => ({ + name: secret.secretKey, + value: secret.secretValue, + })); + }), ], - external: ["@ffmpeg-installer/ffmpeg", "re2"], + external: ["re2"], }, }); From 45287cd655da0c649aa9e20ec3e3f3e161e5c141 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:37:20 +0100 Subject: [PATCH 04/55] chore: Update version for release (#1269) Co-authored-by: github-actions[bot] --- .changeset/afraid-sheep-joke.md | 5 - .changeset/angry-eagles-trade.md | 9 - .changeset/angry-trees-drop.md | 5 - .changeset/beige-pears-explode.md | 5 - .changeset/beige-pens-dance.md | 5 - .changeset/big-tomatoes-deliver.md | 5 - .changeset/breezy-gorillas-mate.md | 6 - .changeset/brown-boats-bathe.md | 5 - .changeset/brown-spies-burn.md | 5 - .changeset/chilled-hornets-move.md | 5 - .changeset/clean-pianos-listen.md | 7 - .changeset/clever-apes-collect.md | 5 - .changeset/clever-carrots-travel.md | 7 - .changeset/clever-donkeys-hunt.md | 6 - .changeset/cool-comics-burn.md | 5 - .changeset/cool-glasses-bake.md | 7 - .changeset/cuddly-feet-approve.md | 5 - .changeset/cuddly-penguins-cross.md | 8 - .changeset/curly-monkeys-tell.md | 7 - .changeset/curvy-beers-camp.md | 5 - .changeset/dry-walls-check.md | 6 - .changeset/dull-mangos-press.md | 5 - .changeset/early-impalas-itch.md | 5 - .changeset/eight-pumas-float.md | 5 - .changeset/eleven-paws-join.md | 5 - .changeset/eleven-tips-learn.md | 7 - .changeset/famous-boats-tease.md | 5 - .changeset/fast-colts-relax.md | 5 - .changeset/fast-ladybugs-eat.md | 5 - .changeset/fast-melons-listen.md | 5 - .changeset/few-poems-vanish.md | 5 - .changeset/few-students-share.md | 5 - .changeset/fifty-lions-think.md | 5 - .changeset/five-toes-destroy.md | 7 - .changeset/flat-onions-punch.md | 5 - .changeset/friendly-walls-repair.md | 5 - .changeset/friendly-walls-search.md | 5 - .changeset/funny-swans-destroy.md | 9 - .changeset/gentle-planets-return.md | 5 - .changeset/gorgeous-cycles-guess.md | 5 - .changeset/gorgeous-gorillas-compete.md | 6 - .changeset/green-pens-battle.md | 5 - .changeset/hot-buckets-behave.md | 5 - .changeset/hot-fishes-retire.md | 5 - .changeset/hot-wasps-sin.md | 7 - .changeset/hungry-sloths-promise.md | 11 - .changeset/itchy-chairs-itch.md | 5 - .changeset/itchy-jars-pay.md | 5 - .changeset/khaki-apricots-design.md | 5 - .changeset/khaki-poems-lay.md | 5 - .changeset/large-seahorses-cheat.md | 5 - .changeset/late-icons-lie.md | 6 - .changeset/late-steaks-behave.md | 5 - .changeset/lazy-files-lay.md | 5 - .changeset/lemon-sloths-hide.md | 6 - .changeset/light-bulldogs-press.md | 5 - .changeset/light-dragons-complain.md | 5 - .changeset/little-crabs-cross.md | 6 - .changeset/long-feet-invent.md | 5 - .changeset/long-fireants-search.md | 5 - .changeset/long-hounds-wave.md | 5 - .changeset/loud-actors-remember.md | 5 - .changeset/lovely-drinks-flash.md | 5 - .changeset/lucky-items-film.md | 5 - .changeset/many-ligers-pump.md | 6 - .changeset/many-papayas-hope.md | 5 - .changeset/mighty-camels-joke.md | 5 - .changeset/mighty-eggs-grab.md | 29 -- .changeset/mighty-flowers-train.md | 83 ------ .changeset/mighty-parrots-sin.md | 5 - .changeset/mighty-sheep-guess.md | 7 - .changeset/modern-stingrays-end.md | 6 - .changeset/nasty-jars-pump.md | 5 - .changeset/nervous-baboons-sin.md | 6 - .changeset/nervous-planets-sparkle.md | 9 - .changeset/nervous-seas-shave.md | 5 - .changeset/new-items-glow.md | 5 - .changeset/new-pants-beg.md | 5 - .changeset/new-rivers-tell.md | 6 - .changeset/nice-bulldogs-turn.md | 6 - .changeset/ninety-countries-swim.md | 5 - .changeset/ninety-pets-travel.md | 6 - .changeset/odd-beds-wonder.md | 6 - .changeset/odd-poets-own.md | 5 - .changeset/old-feet-brush.md | 5 - .changeset/pink-pumas-rhyme.md | 6 - .changeset/plenty-ducks-beam.md | 5 - .changeset/polite-ducks-switch.md | 5 - .changeset/polite-pears-grow.md | 5 - .changeset/polite-pots-walk.md | 7 - .changeset/polite-rockets-matter.md | 5 - .changeset/poor-flowers-cross.md | 5 - .changeset/pre.json | 169 ----------- .changeset/proud-dogs-battle.md | 5 - .changeset/purple-garlics-shop.md | 5 - .changeset/purple-spiders-care.md | 5 - .changeset/rare-lamps-promise.md | 6 - .changeset/rare-roses-float.md | 5 - .changeset/real-planets-stare.md | 7 - .changeset/rich-kangaroos-unite.md | 5 - .changeset/rotten-beers-refuse.md | 5 - .changeset/rotten-dryers-exercise.md | 7 - .changeset/rotten-eggs-occur.md | 6 - .changeset/rude-houses-promise.md | 5 - .changeset/rude-toys-compare.md | 6 - .changeset/selfish-ducks-sort.md | 6 - .changeset/serious-hats-rest.md | 5 - .changeset/shaggy-spoons-taste.md | 56 ---- .changeset/shaggy-weeks-live.md | 5 - .changeset/sharp-emus-compare.md | 13 - .changeset/sharp-zebras-serve.md | 5 - .changeset/shiny-coats-cry.md | 5 - .changeset/silly-buses-obey.md | 5 - .changeset/silly-forks-kiss.md | 5 - .changeset/silly-suits-switch.md | 5 - .changeset/silver-doors-juggle.md | 5 - .changeset/six-ligers-exist.md | 5 - .changeset/six-rats-hunt.md | 5 - .changeset/sixty-insects-watch.md | 5 - .changeset/slow-buses-own.md | 7 - .changeset/slow-kiwis-hide.md | 6 - .changeset/slow-sloths-retire.md | 6 - .changeset/smart-meals-join.md | 5 - .changeset/smart-needles-move.md | 5 - .changeset/smart-olives-eat.md | 5 - .changeset/sour-pugs-teach.md | 6 - .changeset/spicy-frogs-remain.md | 10 - .changeset/spicy-lamps-smoke.md | 5 - .changeset/spicy-terms-bow.md | 8 - .changeset/stale-actors-camp.md | 5 - .changeset/strange-cobras-bake.md | 5 - .changeset/strange-ghosts-matter.md | 5 - .changeset/strange-sheep-pull.md | 6 - .changeset/strong-lemons-add.md | 5 - .changeset/strong-owls-know.md | 6 - .changeset/strong-phones-smoke.md | 5 - .changeset/strong-years-help.md | 5 - .changeset/stupid-adults-sniff.md | 6 - .changeset/stupid-bulldogs-applaud.md | 5 - .changeset/sweet-ducks-remember.md | 5 - .changeset/sweet-lizards-press.md | 7 - .changeset/swift-dragons-peel.md | 5 - .changeset/tall-bees-wave.md | 7 - .changeset/tall-masks-repeat.md | 8 - .changeset/tame-apricots-clap.md | 5 - .changeset/tame-guests-know.md | 5 - .changeset/tender-moose-tell.md | 5 - .changeset/tender-oranges-rhyme.md | 5 - .changeset/tender-turkeys-compete.md | 6 - .changeset/thick-carrots-sneeze.md | 6 - .changeset/thick-trains-work.md | 5 - .changeset/thin-parents-heal.md | 5 - .changeset/thirty-hotels-raise.md | 6 - .changeset/thirty-islands-kiss.md | 5 - .changeset/tidy-balloons-suffer.md | 5 - .changeset/tidy-dryers-sleep.md | 10 - .changeset/tidy-pets-smell.md | 6 - .changeset/tidy-roses-guess.md | 6 - .changeset/tidy-tomatoes-explain.md | 5 - .changeset/tiny-doors-type.md | 6 - .changeset/tiny-elephants-scream.md | 7 - .changeset/tricky-bulldogs-heal.md | 7 - .changeset/tricky-keys-attack.md | 14 - .changeset/tricky-ladybugs-unite.md | 7 - .changeset/twelve-knives-notice.md | 5 - .changeset/twenty-seahorses-admire.md | 5 - .changeset/two-pumas-wait.md | 5 - .changeset/violet-cherries-deny.md | 5 - .changeset/violet-clocks-notice.md | 5 - .changeset/warm-nails-jump.md | 5 - .changeset/warm-olives-provide.md | 5 - .changeset/warm-planes-taste.md | 7 - .changeset/wise-pens-agree.md | 6 - .changeset/witty-dancers-smash.md | 6 - .changeset/yellow-roses-arrive.md | 5 - .changeset/young-jars-wait.md | 5 - .changeset/young-snails-sell.md | 5 - packages/build/CHANGELOG.md | 99 +++++++ packages/build/package.json | 4 +- packages/cli-v3/CHANGELOG.md | 363 ++++++++++++++++++++++++ packages/cli-v3/package.json | 6 +- packages/core/CHANGELOG.md | 284 ++++++++++++++++++ packages/core/package.json | 2 +- packages/database/CHANGELOG.md | 2 + packages/database/package.json | 2 +- packages/otlp-importer/CHANGELOG.md | 2 + packages/otlp-importer/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 205 +++++++++++++ packages/trigger-sdk/package.json | 4 +- 189 files changed, 965 insertions(+), 1335 deletions(-) delete mode 100644 .changeset/afraid-sheep-joke.md delete mode 100644 .changeset/angry-eagles-trade.md delete mode 100644 .changeset/angry-trees-drop.md delete mode 100644 .changeset/beige-pears-explode.md delete mode 100644 .changeset/beige-pens-dance.md delete mode 100644 .changeset/big-tomatoes-deliver.md delete mode 100644 .changeset/breezy-gorillas-mate.md delete mode 100644 .changeset/brown-boats-bathe.md delete mode 100644 .changeset/brown-spies-burn.md delete mode 100644 .changeset/chilled-hornets-move.md delete mode 100644 .changeset/clean-pianos-listen.md delete mode 100644 .changeset/clever-apes-collect.md delete mode 100644 .changeset/clever-carrots-travel.md delete mode 100644 .changeset/clever-donkeys-hunt.md delete mode 100644 .changeset/cool-comics-burn.md delete mode 100644 .changeset/cool-glasses-bake.md delete mode 100644 .changeset/cuddly-feet-approve.md delete mode 100644 .changeset/cuddly-penguins-cross.md delete mode 100644 .changeset/curly-monkeys-tell.md delete mode 100644 .changeset/curvy-beers-camp.md delete mode 100644 .changeset/dry-walls-check.md delete mode 100644 .changeset/dull-mangos-press.md delete mode 100644 .changeset/early-impalas-itch.md delete mode 100644 .changeset/eight-pumas-float.md delete mode 100644 .changeset/eleven-paws-join.md delete mode 100644 .changeset/eleven-tips-learn.md delete mode 100644 .changeset/famous-boats-tease.md delete mode 100644 .changeset/fast-colts-relax.md delete mode 100644 .changeset/fast-ladybugs-eat.md delete mode 100644 .changeset/fast-melons-listen.md delete mode 100644 .changeset/few-poems-vanish.md delete mode 100644 .changeset/few-students-share.md delete mode 100644 .changeset/fifty-lions-think.md delete mode 100644 .changeset/five-toes-destroy.md delete mode 100644 .changeset/flat-onions-punch.md delete mode 100644 .changeset/friendly-walls-repair.md delete mode 100644 .changeset/friendly-walls-search.md delete mode 100644 .changeset/funny-swans-destroy.md delete mode 100644 .changeset/gentle-planets-return.md delete mode 100644 .changeset/gorgeous-cycles-guess.md delete mode 100644 .changeset/gorgeous-gorillas-compete.md delete mode 100644 .changeset/green-pens-battle.md delete mode 100644 .changeset/hot-buckets-behave.md delete mode 100644 .changeset/hot-fishes-retire.md delete mode 100644 .changeset/hot-wasps-sin.md delete mode 100644 .changeset/hungry-sloths-promise.md delete mode 100644 .changeset/itchy-chairs-itch.md delete mode 100644 .changeset/itchy-jars-pay.md delete mode 100644 .changeset/khaki-apricots-design.md delete mode 100644 .changeset/khaki-poems-lay.md delete mode 100644 .changeset/large-seahorses-cheat.md delete mode 100644 .changeset/late-icons-lie.md delete mode 100644 .changeset/late-steaks-behave.md delete mode 100644 .changeset/lazy-files-lay.md delete mode 100644 .changeset/lemon-sloths-hide.md delete mode 100644 .changeset/light-bulldogs-press.md delete mode 100644 .changeset/light-dragons-complain.md delete mode 100644 .changeset/little-crabs-cross.md delete mode 100644 .changeset/long-feet-invent.md delete mode 100644 .changeset/long-fireants-search.md delete mode 100644 .changeset/long-hounds-wave.md delete mode 100644 .changeset/loud-actors-remember.md delete mode 100644 .changeset/lovely-drinks-flash.md delete mode 100644 .changeset/lucky-items-film.md delete mode 100644 .changeset/many-ligers-pump.md delete mode 100644 .changeset/many-papayas-hope.md delete mode 100644 .changeset/mighty-camels-joke.md delete mode 100644 .changeset/mighty-eggs-grab.md delete mode 100644 .changeset/mighty-flowers-train.md delete mode 100644 .changeset/mighty-parrots-sin.md delete mode 100644 .changeset/mighty-sheep-guess.md delete mode 100644 .changeset/modern-stingrays-end.md delete mode 100644 .changeset/nasty-jars-pump.md delete mode 100644 .changeset/nervous-baboons-sin.md delete mode 100644 .changeset/nervous-planets-sparkle.md delete mode 100644 .changeset/nervous-seas-shave.md delete mode 100644 .changeset/new-items-glow.md delete mode 100644 .changeset/new-pants-beg.md delete mode 100644 .changeset/new-rivers-tell.md delete mode 100644 .changeset/nice-bulldogs-turn.md delete mode 100644 .changeset/ninety-countries-swim.md delete mode 100644 .changeset/ninety-pets-travel.md delete mode 100644 .changeset/odd-beds-wonder.md delete mode 100644 .changeset/odd-poets-own.md delete mode 100644 .changeset/old-feet-brush.md delete mode 100644 .changeset/pink-pumas-rhyme.md delete mode 100644 .changeset/plenty-ducks-beam.md delete mode 100644 .changeset/polite-ducks-switch.md delete mode 100644 .changeset/polite-pears-grow.md delete mode 100644 .changeset/polite-pots-walk.md delete mode 100644 .changeset/polite-rockets-matter.md delete mode 100644 .changeset/poor-flowers-cross.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/proud-dogs-battle.md delete mode 100644 .changeset/purple-garlics-shop.md delete mode 100644 .changeset/purple-spiders-care.md delete mode 100644 .changeset/rare-lamps-promise.md delete mode 100644 .changeset/rare-roses-float.md delete mode 100644 .changeset/real-planets-stare.md delete mode 100644 .changeset/rich-kangaroos-unite.md delete mode 100644 .changeset/rotten-beers-refuse.md delete mode 100644 .changeset/rotten-dryers-exercise.md delete mode 100644 .changeset/rotten-eggs-occur.md delete mode 100644 .changeset/rude-houses-promise.md delete mode 100644 .changeset/rude-toys-compare.md delete mode 100644 .changeset/selfish-ducks-sort.md delete mode 100644 .changeset/serious-hats-rest.md delete mode 100644 .changeset/shaggy-spoons-taste.md delete mode 100644 .changeset/shaggy-weeks-live.md delete mode 100644 .changeset/sharp-emus-compare.md delete mode 100644 .changeset/sharp-zebras-serve.md delete mode 100644 .changeset/shiny-coats-cry.md delete mode 100644 .changeset/silly-buses-obey.md delete mode 100644 .changeset/silly-forks-kiss.md delete mode 100644 .changeset/silly-suits-switch.md delete mode 100644 .changeset/silver-doors-juggle.md delete mode 100644 .changeset/six-ligers-exist.md delete mode 100644 .changeset/six-rats-hunt.md delete mode 100644 .changeset/sixty-insects-watch.md delete mode 100644 .changeset/slow-buses-own.md delete mode 100644 .changeset/slow-kiwis-hide.md delete mode 100644 .changeset/slow-sloths-retire.md delete mode 100644 .changeset/smart-meals-join.md delete mode 100644 .changeset/smart-needles-move.md delete mode 100644 .changeset/smart-olives-eat.md delete mode 100644 .changeset/sour-pugs-teach.md delete mode 100644 .changeset/spicy-frogs-remain.md delete mode 100644 .changeset/spicy-lamps-smoke.md delete mode 100644 .changeset/spicy-terms-bow.md delete mode 100644 .changeset/stale-actors-camp.md delete mode 100644 .changeset/strange-cobras-bake.md delete mode 100644 .changeset/strange-ghosts-matter.md delete mode 100644 .changeset/strange-sheep-pull.md delete mode 100644 .changeset/strong-lemons-add.md delete mode 100644 .changeset/strong-owls-know.md delete mode 100644 .changeset/strong-phones-smoke.md delete mode 100644 .changeset/strong-years-help.md delete mode 100644 .changeset/stupid-adults-sniff.md delete mode 100644 .changeset/stupid-bulldogs-applaud.md delete mode 100644 .changeset/sweet-ducks-remember.md delete mode 100644 .changeset/sweet-lizards-press.md delete mode 100644 .changeset/swift-dragons-peel.md delete mode 100644 .changeset/tall-bees-wave.md delete mode 100644 .changeset/tall-masks-repeat.md delete mode 100644 .changeset/tame-apricots-clap.md delete mode 100644 .changeset/tame-guests-know.md delete mode 100644 .changeset/tender-moose-tell.md delete mode 100644 .changeset/tender-oranges-rhyme.md delete mode 100644 .changeset/tender-turkeys-compete.md delete mode 100644 .changeset/thick-carrots-sneeze.md delete mode 100644 .changeset/thick-trains-work.md delete mode 100644 .changeset/thin-parents-heal.md delete mode 100644 .changeset/thirty-hotels-raise.md delete mode 100644 .changeset/thirty-islands-kiss.md delete mode 100644 .changeset/tidy-balloons-suffer.md delete mode 100644 .changeset/tidy-dryers-sleep.md delete mode 100644 .changeset/tidy-pets-smell.md delete mode 100644 .changeset/tidy-roses-guess.md delete mode 100644 .changeset/tidy-tomatoes-explain.md delete mode 100644 .changeset/tiny-doors-type.md delete mode 100644 .changeset/tiny-elephants-scream.md delete mode 100644 .changeset/tricky-bulldogs-heal.md delete mode 100644 .changeset/tricky-keys-attack.md delete mode 100644 .changeset/tricky-ladybugs-unite.md delete mode 100644 .changeset/twelve-knives-notice.md delete mode 100644 .changeset/twenty-seahorses-admire.md delete mode 100644 .changeset/two-pumas-wait.md delete mode 100644 .changeset/violet-cherries-deny.md delete mode 100644 .changeset/violet-clocks-notice.md delete mode 100644 .changeset/warm-nails-jump.md delete mode 100644 .changeset/warm-olives-provide.md delete mode 100644 .changeset/warm-planes-taste.md delete mode 100644 .changeset/wise-pens-agree.md delete mode 100644 .changeset/witty-dancers-smash.md delete mode 100644 .changeset/yellow-roses-arrive.md delete mode 100644 .changeset/young-jars-wait.md delete mode 100644 .changeset/young-snails-sell.md diff --git a/.changeset/afraid-sheep-joke.md b/.changeset/afraid-sheep-joke.md deleted file mode 100644 index f9ce48895..000000000 --- a/.changeset/afraid-sheep-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixes an issue with scoped packages in additionalPackages option diff --git a/.changeset/angry-eagles-trade.md b/.changeset/angry-eagles-trade.md deleted file mode 100644 index f3067d273..000000000 --- a/.changeset/angry-eagles-trade.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Fix additionalFiles that aren't decendants -- Stop swallowing uncaught exceptions in prod -- Improve warnings and errors, fail early on critical warnings -- New arg to --save-logs even for successful builds diff --git a/.changeset/angry-trees-drop.md b/.changeset/angry-trees-drop.md deleted file mode 100644 index 405bcbbb7..000000000 --- a/.changeset/angry-trees-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Increase span attribute value length limit to 2048 diff --git a/.changeset/beige-pears-explode.md b/.changeset/beige-pears-explode.md deleted file mode 100644 index 77eadc4d1..000000000 --- a/.changeset/beige-pears-explode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add an e2e suite to test compiling with v3 CLI. diff --git a/.changeset/beige-pens-dance.md b/.changeset/beige-pens-dance.md deleted file mode 100644 index 49276987d..000000000 --- a/.changeset/beige-pens-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3 CLI update command and package manager detection fix diff --git a/.changeset/big-tomatoes-deliver.md b/.changeset/big-tomatoes-deliver.md deleted file mode 100644 index 695b7fc82..000000000 --- a/.changeset/big-tomatoes-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Hoist uncaughtException handler to the top of workers to better report error messages diff --git a/.changeset/breezy-gorillas-mate.md b/.changeset/breezy-gorillas-mate.md deleted file mode 100644 index ed30259b2..000000000 --- a/.changeset/breezy-gorillas-mate.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -better handle task metadata parse errors, and display nicely formatted errors diff --git a/.changeset/brown-boats-bathe.md b/.changeset/brown-boats-bathe.md deleted file mode 100644 index 17ed44e2c..000000000 --- a/.changeset/brown-boats-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Pre-pull deployment images for faster startups diff --git a/.changeset/brown-spies-burn.md b/.changeset/brown-spies-burn.md deleted file mode 100644 index df1b6dc51..000000000 --- a/.changeset/brown-spies-burn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -cli v3: increase otel force flush timeout to 30s from 500ms diff --git a/.changeset/chilled-hornets-move.md b/.changeset/chilled-hornets-move.md deleted file mode 100644 index 422954658..000000000 --- a/.changeset/chilled-hornets-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Vastly improved dev command output diff --git a/.changeset/clean-pianos-listen.md b/.changeset/clean-pianos-listen.md deleted file mode 100644 index 3d48f2a0e..000000000 --- a/.changeset/clean-pianos-listen.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -add machine config and secure zod connection diff --git a/.changeset/clever-apes-collect.md b/.changeset/clever-apes-collect.md deleted file mode 100644 index 4475abd48..000000000 --- a/.changeset/clever-apes-collect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Fix error stack traces diff --git a/.changeset/clever-carrots-travel.md b/.changeset/clever-carrots-travel.md deleted file mode 100644 index 1e4afac37..000000000 --- a/.changeset/clever-carrots-travel.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Implement task.onSuccess/onFailure and config.onSuccess/onFailure diff --git a/.changeset/clever-donkeys-hunt.md b/.changeset/clever-donkeys-hunt.md deleted file mode 100644 index d5b90d3ca..000000000 --- a/.changeset/clever-donkeys-hunt.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Remove "log" Log Level, unify log and info messages under the "info" log level diff --git a/.changeset/cool-comics-burn.md b/.changeset/cool-comics-burn.md deleted file mode 100644 index eaaf10cea..000000000 --- a/.changeset/cool-comics-burn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixing missing logs when importing client @opentelemetry/api diff --git a/.changeset/cool-glasses-bake.md b/.changeset/cool-glasses-bake.md deleted file mode 100644 index f300a9eb5..000000000 --- a/.changeset/cool-glasses-bake.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Configurable log levels in the config file and via env var diff --git a/.changeset/cuddly-feet-approve.md b/.changeset/cuddly-feet-approve.md deleted file mode 100644 index 55f476daa..000000000 --- a/.changeset/cuddly-feet-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Don’t swallow some error messages when deploying diff --git a/.changeset/cuddly-penguins-cross.md b/.changeset/cuddly-penguins-cross.md deleted file mode 100644 index c4db00256..000000000 --- a/.changeset/cuddly-penguins-cross.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@trigger.dev/sdk": major -"trigger.dev": major -"@trigger.dev/build": major -"@trigger.dev/core": major ---- - -Release 3.0.0 diff --git a/.changeset/curly-monkeys-tell.md b/.changeset/curly-monkeys-tell.md deleted file mode 100644 index f399841a2..000000000 --- a/.changeset/curly-monkeys-tell.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Prevent uncaught exceptions when handling WebSocket messages -- Improve CLI dev command WebSocket debug and error logging \ No newline at end of file diff --git a/.changeset/curvy-beers-camp.md b/.changeset/curvy-beers-camp.md deleted file mode 100644 index 04ff912cf..000000000 --- a/.changeset/curvy-beers-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixed empty env vars overriding in dev runs diff --git a/.changeset/dry-walls-check.md b/.changeset/dry-walls-check.md deleted file mode 100644 index b44fcab65..000000000 --- a/.changeset/dry-walls-check.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Add option to print console logs in the dev CLI locally (issue #1014) diff --git a/.changeset/dull-mangos-press.md b/.changeset/dull-mangos-press.md deleted file mode 100644 index 4a47479cd..000000000 --- a/.changeset/dull-mangos-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Strip out server-only package from worker builds diff --git a/.changeset/early-impalas-itch.md b/.changeset/early-impalas-itch.md deleted file mode 100644 index 5d98387e0..000000000 --- a/.changeset/early-impalas-itch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Fixes for continuing after waits diff --git a/.changeset/eight-pumas-float.md b/.changeset/eight-pumas-float.md deleted file mode 100644 index 4ff19c09f..000000000 --- a/.changeset/eight-pumas-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Fixed batch otel flushing diff --git a/.changeset/eleven-paws-join.md b/.changeset/eleven-paws-join.md deleted file mode 100644 index 441921364..000000000 --- a/.changeset/eleven-paws-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Remove the env var check during deploy (too many false negatives) diff --git a/.changeset/eleven-tips-learn.md b/.changeset/eleven-tips-learn.md deleted file mode 100644 index 2bae37ec8..000000000 --- a/.changeset/eleven-tips-learn.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -New Build System diff --git a/.changeset/famous-boats-tease.md b/.changeset/famous-boats-tease.md deleted file mode 100644 index f8f7b681b..000000000 --- a/.changeset/famous-boats-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Better handle issues with resolving dependency versions during deploy diff --git a/.changeset/fast-colts-relax.md b/.changeset/fast-colts-relax.md deleted file mode 100644 index d1d9124ce..000000000 --- a/.changeset/fast-colts-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Increase dev worker timeout diff --git a/.changeset/fast-ladybugs-eat.md b/.changeset/fast-ladybugs-eat.md deleted file mode 100644 index 41ffd294a..000000000 --- a/.changeset/fast-ladybugs-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Removed the folder/filepath from Attempt spans diff --git a/.changeset/fast-melons-listen.md b/.changeset/fast-melons-listen.md deleted file mode 100644 index 6e01de1a6..000000000 --- a/.changeset/fast-melons-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Added version to ctx.run diff --git a/.changeset/few-poems-vanish.md b/.changeset/few-poems-vanish.md deleted file mode 100644 index e72cf979b..000000000 --- a/.changeset/few-poems-vanish.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Fix trigger functions for custom queues diff --git a/.changeset/few-students-share.md b/.changeset/few-students-share.md deleted file mode 100644 index 39db08b4b..000000000 --- a/.changeset/few-students-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix permissions inside node_modules diff --git a/.changeset/fifty-lions-think.md b/.changeset/fifty-lions-think.md deleted file mode 100644 index b9b418701..000000000 --- a/.changeset/fifty-lions-think.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Improve prisma errors for missing postinstall diff --git a/.changeset/five-toes-destroy.md b/.changeset/five-toes-destroy.md deleted file mode 100644 index b07e4f91e..000000000 --- a/.changeset/five-toes-destroy.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -v3: Environment variable management API and SDK, along with resolveEnvVars CLI hook diff --git a/.changeset/flat-onions-punch.md b/.changeset/flat-onions-punch.md deleted file mode 100644 index 7bd9f8210..000000000 --- a/.changeset/flat-onions-punch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Fix return type of runs.retrieve, and allow passing the type of the task to runs.retrieve diff --git a/.changeset/friendly-walls-repair.md b/.changeset/friendly-walls-repair.md deleted file mode 100644 index 1d0514f2e..000000000 --- a/.changeset/friendly-walls-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add sox and audiowaveform binaries to worker images diff --git a/.changeset/friendly-walls-search.md b/.changeset/friendly-walls-search.md deleted file mode 100644 index 660787896..000000000 --- a/.changeset/friendly-walls-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Make sure BuildManifest is exported from @trigger.dev/build diff --git a/.changeset/funny-swans-destroy.md b/.changeset/funny-swans-destroy.md deleted file mode 100644 index b8f008b7b..000000000 --- a/.changeset/funny-swans-destroy.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Make msw a normal dependency (for now) to fix Module Not Found error in Next.js. - -It turns out that webpack will "hoist" dynamically imported modules and attempt to resolve them at build time, even though it's an optional peer dep: - -https://x.com/maverickdotdev/status/1782465214308319404 diff --git a/.changeset/gentle-planets-return.md b/.changeset/gentle-planets-return.md deleted file mode 100644 index 0ef8972d4..000000000 --- a/.changeset/gentle-planets-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Fix issue with emitDecoratorMetadata and tsconfigs with extends diff --git a/.changeset/gorgeous-cycles-guess.md b/.changeset/gorgeous-cycles-guess.md deleted file mode 100644 index 94168992f..000000000 --- a/.changeset/gorgeous-cycles-guess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -try/catch opening the login URL diff --git a/.changeset/gorgeous-gorillas-compete.md b/.changeset/gorgeous-gorillas-compete.md deleted file mode 100644 index ac8ad6078..000000000 --- a/.changeset/gorgeous-gorillas-compete.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Add runs.retrieve management API method to get info about a run by run ID diff --git a/.changeset/green-pens-battle.md b/.changeset/green-pens-battle.md deleted file mode 100644 index f51371a89..000000000 --- a/.changeset/green-pens-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix automatic opening of login URL on linux-server systems with missing xdg-open diff --git a/.changeset/hot-buckets-behave.md b/.changeset/hot-buckets-behave.md deleted file mode 100644 index 43cdb1108..000000000 --- a/.changeset/hot-buckets-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Support triggering tasks with non-URL friendly characters in the ID diff --git a/.changeset/hot-fishes-retire.md b/.changeset/hot-fishes-retire.md deleted file mode 100644 index 778a5d5d4..000000000 --- a/.changeset/hot-fishes-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -trigger.dev: patch ---- - -Fix TypeScript inclusion in tsconfig.json for `cli-v3 init` diff --git a/.changeset/hot-wasps-sin.md b/.changeset/hot-wasps-sin.md deleted file mode 100644 index c833ebb51..000000000 --- a/.changeset/hot-wasps-sin.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch -"@trigger.dev/sdk": patch ---- - -v3: Usage tracking diff --git a/.changeset/hungry-sloths-promise.md b/.changeset/hungry-sloths-promise.md deleted file mode 100644 index 77b495402..000000000 --- a/.changeset/hungry-sloths-promise.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fix issues that could result in unreezable state run crashes. Details: -- Never checkpoint between attempts -- Some messages and socket data now include attempt numbers -- Remove attempt completion replays -- Additional prod entry point logging -- Fail runs that receive deprecated (pre-lazy attempt) execute messages diff --git a/.changeset/itchy-chairs-itch.md b/.changeset/itchy-chairs-itch.md deleted file mode 100644 index 6d01a6dee..000000000 --- a/.changeset/itchy-chairs-itch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Fix for calling trigger and passing a custom queue diff --git a/.changeset/itchy-jars-pay.md b/.changeset/itchy-jars-pay.md deleted file mode 100644 index ed54cc897..000000000 --- a/.changeset/itchy-jars-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Add ffmpeg build extension diff --git a/.changeset/khaki-apricots-design.md b/.changeset/khaki-apricots-design.md deleted file mode 100644 index 17f6428e8..000000000 --- a/.changeset/khaki-apricots-design.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Retry 429, 500, and connection error API requests to the trigger.dev server diff --git a/.changeset/khaki-poems-lay.md b/.changeset/khaki-poems-lay.md deleted file mode 100644 index 59a9ba423..000000000 --- a/.changeset/khaki-poems-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Export queue from the SDK diff --git a/.changeset/large-seahorses-cheat.md b/.changeset/large-seahorses-cheat.md deleted file mode 100644 index 7bb9513f8..000000000 --- a/.changeset/large-seahorses-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Extract common trigger code into internal functions and add a tasks.batchTriggerAndWait function diff --git a/.changeset/late-icons-lie.md b/.changeset/late-icons-lie.md deleted file mode 100644 index fe3beb099..000000000 --- a/.changeset/late-icons-lie.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Display errors for runs and deployments diff --git a/.changeset/late-steaks-behave.md b/.changeset/late-steaks-behave.md deleted file mode 100644 index 9d0b94ae7..000000000 --- a/.changeset/late-steaks-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: fix digest extraction diff --git a/.changeset/lazy-files-lay.md b/.changeset/lazy-files-lay.md deleted file mode 100644 index 0cfba8cc5..000000000 --- a/.changeset/lazy-files-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Increased the timeout when canceling a checkpoint to 31s (to match the timeout on the server) diff --git a/.changeset/lemon-sloths-hide.md b/.changeset/lemon-sloths-hide.md deleted file mode 100644 index 256fc6a1e..000000000 --- a/.changeset/lemon-sloths-hide.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -v3: recover from server rate limiting errors in a more reliable way diff --git a/.changeset/light-bulldogs-press.md b/.changeset/light-bulldogs-press.md deleted file mode 100644 index 6aa1261b2..000000000 --- a/.changeset/light-bulldogs-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Changed "Worker" to "Version" in the dev command key diff --git a/.changeset/light-dragons-complain.md b/.changeset/light-dragons-complain.md deleted file mode 100644 index ebc7cea8f..000000000 --- a/.changeset/light-dragons-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Correctly handle self-hosted deploy command errors diff --git a/.changeset/little-crabs-cross.md b/.changeset/little-crabs-cross.md deleted file mode 100644 index 245e825b8..000000000 --- a/.changeset/little-crabs-cross.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fix issues with consecutive waits diff --git a/.changeset/long-feet-invent.md b/.changeset/long-feet-invent.md deleted file mode 100644 index 259829098..000000000 --- a/.changeset/long-feet-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Rollback to try and fix some dependent attempt issues diff --git a/.changeset/long-fireants-search.md b/.changeset/long-fireants-search.md deleted file mode 100644 index 46467a596..000000000 --- a/.changeset/long-fireants-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Adding some additional telemetry during deploy to help debug issues diff --git a/.changeset/long-hounds-wave.md b/.changeset/long-hounds-wave.md deleted file mode 100644 index 61b853c5c..000000000 --- a/.changeset/long-hounds-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: update @depot/cli to latest 0.0.1-cli.2.71.0 diff --git a/.changeset/loud-actors-remember.md b/.changeset/loud-actors-remember.md deleted file mode 100644 index f53652196..000000000 --- a/.changeset/loud-actors-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Default to retrying enabled in dev when running init diff --git a/.changeset/lovely-drinks-flash.md b/.changeset/lovely-drinks-flash.md deleted file mode 100644 index c1ce6c87f..000000000 --- a/.changeset/lovely-drinks-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Add the "log" level back in as an alias to "info" diff --git a/.changeset/lucky-items-film.md b/.changeset/lucky-items-film.md deleted file mode 100644 index f4b5647de..000000000 --- a/.changeset/lucky-items-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Automatically bundle internal packages that use file, link or workspace protocl diff --git a/.changeset/many-ligers-pump.md b/.changeset/many-ligers-pump.md deleted file mode 100644 index a80fcbd09..000000000 --- a/.changeset/many-ligers-pump.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Handle string and non-stringifiable outputs like functions diff --git a/.changeset/many-papayas-hope.md b/.changeset/many-papayas-hope.md deleted file mode 100644 index 8e362482d..000000000 --- a/.changeset/many-papayas-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix entry point paths on windows diff --git a/.changeset/mighty-camels-joke.md b/.changeset/mighty-camels-joke.md deleted file mode 100644 index de97b3d9c..000000000 --- a/.changeset/mighty-camels-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Improve error messages during dev/deploy and handle deploy image build issues diff --git a/.changeset/mighty-eggs-grab.md b/.changeset/mighty-eggs-grab.md deleted file mode 100644 index 964c1290b..000000000 --- a/.changeset/mighty-eggs-grab.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Tasks should now be much more robust and resilient to reconnects during crucial operations and other failure scenarios. - -Task runs now have to signal checkpointable state prior to ALL checkpoints. This ensures flushing always happens. - -All important socket.io RPCs will now be retried with backoff. Actions relying on checkpoints will be replayed if we haven't been checkpointed and restored as expected, e.g. after reconnect. - -Other changes: - -- Fix retry check in shared queue -- Fix env var sync spinner -- Heartbeat between retries -- Fix retry prep -- Fix prod worker no tasks detection -- Fail runs above `MAX_TASK_RUN_ATTEMPTS` -- Additional debug logs in all places -- Prevent crashes due to failed socket schema parsing -- Remove core-apps barrel -- Upgrade socket.io-client to fix an ACK memleak -- Additional index failure logs -- Prevent message loss during reconnect -- Prevent burst of heartbeats on reconnect -- Prevent crash on failed cleanup -- Handle at-least-once lazy execute message delivery -- Handle uncaught entry point exceptions diff --git a/.changeset/mighty-flowers-train.md b/.changeset/mighty-flowers-train.md deleted file mode 100644 index 32d4ff8e4..000000000 --- a/.changeset/mighty-flowers-train.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Adds support for `emitDecoratorMetadata: true` and `experimentalDecorators: true` in your tsconfig using the [`@anatine/esbuild-decorators`](https://github.com/anatine/esbuildnx/tree/main/packages/esbuild-decorators) package. This allows you to use libraries like TypeORM: - -```ts orm/index.ts -import "reflect-metadata"; -import { DataSource } from "typeorm"; -import { Entity, Column, PrimaryColumn } from "typeorm"; - -@Entity() -export class Photo { - @PrimaryColumn() - id!: number; - - @Column() - name!: string; - - @Column() - description!: string; - - @Column() - filename!: string; - - @Column() - views!: number; - - @Column() - isPublished!: boolean; -} - -export const AppDataSource = new DataSource({ - type: "postgres", - host: "localhost", - port: 5432, - username: "postgres", - password: "postgres", - database: "v3-catalog", - entities: [Photo], - synchronize: true, - logging: false, -}); -``` - -And then in your trigger.config.ts file you can initialize the datasource using the new `init` option: - -```ts trigger.config.ts -import type { TriggerConfig } from "@trigger.dev/sdk/v3"; -import { AppDataSource } from "@/trigger/orm"; - -export const config: TriggerConfig = { - // ... other options here - init: async (payload, { ctx }) => { - await AppDataSource.initialize(); - }, -}; -``` - -Now you are ready to use this in your tasks: - -```ts -import { task } from "@trigger.dev/sdk/v3"; -import { AppDataSource, Photo } from "./orm"; - -export const taskThatUsesDecorators = task({ - id: "taskThatUsesDecorators", - run: async (payload: { message: string }) => { - console.log("Creating a photo..."); - - const photo = new Photo(); - photo.id = 2; - photo.name = "Me and Bears"; - photo.description = "I am near polar bears"; - photo.filename = "photo-with-bears.jpg"; - photo.views = 1; - photo.isPublished = true; - - await AppDataSource.manager.save(photo); - }, -}); -``` diff --git a/.changeset/mighty-parrots-sin.md b/.changeset/mighty-parrots-sin.md deleted file mode 100644 index 8f2e5db9d..000000000 --- a/.changeset/mighty-parrots-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -v3: Remove aggressive otel flush timeouts in dev/prod diff --git a/.changeset/mighty-sheep-guess.md b/.changeset/mighty-sheep-guess.md deleted file mode 100644 index 4cceda6f4..000000000 --- a/.changeset/mighty-sheep-guess.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Support self-hosters pushing to a custom registry when running deploy diff --git a/.changeset/modern-stingrays-end.md b/.changeset/modern-stingrays-end.md deleted file mode 100644 index 4812eeda3..000000000 --- a/.changeset/modern-stingrays-end.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -v3: Trigger delayed runs and reschedule them diff --git a/.changeset/nasty-jars-pump.md b/.changeset/nasty-jars-pump.md deleted file mode 100644 index 6877c7e2e..000000000 --- a/.changeset/nasty-jars-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixes an issue that was treating v2 trigger directories as v3 diff --git a/.changeset/nervous-baboons-sin.md b/.changeset/nervous-baboons-sin.md deleted file mode 100644 index e74b7c76d..000000000 --- a/.changeset/nervous-baboons-sin.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Added config option extraCACerts to ProjectConfig type. This copies the ca file along with additionalFiles and sets NODE_EXTRA_CA_CERTS environment variable in built image as well as running the task. diff --git a/.changeset/nervous-planets-sparkle.md b/.changeset/nervous-planets-sparkle.md deleted file mode 100644 index 24b61117b..000000000 --- a/.changeset/nervous-planets-sparkle.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Improve non-zero exit code error messages -- Detect OOM conditions within worker child processes -- Internal errors can have optional stack traces -- Docker provider can be set to enforce machine presets \ No newline at end of file diff --git a/.changeset/nervous-seas-shave.md b/.changeset/nervous-seas-shave.md deleted file mode 100644 index ca9d75dd0..000000000 --- a/.changeset/nervous-seas-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -v3: Export AbortTaskRunError from @trigger.dev/sdk/v3 diff --git a/.changeset/new-items-glow.md b/.changeset/new-items-glow.md deleted file mode 100644 index 6453aa00b..000000000 --- a/.changeset/new-items-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -OTEL attributes can include Dates that will be formatted as ISO strings diff --git a/.changeset/new-pants-beg.md b/.changeset/new-pants-beg.md deleted file mode 100644 index e484742c9..000000000 --- a/.changeset/new-pants-beg.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Fix issue when using SDK in non-node environments by scoping the stream import with node: diff --git a/.changeset/new-rivers-tell.md b/.changeset/new-rivers-tell.md deleted file mode 100644 index 4920e868c..000000000 --- a/.changeset/new-rivers-tell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Added replayRun function to the SDK diff --git a/.changeset/nice-bulldogs-turn.md b/.changeset/nice-bulldogs-turn.md deleted file mode 100644 index f58877e8a..000000000 --- a/.changeset/nice-bulldogs-turn.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Better handle uncaught exceptions diff --git a/.changeset/ninety-countries-swim.md b/.changeset/ninety-countries-swim.md deleted file mode 100644 index 417a6a6e0..000000000 --- a/.changeset/ninety-countries-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add --runtime option to the init CLI command diff --git a/.changeset/ninety-pets-travel.md b/.changeset/ninety-pets-travel.md deleted file mode 100644 index a55212cb0..000000000 --- a/.changeset/ninety-pets-travel.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Improve the SDK function types and expose a new APIError instead of the APIResult type diff --git a/.changeset/odd-beds-wonder.md b/.changeset/odd-beds-wonder.md deleted file mode 100644 index 6bd33089d..000000000 --- a/.changeset/odd-beds-wonder.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -You can now add tags to runs and list runs using them diff --git a/.changeset/odd-poets-own.md b/.changeset/odd-poets-own.md deleted file mode 100644 index 399ab3006..000000000 --- a/.changeset/odd-poets-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Added a Node.js runtime check for the CLI diff --git a/.changeset/old-feet-brush.md b/.changeset/old-feet-brush.md deleted file mode 100644 index caaaa6a5e..000000000 --- a/.changeset/old-feet-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -trigger.dev init now adds @trigger.dev/build to devDependencies diff --git a/.changeset/pink-pumas-rhyme.md b/.changeset/pink-pumas-rhyme.md deleted file mode 100644 index e9c556718..000000000 --- a/.changeset/pink-pumas-rhyme.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Add configure function to be able to configure the SDK manually diff --git a/.changeset/plenty-ducks-beam.md b/.changeset/plenty-ducks-beam.md deleted file mode 100644 index b98dea5bc..000000000 --- a/.changeset/plenty-ducks-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Output stderr logs on dev worker failure diff --git a/.changeset/polite-ducks-switch.md b/.changeset/polite-ducks-switch.md deleted file mode 100644 index 0b875b5b6..000000000 --- a/.changeset/polite-ducks-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix post start hooks diff --git a/.changeset/polite-pears-grow.md b/.changeset/polite-pears-grow.md deleted file mode 100644 index 67fe3f17c..000000000 --- a/.changeset/polite-pears-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Use global setTimeout to ensure cross-runtime support diff --git a/.changeset/polite-pots-walk.md b/.changeset/polite-pots-walk.md deleted file mode 100644 index 3d274956e..000000000 --- a/.changeset/polite-pots-walk.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add e2e fixtures corresponding to past issues -Implement e2e suite parallelism -Enhance log level for specific e2e suite messages diff --git a/.changeset/polite-rockets-matter.md b/.changeset/polite-rockets-matter.md deleted file mode 100644 index 51ef55f3f..000000000 --- a/.changeset/polite-rockets-matter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix dev CLI output when not printing update messages diff --git a/.changeset/poor-flowers-cross.md b/.changeset/poor-flowers-cross.md deleted file mode 100644 index 1a4ffeadb..000000000 --- a/.changeset/poor-flowers-cross.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Use the dashboard url instead of the API url for the View logs link diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index a9c272441..000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "mode": "exit", - "tag": "beta", - "initialVersions": { - "coordinator": "0.0.1", - "docker-provider": "0.0.1", - "kubernetes-provider": "0.0.1", - "proxy": "0.0.11", - "webapp": "1.0.0", - "yalt": "0.0.1", - "trigger.dev": "2.3.18", - "@trigger.dev/core": "2.3.18", - "@trigger.dev/database": "0.0.1", - "emails": "1.0.0", - "@trigger.dev/otlp-importer": "2.3.11", - "@trigger.dev/sdk": "2.3.18" - }, - "changesets": [ - "afraid-sheep-joke", - "angry-eagles-trade", - "angry-trees-drop", - "beige-pears-explode", - "beige-pens-dance", - "big-tomatoes-deliver", - "breezy-gorillas-mate", - "brown-boats-bathe", - "brown-spies-burn", - "chilled-hornets-move", - "clean-pianos-listen", - "clever-apes-collect", - "clever-carrots-travel", - "clever-donkeys-hunt", - "cool-comics-burn", - "cool-glasses-bake", - "cuddly-feet-approve", - "curly-monkeys-tell", - "dry-walls-check", - "dull-mangos-press", - "early-impalas-itch", - "eight-pumas-float", - "eleven-paws-join", - "famous-boats-tease", - "fast-colts-relax", - "fast-melons-listen", - "few-poems-vanish", - "few-students-share", - "fifty-lions-think", - "five-toes-destroy", - "flat-onions-punch", - "friendly-walls-repair", - "funny-swans-destroy", - "gorgeous-cycles-guess", - "gorgeous-gorillas-compete", - "green-pens-battle", - "hot-buckets-behave", - "hot-fishes-retire", - "hot-wasps-sin", - "hungry-sloths-promise", - "itchy-chairs-itch", - "khaki-apricots-design", - "khaki-poems-lay", - "large-seahorses-cheat", - "late-icons-lie", - "late-steaks-behave", - "lazy-files-lay", - "lemon-sloths-hide", - "light-bulldogs-press", - "light-dragons-complain", - "little-crabs-cross", - "long-feet-invent", - "long-fireants-search", - "long-hounds-wave", - "loud-actors-remember", - "lovely-drinks-flash", - "lucky-items-film", - "many-ligers-pump", - "mighty-camels-joke", - "mighty-eggs-grab", - "mighty-flowers-train", - "mighty-parrots-sin", - "modern-stingrays-end", - "nasty-jars-pump", - "nervous-baboons-sin", - "nervous-planets-sparkle", - "nervous-seas-shave", - "new-pants-beg", - "new-rivers-tell", - "nice-bulldogs-turn", - "ninety-pets-travel", - "odd-beds-wonder", - "odd-poets-own", - "pink-pumas-rhyme", - "plenty-ducks-beam", - "polite-ducks-switch", - "polite-pears-grow", - "polite-pots-walk", - "polite-rockets-matter", - "poor-flowers-cross", - "purple-garlics-shop", - "purple-spiders-care", - "rare-lamps-promise", - "rare-roses-float", - "real-planets-stare", - "rich-kangaroos-unite", - "rotten-beers-refuse", - "rotten-dryers-exercise", - "rude-toys-compare", - "selfish-ducks-sort", - "serious-hats-rest", - "shaggy-spoons-taste", - "shaggy-weeks-live", - "sharp-emus-compare", - "sharp-zebras-serve", - "shiny-coats-cry", - "silly-buses-obey", - "silly-forks-kiss", - "silly-suits-switch", - "silver-doors-juggle", - "six-ligers-exist", - "six-rats-hunt", - "sixty-insects-watch", - "slow-buses-own", - "slow-kiwis-hide", - "slow-sloths-retire", - "smart-needles-move", - "smart-olives-eat", - "sour-pugs-teach", - "spicy-frogs-remain", - "spicy-lamps-smoke", - "spicy-terms-bow", - "strange-ghosts-matter", - "strange-sheep-pull", - "strong-lemons-add", - "strong-owls-know", - "strong-phones-smoke", - "stupid-adults-sniff", - "stupid-bulldogs-applaud", - "sweet-ducks-remember", - "sweet-lizards-press", - "swift-dragons-peel", - "tall-bees-wave", - "tall-masks-repeat", - "tame-apricots-clap", - "tame-guests-know", - "tender-moose-tell", - "tender-oranges-rhyme", - "tender-turkeys-compete", - "thick-carrots-sneeze", - "thin-parents-heal", - "thirty-hotels-raise", - "thirty-islands-kiss", - "tidy-balloons-suffer", - "tidy-dryers-sleep", - "tidy-tomatoes-explain", - "tiny-doors-type", - "tiny-elephants-scream", - "tricky-bulldogs-heal", - "tricky-keys-attack", - "tricky-ladybugs-unite", - "twelve-knives-notice", - "two-pumas-wait", - "violet-clocks-notice", - "warm-olives-provide", - "warm-planes-taste", - "yellow-roses-arrive", - "young-jars-wait", - "young-snails-sell" - ] -} diff --git a/.changeset/proud-dogs-battle.md b/.changeset/proud-dogs-battle.md deleted file mode 100644 index 66e3966ee..000000000 --- a/.changeset/proud-dogs-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Add support for prisma typed sql diff --git a/.changeset/purple-garlics-shop.md b/.changeset/purple-garlics-shop.md deleted file mode 100644 index 0d4be024f..000000000 --- a/.changeset/purple-garlics-shop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add typescript as a dependency so the esbuild-decorator will work even when running in npx diff --git a/.changeset/purple-spiders-care.md b/.changeset/purple-spiders-care.md deleted file mode 100644 index c73d3383b..000000000 --- a/.changeset/purple-spiders-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Await file watcher cleanup in dev diff --git a/.changeset/rare-lamps-promise.md b/.changeset/rare-lamps-promise.md deleted file mode 100644 index 16c0bd3d1..000000000 --- a/.changeset/rare-lamps-promise.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Add a postInstall option to allow running scripts after dependencies have been installed in deployed images diff --git a/.changeset/rare-roses-float.md b/.changeset/rare-roses-float.md deleted file mode 100644 index f5ab9210a..000000000 --- a/.changeset/rare-roses-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add openssl to prod worker image and allow passing auth token via env var for deploy diff --git a/.changeset/real-planets-stare.md b/.changeset/real-planets-stare.md deleted file mode 100644 index 6549f06bd..000000000 --- a/.changeset/real-planets-stare.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fixed incorrect span timings around checkpoints by implementing a precise wall clock that resets after restores diff --git a/.changeset/rich-kangaroos-unite.md b/.changeset/rich-kangaroos-unite.md deleted file mode 100644 index 41044052a..000000000 --- a/.changeset/rich-kangaroos-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix a bug where revoking the CLI token would prevent you from ever logging in again with the CLI. diff --git a/.changeset/rotten-beers-refuse.md b/.changeset/rotten-beers-refuse.md deleted file mode 100644 index 94e841e57..000000000 --- a/.changeset/rotten-beers-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add git to prod worker image which fixes private package installs diff --git a/.changeset/rotten-dryers-exercise.md b/.changeset/rotten-dryers-exercise.md deleted file mode 100644 index ef6ecb2ef..000000000 --- a/.changeset/rotten-dryers-exercise.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Adding task with a triggerSource of schedule diff --git a/.changeset/rotten-eggs-occur.md b/.changeset/rotten-eggs-occur.md deleted file mode 100644 index 35203e028..000000000 --- a/.changeset/rotten-eggs-occur.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/build": patch -"@trigger.dev/core": patch ---- - -Added support for custom esbuild plugins diff --git a/.changeset/rude-houses-promise.md b/.changeset/rude-houses-promise.md deleted file mode 100644 index 4cda1cde3..000000000 --- a/.changeset/rude-houses-promise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix --project-ref when running deploy diff --git a/.changeset/rude-toys-compare.md b/.changeset/rude-toys-compare.md deleted file mode 100644 index d04a6bf43..000000000 --- a/.changeset/rude-toys-compare.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Capture and display stderr on index failures diff --git a/.changeset/selfish-ducks-sort.md b/.changeset/selfish-ducks-sort.md deleted file mode 100644 index f93647246..000000000 --- a/.changeset/selfish-ducks-sort.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch ---- - -Lock SDK and CLI deps on exact core version diff --git a/.changeset/serious-hats-rest.md b/.changeset/serious-hats-rest.md deleted file mode 100644 index cf33da91b..000000000 --- a/.changeset/serious-hats-rest.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: [prod] force flush timeout should be 1s diff --git a/.changeset/shaggy-spoons-taste.md b/.changeset/shaggy-spoons-taste.md deleted file mode 100644 index c0f179608..000000000 --- a/.changeset/shaggy-spoons-taste.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Updates the `trigger`, `batchTrigger` and their `*AndWait` variants to use the first parameter for the payload/items, and the second parameter for options. - -Before: - -```ts -await yourTask.trigger({ payload: { foo: "bar" }, options: { idempotencyKey: "key_1234" } }); -await yourTask.triggerAndWait({ payload: { foo: "bar" }, options: { idempotencyKey: "key_1234" } }); - -await yourTask.batchTrigger({ items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }] }); -await yourTask.batchTriggerAndWait({ items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }] }); -``` - -After: - -```ts -await yourTask.trigger({ foo: "bar" }, { idempotencyKey: "key_1234" }); -await yourTask.triggerAndWait({ foo: "bar" }, { idempotencyKey: "key_1234" }); - -await yourTask.batchTrigger([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); -await yourTask.batchTriggerAndWait([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); -``` - -We've also changed the API of the `triggerAndWait` result. Before, if the subtask that was triggered finished with an error, we would automatically "rethrow" the error in the parent task. - -Now instead we're returning a `TaskRunResult` object that allows you to discriminate between successful and failed runs in the subtask: - -Before: - -```ts -try { - const result = await yourTask.triggerAndWait({ foo: "bar" }); - - // result is the output of your task - console.log("result", result); - -} catch (error) { - // handle subtask errors here -} -``` - -After: - -```ts -const result = await yourTask.triggerAndWait({ foo: "bar" }); - -if (result.ok) { - console.log(`Run ${result.id} succeeded with output`, result.output); -} else { - console.log(`Run ${result.id} failed with error`, result.error); -} -``` diff --git a/.changeset/shaggy-weeks-live.md b/.changeset/shaggy-weeks-live.md deleted file mode 100644 index fbc31dd5f..000000000 --- a/.changeset/shaggy-weeks-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -v3: sanitize errors with null unicode characters in some places diff --git a/.changeset/sharp-emus-compare.md b/.changeset/sharp-emus-compare.md deleted file mode 100644 index 6b42c6b71..000000000 --- a/.changeset/sharp-emus-compare.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -When using idempotency keys, triggerAndWait and batchTriggerAndWait will still work even if the existing runs have already been completed (or even partially completed, in the case of batchTriggerAndWait) - -- TaskRunExecutionResult.id is now the run friendlyId, not the attempt friendlyId -- A single TaskRun can now have many batchItems, in the case of batchTriggerAndWait while using idempotency keys -- A run’s idempotencyKey is now added to the ctx as well as the TaskEvent and displayed in the span view -- When resolving batchTriggerAndWait, the runtimes no longer reject promises, leading to an error in the parent task - diff --git a/.changeset/sharp-zebras-serve.md b/.changeset/sharp-zebras-serve.md deleted file mode 100644 index 00d87c1b3..000000000 --- a/.changeset/sharp-zebras-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Update trigger.dev CLI for new batch otel support diff --git a/.changeset/shiny-coats-cry.md b/.changeset/shiny-coats-cry.md deleted file mode 100644 index 7d4b3510d..000000000 --- a/.changeset/shiny-coats-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add additional logging around cleaning up dev workers, and always kill them after 5 seconds if they haven't already exited diff --git a/.changeset/silly-buses-obey.md b/.changeset/silly-buses-obey.md deleted file mode 100644 index a3045ed0d..000000000 --- a/.changeset/silly-buses-obey.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Add callback to checkpoint created message diff --git a/.changeset/silly-forks-kiss.md b/.changeset/silly-forks-kiss.md deleted file mode 100644 index 4f7308bfb..000000000 --- a/.changeset/silly-forks-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: Copy over more of the project's package.json keys into the deployed package.json (support for custom config like zenstack) diff --git a/.changeset/silly-suits-switch.md b/.changeset/silly-suits-switch.md deleted file mode 100644 index e2f6c696a..000000000 --- a/.changeset/silly-suits-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix package builds and CLI commands on Windows diff --git a/.changeset/silver-doors-juggle.md b/.changeset/silver-doors-juggle.md deleted file mode 100644 index bc758bba3..000000000 --- a/.changeset/silver-doors-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Make deduplicationKey required when creating/updating a schedule diff --git a/.changeset/six-ligers-exist.md b/.changeset/six-ligers-exist.md deleted file mode 100644 index b021e43de..000000000 --- a/.changeset/six-ligers-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Improve the display of non-object return types in the run trace viewer diff --git a/.changeset/six-rats-hunt.md b/.changeset/six-rats-hunt.md deleted file mode 100644 index 44b89ad61..000000000 --- a/.changeset/six-rats-hunt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Improved ESM module require error detection logic diff --git a/.changeset/sixty-insects-watch.md b/.changeset/sixty-insects-watch.md deleted file mode 100644 index 292255f4a..000000000 --- a/.changeset/sixty-insects-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Set the deploy timeout to 3mins from 1min diff --git a/.changeset/slow-buses-own.md b/.changeset/slow-buses-own.md deleted file mode 100644 index 68c6830dd..000000000 --- a/.changeset/slow-buses-own.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Move to our global system from AsyncLocalStorage for the current task context storage diff --git a/.changeset/slow-kiwis-hide.md b/.changeset/slow-kiwis-hide.md deleted file mode 100644 index 6b9d0cfca..000000000 --- a/.changeset/slow-kiwis-hide.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -v3: vercel edge runtime support diff --git a/.changeset/slow-sloths-retire.md b/.changeset/slow-sloths-retire.md deleted file mode 100644 index 507d836d9..000000000 --- a/.changeset/slow-sloths-retire.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -- Fix uncaught provider exception -- Remove unused provider messages diff --git a/.changeset/smart-meals-join.md b/.changeset/smart-meals-join.md deleted file mode 100644 index 96ce13fd2..000000000 --- a/.changeset/smart-meals-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Support custom config file names & paths diff --git a/.changeset/smart-needles-move.md b/.changeset/smart-needles-move.md deleted file mode 100644 index 78b67eac0..000000000 --- a/.changeset/smart-needles-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Remove unimplemented batchOptions diff --git a/.changeset/smart-olives-eat.md b/.changeset/smart-olives-eat.md deleted file mode 100644 index 70a15ba25..000000000 --- a/.changeset/smart-olives-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix CLI logout and add list-profiles command diff --git a/.changeset/sour-pugs-teach.md b/.changeset/sour-pugs-teach.md deleted file mode 100644 index 372b75793..000000000 --- a/.changeset/sour-pugs-teach.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -v3: fix otel flushing causing CLEANUP ack timeout errors by always setting a forceFlushTimeoutMillis value diff --git a/.changeset/spicy-frogs-remain.md b/.changeset/spicy-frogs-remain.md deleted file mode 100644 index 6eeba34a2..000000000 --- a/.changeset/spicy-frogs-remain.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"trigger.dev": patch ---- - -- Prevent downgrades during update check and advise to upgrade CLI -- Detect bun and use npm instead -- During init, fail early and advise if not a TypeScript project -- During init, allow specifying custom package manager args -- Add links to dev worker started message -- Fix links in unsupported terminals \ No newline at end of file diff --git a/.changeset/spicy-lamps-smoke.md b/.changeset/spicy-lamps-smoke.md deleted file mode 100644 index 4b17e8b5c..000000000 --- a/.changeset/spicy-lamps-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixing an issue with bundling @trigger.dev/core/v3 in dev when using pnpm diff --git a/.changeset/spicy-terms-bow.md b/.changeset/spicy-terms-bow.md deleted file mode 100644 index e36a79424..000000000 --- a/.changeset/spicy-terms-bow.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"trigger.dev": patch ---- - -- Fix init command SDK pinning -- Show --api-url / -a flag where needed -- CLI now also respects `TRIGGER_TELEMETRY_DISABLED` -- Dedicated docker checkpoint test function \ No newline at end of file diff --git a/.changeset/stale-actors-camp.md b/.changeset/stale-actors-camp.md deleted file mode 100644 index ac5462046..000000000 --- a/.changeset/stale-actors-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Add triggerAndWait().unwrap() to more easily get at the output or throw the subtask error diff --git a/.changeset/strange-cobras-bake.md b/.changeset/strange-cobras-bake.md deleted file mode 100644 index db2bc4dba..000000000 --- a/.changeset/strange-cobras-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Always insert the dirs option when initializing a new project in the trigger.config.ts diff --git a/.changeset/strange-ghosts-matter.md b/.changeset/strange-ghosts-matter.md deleted file mode 100644 index 0476de6b7..000000000 --- a/.changeset/strange-ghosts-matter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Added DEBUG to the ignored env vars diff --git a/.changeset/strange-sheep-pull.md b/.changeset/strange-sheep-pull.md deleted file mode 100644 index 518a7949b..000000000 --- a/.changeset/strange-sheep-pull.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -v2: Better handle recovering from platform communication errors by auto-yielding back to the platform in case of temporary API failures diff --git a/.changeset/strong-lemons-add.md b/.changeset/strong-lemons-add.md deleted file mode 100644 index 98be7e8e5..000000000 --- a/.changeset/strong-lemons-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Make optional schedule object fields nullish diff --git a/.changeset/strong-owls-know.md b/.changeset/strong-owls-know.md deleted file mode 100644 index 2cb3e37e7..000000000 --- a/.changeset/strong-owls-know.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -When a v2 run hits the rate limit, reschedule with the reset date diff --git a/.changeset/strong-phones-smoke.md b/.changeset/strong-phones-smoke.md deleted file mode 100644 index 3188c7303..000000000 --- a/.changeset/strong-phones-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -fix: allow command login to read api url from cli args diff --git a/.changeset/strong-years-help.md b/.changeset/strong-years-help.md deleted file mode 100644 index 20d4194e6..000000000 --- a/.changeset/strong-years-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixed stuck runs when a child run fails with a process exit diff --git a/.changeset/stupid-adults-sniff.md b/.changeset/stupid-adults-sniff.md deleted file mode 100644 index 02fefb363..000000000 --- a/.changeset/stupid-adults-sniff.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Management SDK overhaul and adding the runs.list API diff --git a/.changeset/stupid-bulldogs-applaud.md b/.changeset/stupid-bulldogs-applaud.md deleted file mode 100644 index 4c88d54a9..000000000 --- a/.changeset/stupid-bulldogs-applaud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixed an issue where the trigger.dev package was not being built before publishing to npm diff --git a/.changeset/sweet-ducks-remember.md b/.changeset/sweet-ducks-remember.md deleted file mode 100644 index e3a1059d6..000000000 --- a/.changeset/sweet-ducks-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -v3: Adding SDK functions for triggering tasks in a typesafe way, without importing task file diff --git a/.changeset/sweet-lizards-press.md b/.changeset/sweet-lizards-press.md deleted file mode 100644 index cfa8a59bd..000000000 --- a/.changeset/sweet-lizards-press.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": major -"@trigger.dev/core": major -"@trigger.dev/sdk": major ---- - -Updates to support Trigger.dev v3 diff --git a/.changeset/swift-dragons-peel.md b/.changeset/swift-dragons-peel.md deleted file mode 100644 index 6d649605e..000000000 --- a/.changeset/swift-dragons-peel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Added JSDocs to the schedule SDK types diff --git a/.changeset/tall-bees-wave.md b/.changeset/tall-bees-wave.md deleted file mode 100644 index 57fd02c1d..000000000 --- a/.changeset/tall-bees-wave.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Dynamically import superjson and fix some bundling issues diff --git a/.changeset/tall-masks-repeat.md b/.changeset/tall-masks-repeat.md deleted file mode 100644 index 745a1237c..000000000 --- a/.changeset/tall-masks-repeat.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Fix artifact detection logs -- Fix OOM detection and error messages -- Add test link to cli deployment completion diff --git a/.changeset/tame-apricots-clap.md b/.changeset/tame-apricots-clap.md deleted file mode 100644 index 949229bbb..000000000 --- a/.changeset/tame-apricots-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: postInstall config option now replaces the postinstall script found in package.json diff --git a/.changeset/tame-guests-know.md b/.changeset/tame-guests-know.md deleted file mode 100644 index daf2733ca..000000000 --- a/.changeset/tame-guests-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Changed the binary name from trigger.dev to triggerdev to fix a Windows issue diff --git a/.changeset/tender-moose-tell.md b/.changeset/tender-moose-tell.md deleted file mode 100644 index 43a14bdcb..000000000 --- a/.changeset/tender-moose-tell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Use locked package versions when resolving dependencies in deployed workers diff --git a/.changeset/tender-oranges-rhyme.md b/.changeset/tender-oranges-rhyme.md deleted file mode 100644 index cdd464549..000000000 --- a/.changeset/tender-oranges-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Stop swallowing deployment errors and display them better diff --git a/.changeset/tender-turkeys-compete.md b/.changeset/tender-turkeys-compete.md deleted file mode 100644 index 89ba4040c..000000000 --- a/.changeset/tender-turkeys-compete.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Added timezone support to schedules diff --git a/.changeset/thick-carrots-sneeze.md b/.changeset/thick-carrots-sneeze.md deleted file mode 100644 index 9e82d0a56..000000000 --- a/.changeset/thick-carrots-sneeze.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/core": patch -"@trigger.dev/sdk": patch ---- - -v3: Include presigned urls for downloading large payloads and outputs when using runs.retrieve diff --git a/.changeset/thick-trains-work.md b/.changeset/thick-trains-work.md deleted file mode 100644 index 5d70a2278..000000000 --- a/.changeset/thick-trains-work.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Add aptGet build extension to easily add system packages to install diff --git a/.changeset/thin-parents-heal.md b/.changeset/thin-parents-heal.md deleted file mode 100644 index b9a292b81..000000000 --- a/.changeset/thin-parents-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Ensure @trigger.dev/sdk and @trigger.dev/core are always in the list of deployed dependencies diff --git a/.changeset/thirty-hotels-raise.md b/.changeset/thirty-hotels-raise.md deleted file mode 100644 index c22e0038d..000000000 --- a/.changeset/thirty-hotels-raise.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Added declarative cron schedules diff --git a/.changeset/thirty-islands-kiss.md b/.changeset/thirty-islands-kiss.md deleted file mode 100644 index c510d8c97..000000000 --- a/.changeset/thirty-islands-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix for typo in v3 CLI login command diff --git a/.changeset/tidy-balloons-suffer.md b/.changeset/tidy-balloons-suffer.md deleted file mode 100644 index 616041932..000000000 --- a/.changeset/tidy-balloons-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Init command was failing on Windows because of bad template paths diff --git a/.changeset/tidy-dryers-sleep.md b/.changeset/tidy-dryers-sleep.md deleted file mode 100644 index 015282f6a..000000000 --- a/.changeset/tidy-dryers-sleep.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fixes an issue that caused failed tasks when resuming after calling `triggerAndWait` or `batchTriggerAndWait` in prod/staging (this doesn't effect dev). - -The version of Node.js we use for deployed workers (latest 20) would crash with an out-of-memory error when the checkpoint was restored. This crash does not happen on Node 18x or Node21x, so we've decided to upgrade the worker version to Node.js21x, to mitigate this issue. - -You'll need to re-deploy to production to fix the issue. diff --git a/.changeset/tidy-pets-smell.md b/.changeset/tidy-pets-smell.md deleted file mode 100644 index c4e04e4f9..000000000 --- a/.changeset/tidy-pets-smell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fix for when a log flush times out and the process is checkpointed diff --git a/.changeset/tidy-roses-guess.md b/.changeset/tidy-roses-guess.md deleted file mode 100644 index 7cb7473f9..000000000 --- a/.changeset/tidy-roses-guess.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Add remote forced externals system, in case we come across another package that cannot be bundled (spurred on by header-generator) diff --git a/.changeset/tidy-tomatoes-explain.md b/.changeset/tidy-tomatoes-explain.md deleted file mode 100644 index 9243df477..000000000 --- a/.changeset/tidy-tomatoes-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace diff --git a/.changeset/tiny-doors-type.md b/.changeset/tiny-doors-type.md deleted file mode 100644 index 3c58eb9a3..000000000 --- a/.changeset/tiny-doors-type.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Added cancelRun to the SDK diff --git a/.changeset/tiny-elephants-scream.md b/.changeset/tiny-elephants-scream.md deleted file mode 100644 index 4656e154d..000000000 --- a/.changeset/tiny-elephants-scream.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Add graceful exit for prod workers -- Prevent overflow in long waits diff --git a/.changeset/tricky-bulldogs-heal.md b/.changeset/tricky-bulldogs-heal.md deleted file mode 100644 index 7ab6af960..000000000 --- a/.changeset/tricky-bulldogs-heal.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Added a new global - Task Catalog - to better handle task metadata diff --git a/.changeset/tricky-keys-attack.md b/.changeset/tricky-keys-attack.md deleted file mode 100644 index 271096497..000000000 --- a/.changeset/tricky-keys-attack.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -- Clear paused states before retry -- Detect and handle unrecoverable worker errors -- Remove checkpoints after successful push -- Permanently switch to DO hosted busybox image -- Fix IPC timeout issue, or at least handle it more gracefully -- Handle checkpoint failures -- Basic chaos monkey for checkpoint testing -- Stack traces are back in the dashboard -- Display final errors on root span diff --git a/.changeset/tricky-ladybugs-unite.md b/.changeset/tricky-ladybugs-unite.md deleted file mode 100644 index fafd66110..000000000 --- a/.changeset/tricky-ladybugs-unite.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Extracting out all the non-SDK related features from the main @trigger.dev/core/v3 export diff --git a/.changeset/twelve-knives-notice.md b/.changeset/twelve-knives-notice.md deleted file mode 100644 index a9f746ef5..000000000 --- a/.changeset/twelve-knives-notice.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -v3: fix missing init output in task run function when no middleware is defined diff --git a/.changeset/twenty-seahorses-admire.md b/.changeset/twenty-seahorses-admire.md deleted file mode 100644 index 38f9220de..000000000 --- a/.changeset/twenty-seahorses-admire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -Remove msw and retry.interceptFetch diff --git a/.changeset/two-pumas-wait.md b/.changeset/two-pumas-wait.md deleted file mode 100644 index 0c1c8e89f..000000000 --- a/.changeset/two-pumas-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add support for tasks located in subdirectories inside trigger dirs diff --git a/.changeset/violet-cherries-deny.md b/.changeset/violet-cherries-deny.md deleted file mode 100644 index e3412e197..000000000 --- a/.changeset/violet-cherries-deny.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -fix node10 moduleResolution in @trigger.dev/core diff --git a/.changeset/violet-clocks-notice.md b/.changeset/violet-clocks-notice.md deleted file mode 100644 index 6e614f17e..000000000 --- a/.changeset/violet-clocks-notice.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix jsonc-parser import diff --git a/.changeset/warm-nails-jump.md b/.changeset/warm-nails-jump.md deleted file mode 100644 index 21f5c19dd..000000000 --- a/.changeset/warm-nails-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Added new @trigger.dev/build package that currently has all the build extensions diff --git a/.changeset/warm-olives-provide.md b/.changeset/warm-olives-provide.md deleted file mode 100644 index b57d242a5..000000000 --- a/.changeset/warm-olives-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Improve handling of IPC timeouts and fix checkpoint cancellation after failures diff --git a/.changeset/warm-planes-taste.md b/.changeset/warm-planes-taste.md deleted file mode 100644 index baef6d88c..000000000 --- a/.changeset/warm-planes-taste.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"trigger.dev": patch ---- - -v3: Prevent legacy-peer-deps=true from breaking deploys - -When a global `.npmrc` file includes `legacy-peer-deps=true`, deploys would fail on the `npm ci` step because the package-lock.json wouldn't match the `package.json` file. This is because inside the image build, the `.npmrc` file would not be picked up and so `legacy-peer-deps` would end up being false (which is the default). This change forces the `package-lock.json` file to be created using `legacy-peer-deps=false` diff --git a/.changeset/wise-pens-agree.md b/.changeset/wise-pens-agree.md deleted file mode 100644 index 09378b6c7..000000000 --- a/.changeset/wise-pens-agree.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Only import import-in-the-middle hook if there are instrumented packages diff --git a/.changeset/witty-dancers-smash.md b/.changeset/witty-dancers-smash.md deleted file mode 100644 index 5dba43f5d..000000000 --- a/.changeset/witty-dancers-smash.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Support for custom conditions diff --git a/.changeset/yellow-roses-arrive.md b/.changeset/yellow-roses-arrive.md deleted file mode 100644 index 41ee2aed0..000000000 --- a/.changeset/yellow-roses-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Add more package exports that can be used from the web app diff --git a/.changeset/young-jars-wait.md b/.changeset/young-jars-wait.md deleted file mode 100644 index d907cc44d..000000000 --- a/.changeset/young-jars-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fix various e2e issues for 'resolve-legacy-peer-deps' fixture, installation of fixture deps and lockfile-based test skipping' diff --git a/.changeset/young-snails-sell.md b/.changeset/young-snails-sell.md deleted file mode 100644 index 1b4f30821..000000000 --- a/.changeset/young-snails-sell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Increase cleanup IPC timeout diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index a1fa33163..9ff05d095 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1 +1,100 @@ # @trigger.dev/build + +## 3.0.0 + +### Major Changes + +- cf13fbdf3: Release 3.0.0 + +### Patch Changes + +- 8c690a960: Make sure BuildManifest is exported from @trigger.dev/build +- 8578c9b28: Fix issue with emitDecoratorMetadata and tsconfigs with extends +- cf13fbdf3: Add ffmpeg build extension +- 8578c9b28: Add support for prisma typed sql +- e30beb779: Added support for custom esbuild plugins +- cf13fbdf3: Add aptGet build extension to easily add system packages to install +- f9ec66c56: Added new @trigger.dev/build package that currently has all the build extensions +- Updated dependencies [ed2a26c86] +- Updated dependencies [c702d6a9c] +- Updated dependencies [9882d66f8] +- Updated dependencies [b66d5525e] +- Updated dependencies [e3db25739] +- Updated dependencies [9491a1649] +- Updated dependencies [1670c4c41] +- Updated dependencies [b271742dc] +- Updated dependencies [cf13fbdf3] +- Updated dependencies [dbda820a7] +- Updated dependencies [4986bfda2] +- Updated dependencies [eb6012628] +- Updated dependencies [f9ec66c56] +- Updated dependencies [f7d32b83b] +- Updated dependencies [09413a62a] +- Updated dependencies [3a1b0c486] +- Updated dependencies [203e00208] +- Updated dependencies [b4f9b70ae] +- Updated dependencies [1b90ffbb8] +- Updated dependencies [5cf90da72] +- Updated dependencies [9af2570da] +- Updated dependencies [7ea8532cc] +- Updated dependencies [1477a2e30] +- Updated dependencies [4f95c9de4] +- Updated dependencies [83dc87155] +- Updated dependencies [d490bc5cb] +- Updated dependencies [e3cf456c6] +- Updated dependencies [14c2bdf89] +- Updated dependencies [9491a1649] +- Updated dependencies [0ed93a748] +- Updated dependencies [8578c9b28] +- Updated dependencies [0e77e7ef7] +- Updated dependencies [e417aca87] +- Updated dependencies [568da0178] +- Updated dependencies [c738ef39c] +- Updated dependencies [ece6ca678] +- Updated dependencies [f854cb90e] +- Updated dependencies [0e919f56f] +- Updated dependencies [44e1b8754] +- Updated dependencies [55264657d] +- Updated dependencies [6d9dfbc75] +- Updated dependencies [e337b2165] +- Updated dependencies [719c0a0b9] +- Updated dependencies [4986bfda2] +- Updated dependencies [e30beb779] +- Updated dependencies [68d32429b] +- Updated dependencies [374edef02] +- Updated dependencies [e04d44866] +- Updated dependencies [26093896d] +- Updated dependencies [55d1f8c67] +- Updated dependencies [c405ae711] +- Updated dependencies [9e5382951] +- Updated dependencies [b68012f81] +- Updated dependencies [098932ea9] +- Updated dependencies [68d32429b] +- Updated dependencies [9835f4ec5] +- Updated dependencies [3f8b6d8fc] +- Updated dependencies [fde939a30] +- Updated dependencies [1281d40e4] +- Updated dependencies [ba71f959e] +- Updated dependencies [395abe1b9] +- Updated dependencies [03b104a3d] +- Updated dependencies [f93eae300] +- Updated dependencies [5ae3da6b4] +- Updated dependencies [c405ae711] +- Updated dependencies [34ca7667d] +- Updated dependencies [8ba998794] +- Updated dependencies [62c9a5b71] +- Updated dependencies [392453e8a] +- Updated dependencies [8578c9b28] +- Updated dependencies [6a379e4e9] +- Updated dependencies [f854cb90e] +- Updated dependencies [584c7da5d] +- Updated dependencies [4986bfda2] +- Updated dependencies [e69ffd314] +- Updated dependencies [b68012f81] +- Updated dependencies [39885a427] +- Updated dependencies [8578c9b28] +- Updated dependencies [e69ffd314] +- Updated dependencies [8578c9b28] +- Updated dependencies [f04041744] +- Updated dependencies [d934feb02] + - @trigger.dev/core@3.0.0 diff --git a/packages/build/package.json b/packages/build/package.json index c3ad996b7..30e3319a4 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.0-beta.56", + "version": "3.0.0", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.0-beta.56", + "@trigger.dev/core": "workspace:3.0.0", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 3393670fe..514a41f67 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,368 @@ # trigger.dev +## 3.0.0 + +### Major Changes + +- cf13fbdf3: Release 3.0.0 +- 395abe1b9: Updates to support Trigger.dev v3 + +### Patch Changes + +- b8477ea2b: Fixes an issue with scoped packages in additionalPackages option +- ed2a26c86: - Fix additionalFiles that aren't decendants + - Stop swallowing uncaught exceptions in prod + - Improve warnings and errors, fail early on critical warnings + - New arg to --save-logs even for successful builds +- 9971de6a1: Increase span attribute value length limit to 2048 +- d4ccdf710: Add an e2e suite to test compiling with v3 CLI. +- b20760173: v3 CLI update command and package manager detection fix +- 43bc7ed94: Hoist uncaughtException handler to the top of workers to better report error messages +- c702d6a9c: better handle task metadata parse errors, and display nicely formatted errors +- c11a77f50: cli v3: increase otel force flush timeout to 30s from 500ms +- 5b745dc1a: Vastly improved dev command output +- b66d5525e: add machine config and secure zod connection +- 9491a1649: Implement task.onSuccess/onFailure and config.onSuccess/onFailure +- 1670c4c41: Remove "log" Log Level, unify log and info messages under the "info" log level +- 5a6e79e0c: Fixing missing logs when importing client @opentelemetry/api +- b271742dc: Configurable log levels in the config file and via env var +- 279717b09: Don’t swallow some error messages when deploying +- dbda820a7: - Prevent uncaught exceptions when handling WebSocket messages + - Improve CLI dev command WebSocket debug and error logging +- 8578c9b28: Fixed empty env vars overriding in dev runs +- 4986bfda2: Add option to print console logs in the dev CLI locally (issue #1014) +- e667028d4: Strip out server-only package from worker builds +- b68012f81: Remove the env var check during deploy (too many false negatives) +- f9ec66c56: New Build System +- f96f1e91a: Better handle issues with resolving dependency versions during deploy +- 374b6b9c0: Increase dev worker timeout +- 624ddce32: Fix permissions inside node_modules +- c2707800a: Improve prisma errors for missing postinstall +- 3a1b0c486: v3: Environment variable management API and SDK, along with resolveEnvVars CLI hook +- c75e29a9a: Add sox and audiowaveform binaries to worker images +- d6c6dc993: try/catch opening the login URL +- c1d4c04e8: Fix automatic opening of login URL on linux-server systems with missing xdg-open +- a86f36cef: Fix TypeScript inclusion in tsconfig.json for `cli-v3 init` +- 1b90ffbb8: v3: Usage tracking +- 5cf90da72: Fix issues that could result in unreezable state run crashes. Details: + - Never checkpoint between attempts + - Some messages and socket data now include attempt numbers + - Remove attempt completion replays + - Additional prod entry point logging + - Fail runs that receive deprecated (pre-lazy attempt) execute messages +- 7ea8532cc: Display errors for runs and deployments +- 63a643b7c: v3: fix digest extraction +- d9c9e80bc: Changed "Worker" to "Version" in the dev command key +- 1207efbba: Correctly handle self-hosted deploy command errors +- 83dc87155: Fix issues with consecutive waits +- 2156e1526: Adding some additional telemetry during deploy to help debug issues +- 16ad59533: v3: update @depot/cli to latest 0.0.1-cli.2.71.0 +- e35f29764: Default to retrying enabled in dev when running init +- ae9a8b0ce: Automatically bundle internal packages that use file, link or workspace protocl +- e3cf456c6: Handle string and non-stringifiable outputs like functions +- f04041744: Fix entry point paths on windows +- 8c4df326c: Improve error messages during dev/deploy and handle deploy image build issues +- 14c2bdf89: Tasks should now be much more robust and resilient to reconnects during crucial operations and other failure scenarios. + + Task runs now have to signal checkpointable state prior to ALL checkpoints. This ensures flushing always happens. + + All important socket.io RPCs will now be retried with backoff. Actions relying on checkpoints will be replayed if we haven't been checkpointed and restored as expected, e.g. after reconnect. + + Other changes: + + - Fix retry check in shared queue + - Fix env var sync spinner + - Heartbeat between retries + - Fix retry prep + - Fix prod worker no tasks detection + - Fail runs above `MAX_TASK_RUN_ATTEMPTS` + - Additional debug logs in all places + - Prevent crashes due to failed socket schema parsing + - Remove core-apps barrel + - Upgrade socket.io-client to fix an ACK memleak + - Additional index failure logs + - Prevent message loss during reconnect + - Prevent burst of heartbeats on reconnect + - Prevent crash on failed cleanup + - Handle at-least-once lazy execute message delivery + - Handle uncaught entry point exceptions + +- 9491a1649: Adds support for `emitDecoratorMetadata: true` and `experimentalDecorators: true` in your tsconfig using the [`@anatine/esbuild-decorators`](https://github.com/anatine/esbuildnx/tree/main/packages/esbuild-decorators) package. This allows you to use libraries like TypeORM: + + ```ts orm/index.ts + import "reflect-metadata"; + import { DataSource } from "typeorm"; + import { Entity, Column, PrimaryColumn } from "typeorm"; + + @Entity() + export class Photo { + @PrimaryColumn() + id!: number; + + @Column() + name!: string; + + @Column() + description!: string; + + @Column() + filename!: string; + + @Column() + views!: number; + + @Column() + isPublished!: boolean; + } + + export const AppDataSource = new DataSource({ + type: "postgres", + host: "localhost", + port: 5432, + username: "postgres", + password: "postgres", + database: "v3-catalog", + entities: [Photo], + synchronize: true, + logging: false, + }); + ``` + + And then in your trigger.config.ts file you can initialize the datasource using the new `init` option: + + ```ts trigger.config.ts + import type { TriggerConfig } from "@trigger.dev/sdk/v3"; + import { AppDataSource } from "@/trigger/orm"; + + export const config: TriggerConfig = { + // ... other options here + init: async (payload, { ctx }) => { + await AppDataSource.initialize(); + }, + }; + ``` + + Now you are ready to use this in your tasks: + + ```ts + import { task } from "@trigger.dev/sdk/v3"; + import { AppDataSource, Photo } from "./orm"; + + export const taskThatUsesDecorators = task({ + id: "taskThatUsesDecorators", + run: async (payload: { message: string }) => { + console.log("Creating a photo..."); + + const photo = new Photo(); + photo.id = 2; + photo.name = "Me and Bears"; + photo.description = "I am near polar bears"; + photo.filename = "photo-with-bears.jpg"; + photo.views = 1; + photo.isPublished = true; + + await AppDataSource.manager.save(photo); + }, + }); + ``` + +- 8578c9b28: Support self-hosters pushing to a custom registry when running deploy +- b68012f81: Fixes an issue that was treating v2 trigger directories as v3 +- e417aca87: Added config option extraCACerts to ProjectConfig type. This copies the ca file along with additionalFiles and sets NODE_EXTRA_CA_CERTS environment variable in built image as well as running the task. +- 568da0178: - Improve non-zero exit code error messages + - Detect OOM conditions within worker child processes + - Internal errors can have optional stack traces + - Docker provider can be set to enforce machine presets +- 0e919f56f: Better handle uncaught exceptions +- cf13fbdf3: Add --runtime option to the init CLI command +- b271742dc: Added a Node.js runtime check for the CLI +- cf13fbdf3: trigger.dev init now adds @trigger.dev/build to devDependencies +- 01633c9c0: Output stderr logs on dev worker failure +- f2894c177: Fix post start hooks +- 52b6f48a9: Add e2e fixtures corresponding to past issues + Implement e2e suite parallelism + Enhance log level for specific e2e suite messages +- de1cc868e: Fix dev CLI output when not printing update messages +- 328947dbf: Use the dashboard url instead of the API url for the View logs link +- ebeb79052: Add typescript as a dependency so the esbuild-decorator will work even when running in npx +- 5ae3da6b4: Await file watcher cleanup in dev +- e337b2165: Add a postInstall option to allow running scripts after dependencies have been installed in deployed images +- 1c24348f7: Add openssl to prod worker image and allow passing auth token via env var for deploy +- 719c0a0b9: Fixed incorrect span timings around checkpoints by implementing a precise wall clock that resets after restores +- 74d1e61e4: Fix a bug where revoking the CLI token would prevent you from ever logging in again with the CLI. +- 52b2a8289: Add git to prod worker image which fixes private package installs +- 4986bfda2: Adding task with a triggerSource of schedule +- 8578c9b28: Fix --project-ref when running deploy +- 68d32429b: Capture and display stderr on index failures +- e9a63a486: Lock SDK and CLI deps on exact core version +- 8757fdcee: v3: [prod] force flush timeout should be 1s +- 26093896d: When using idempotency keys, triggerAndWait and batchTriggerAndWait will still work even if the existing runs have already been completed (or even partially completed, in the case of batchTriggerAndWait) + + - TaskRunExecutionResult.id is now the run friendlyId, not the attempt friendlyId + - A single TaskRun can now have many batchItems, in the case of batchTriggerAndWait while using idempotency keys + - A run’s idempotencyKey is now added to the ctx as well as the TaskEvent and displayed in the span view + - When resolving batchTriggerAndWait, the runtimes no longer reject promises, leading to an error in the parent task + +- 49184c718: Update trigger.dev CLI for new batch otel support +- b82db67b8: Add additional logging around cleaning up dev workers, and always kill them after 5 seconds if they haven't already exited +- f56582995: v3: Copy over more of the project's package.json keys into the deployed package.json (support for custom config like zenstack) +- d3a18fbdf: Fix package builds and CLI commands on Windows +- 77ad4127c: Improved ESM module require error detection logic +- 98ef17029: Set the deploy timeout to 3mins from 1min +- b68012f81: Move to our global system from AsyncLocalStorage for the current task context storage +- 098932ea9: v3: vercel edge runtime support +- f04041744: Support custom config file names & paths +- 8694e573f: Fix CLI logout and add list-profiles command +- 9835f4ec5: v3: fix otel flushing causing CLEANUP ack timeout errors by always setting a forceFlushTimeoutMillis value +- d0d3a64bd: - Prevent downgrades during update check and advise to upgrade CLI + - Detect bun and use npm instead + - During init, fail early and advise if not a TypeScript project + - During init, allow specifying custom package manager args + - Add links to dev worker started message + - Fix links in unsupported terminals +- 6dcfeadac: Fixing an issue with bundling @trigger.dev/core/v3 in dev when using pnpm +- 35dbaedf6: - Fix init command SDK pinning + - Show --api-url / -a flag where needed + - CLI now also respects `TRIGGER_TELEMETRY_DISABLED` + - Dedicated docker checkpoint test function +- a50063ce0: Always insert the dirs option when initializing a new project in the trigger.config.ts +- 9bcb8cb42: Added DEBUG to the ignored env vars +- e02320f65: fix: allow command login to read api url from cli args +- 8578c9b28: Fixed stuck runs when a child run fails with a process exit +- f1571cbfa: Fixed an issue where the trigger.dev package was not being built before publishing to npm +- f93eae300: Dynamically import superjson and fix some bundling issues +- 5ae3da6b4: - Fix artifact detection logs + - Fix OOM detection and error messages + - Add test link to cli deployment completion +- 75ec4ac6a: v3: postInstall config option now replaces the postinstall script found in package.json +- 9be1557bb: Changed the binary name from trigger.dev to triggerdev to fix a Windows issue +- c37c82231: Use locked package versions when resolving dependencies in deployed workers +- 7a9bd18ba: Stop swallowing deployment errors and display them better +- 6406924b0: Ensure @trigger.dev/sdk and @trigger.dev/core are always in the list of deployed dependencies +- 598906fc4: Fix for typo in v3 CLI login command +- d3a18fbdf: Init command was failing on Windows because of bad template paths +- 62c9a5b71: Fixes an issue that caused failed tasks when resuming after calling `triggerAndWait` or `batchTriggerAndWait` in prod/staging (this doesn't effect dev). + + The version of Node.js we use for deployed workers (latest 20) would crash with an out-of-memory error when the checkpoint was restored. This crash does not happen on Node 18x or Node21x, so we've decided to upgrade the worker version to Node.js21x, to mitigate this issue. + + You'll need to re-deploy to production to fix the issue. + +- 392453e8a: Fix for when a log flush times out and the process is checkpointed +- 8578c9b28: Add remote forced externals system, in case we come across another package that cannot be bundled (spurred on by header-generator) +- 584c7da5d: - Add graceful exit for prod workers + - Prevent overflow in long waits +- 4986bfda2: Added a new global - Task Catalog - to better handle task metadata +- e69ffd314: - Clear paused states before retry + - Detect and handle unrecoverable worker errors + - Remove checkpoints after successful push + - Permanently switch to DO hosted busybox image + - Fix IPC timeout issue, or at least handle it more gracefully + - Handle checkpoint failures + - Basic chaos monkey for checkpoint testing + - Stack traces are back in the dashboard + - Display final errors on root span +- b68012f81: Extracting out all the non-SDK related features from the main @trigger.dev/core/v3 export +- b68012f81: Add support for tasks located in subdirectories inside trigger dirs +- c7a55804d: Fix jsonc-parser import +- c092c0f9d: v3: Prevent legacy-peer-deps=true from breaking deploys + + When a global `.npmrc` file includes `legacy-peer-deps=true`, deploys would fail on the `npm ci` step because the package-lock.json wouldn't match the `package.json` file. This is because inside the image build, the `.npmrc` file would not be picked up and so `legacy-peer-deps` would end up being false (which is the default). This change forces the `package-lock.json` file to be created using `legacy-peer-deps=false` + +- 8578c9b28: Only import import-in-the-middle hook if there are instrumented packages +- f04041744: Support for custom conditions +- 6e65591e8: Fix various e2e issues for 'resolve-legacy-peer-deps' fixture, installation of fixture deps and lockfile-based test skipping' +- 8e5ef176a: Increase cleanup IPC timeout +- Updated dependencies [ed2a26c86] +- Updated dependencies [c702d6a9c] +- Updated dependencies [9882d66f8] +- Updated dependencies [b66d5525e] +- Updated dependencies [e3db25739] +- Updated dependencies [9491a1649] +- Updated dependencies [1670c4c41] +- Updated dependencies [b271742dc] +- Updated dependencies [cf13fbdf3] +- Updated dependencies [dbda820a7] +- Updated dependencies [4986bfda2] +- Updated dependencies [eb6012628] +- Updated dependencies [f9ec66c56] +- Updated dependencies [f7d32b83b] +- Updated dependencies [09413a62a] +- Updated dependencies [3a1b0c486] +- Updated dependencies [8c690a960] +- Updated dependencies [8578c9b28] +- Updated dependencies [203e00208] +- Updated dependencies [b4f9b70ae] +- Updated dependencies [1b90ffbb8] +- Updated dependencies [5cf90da72] +- Updated dependencies [cf13fbdf3] +- Updated dependencies [9af2570da] +- Updated dependencies [7ea8532cc] +- Updated dependencies [1477a2e30] +- Updated dependencies [4f95c9de4] +- Updated dependencies [83dc87155] +- Updated dependencies [d490bc5cb] +- Updated dependencies [e3cf456c6] +- Updated dependencies [14c2bdf89] +- Updated dependencies [9491a1649] +- Updated dependencies [0ed93a748] +- Updated dependencies [8578c9b28] +- Updated dependencies [0e77e7ef7] +- Updated dependencies [e417aca87] +- Updated dependencies [568da0178] +- Updated dependencies [c738ef39c] +- Updated dependencies [ece6ca678] +- Updated dependencies [f854cb90e] +- Updated dependencies [0e919f56f] +- Updated dependencies [44e1b8754] +- Updated dependencies [55264657d] +- Updated dependencies [6d9dfbc75] +- Updated dependencies [8578c9b28] +- Updated dependencies [e337b2165] +- Updated dependencies [719c0a0b9] +- Updated dependencies [4986bfda2] +- Updated dependencies [e30beb779] +- Updated dependencies [68d32429b] +- Updated dependencies [374edef02] +- Updated dependencies [e04d44866] +- Updated dependencies [26093896d] +- Updated dependencies [55d1f8c67] +- Updated dependencies [c405ae711] +- Updated dependencies [9e5382951] +- Updated dependencies [b68012f81] +- Updated dependencies [098932ea9] +- Updated dependencies [68d32429b] +- Updated dependencies [9835f4ec5] +- Updated dependencies [3f8b6d8fc] +- Updated dependencies [fde939a30] +- Updated dependencies [1281d40e4] +- Updated dependencies [ba71f959e] +- Updated dependencies [395abe1b9] +- Updated dependencies [03b104a3d] +- Updated dependencies [f93eae300] +- Updated dependencies [5ae3da6b4] +- Updated dependencies [c405ae711] +- Updated dependencies [34ca7667d] +- Updated dependencies [cf13fbdf3] +- Updated dependencies [8ba998794] +- Updated dependencies [62c9a5b71] +- Updated dependencies [392453e8a] +- Updated dependencies [8578c9b28] +- Updated dependencies [6a379e4e9] +- Updated dependencies [f854cb90e] +- Updated dependencies [584c7da5d] +- Updated dependencies [4986bfda2] +- Updated dependencies [e69ffd314] +- Updated dependencies [b68012f81] +- Updated dependencies [39885a427] +- Updated dependencies [8578c9b28] +- Updated dependencies [f9ec66c56] +- Updated dependencies [e69ffd314] +- Updated dependencies [8578c9b28] +- Updated dependencies [f04041744] +- Updated dependencies [d934feb02] + - @trigger.dev/core@3.0.0 + - @trigger.dev/build@3.0.0 + ## 3.0.0-beta.55 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 91ca0ceda..89e349a73 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.0-beta.56", + "version": "3.0.0", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -88,8 +88,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.0-beta.56", - "@trigger.dev/core": "workspace:3.0.0-beta.56", + "@trigger.dev/build": "workspace:3.0.0", + "@trigger.dev/core": "workspace:3.0.0", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 90e9bddbe..92981af1c 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,289 @@ # internal-platform +## 3.0.0 + +### Major Changes + +- cf13fbdf3: Release 3.0.0 +- 395abe1b9: Updates to support Trigger.dev v3 + +### Patch Changes + +- ed2a26c86: - Fix additionalFiles that aren't decendants + - Stop swallowing uncaught exceptions in prod + - Improve warnings and errors, fail early on critical warnings + - New arg to --save-logs even for successful builds +- c702d6a9c: better handle task metadata parse errors, and display nicely formatted errors +- 9882d66f8: Pre-pull deployment images for faster startups +- b66d5525e: add machine config and secure zod connection +- e3db25739: Fix error stack traces +- 9491a1649: Implement task.onSuccess/onFailure and config.onSuccess/onFailure +- 1670c4c41: Remove "log" Log Level, unify log and info messages under the "info" log level +- b271742dc: Configurable log levels in the config file and via env var +- dbda820a7: - Prevent uncaught exceptions when handling WebSocket messages + - Improve CLI dev command WebSocket debug and error logging +- 4986bfda2: Add option to print console logs in the dev CLI locally (issue #1014) +- eb6012628: Fixed batch otel flushing +- f9ec66c56: New Build System +- f7d32b83b: Removed the folder/filepath from Attempt spans +- 09413a62a: Added version to ctx.run +- 3a1b0c486: v3: Environment variable management API and SDK, along with resolveEnvVars CLI hook +- 203e00208: Add runs.retrieve management API method to get info about a run by run ID +- b4f9b70ae: Support triggering tasks with non-URL friendly characters in the ID +- 1b90ffbb8: v3: Usage tracking +- 5cf90da72: Fix issues that could result in unreezable state run crashes. Details: + - Never checkpoint between attempts + - Some messages and socket data now include attempt numbers + - Remove attempt completion replays + - Additional prod entry point logging + - Fail runs that receive deprecated (pre-lazy attempt) execute messages +- 9af2570da: Retry 429, 500, and connection error API requests to the trigger.dev server +- 7ea8532cc: Display errors for runs and deployments +- 1477a2e30: Increased the timeout when canceling a checkpoint to 31s (to match the timeout on the server) +- 4f95c9de4: v3: recover from server rate limiting errors in a more reliable way +- 83dc87155: Fix issues with consecutive waits +- d490bc5cb: Add the "log" level back in as an alias to "info" +- e3cf456c6: Handle string and non-stringifiable outputs like functions +- 14c2bdf89: Tasks should now be much more robust and resilient to reconnects during crucial operations and other failure scenarios. + + Task runs now have to signal checkpointable state prior to ALL checkpoints. This ensures flushing always happens. + + All important socket.io RPCs will now be retried with backoff. Actions relying on checkpoints will be replayed if we haven't been checkpointed and restored as expected, e.g. after reconnect. + + Other changes: + + - Fix retry check in shared queue + - Fix env var sync spinner + - Heartbeat between retries + - Fix retry prep + - Fix prod worker no tasks detection + - Fail runs above `MAX_TASK_RUN_ATTEMPTS` + - Additional debug logs in all places + - Prevent crashes due to failed socket schema parsing + - Remove core-apps barrel + - Upgrade socket.io-client to fix an ACK memleak + - Additional index failure logs + - Prevent message loss during reconnect + - Prevent burst of heartbeats on reconnect + - Prevent crash on failed cleanup + - Handle at-least-once lazy execute message delivery + - Handle uncaught entry point exceptions + +- 9491a1649: Adds support for `emitDecoratorMetadata: true` and `experimentalDecorators: true` in your tsconfig using the [`@anatine/esbuild-decorators`](https://github.com/anatine/esbuildnx/tree/main/packages/esbuild-decorators) package. This allows you to use libraries like TypeORM: + + ```ts orm/index.ts + import "reflect-metadata"; + import { DataSource } from "typeorm"; + import { Entity, Column, PrimaryColumn } from "typeorm"; + + @Entity() + export class Photo { + @PrimaryColumn() + id!: number; + + @Column() + name!: string; + + @Column() + description!: string; + + @Column() + filename!: string; + + @Column() + views!: number; + + @Column() + isPublished!: boolean; + } + + export const AppDataSource = new DataSource({ + type: "postgres", + host: "localhost", + port: 5432, + username: "postgres", + password: "postgres", + database: "v3-catalog", + entities: [Photo], + synchronize: true, + logging: false, + }); + ``` + + And then in your trigger.config.ts file you can initialize the datasource using the new `init` option: + + ```ts trigger.config.ts + import type { TriggerConfig } from "@trigger.dev/sdk/v3"; + import { AppDataSource } from "@/trigger/orm"; + + export const config: TriggerConfig = { + // ... other options here + init: async (payload, { ctx }) => { + await AppDataSource.initialize(); + }, + }; + ``` + + Now you are ready to use this in your tasks: + + ```ts + import { task } from "@trigger.dev/sdk/v3"; + import { AppDataSource, Photo } from "./orm"; + + export const taskThatUsesDecorators = task({ + id: "taskThatUsesDecorators", + run: async (payload: { message: string }) => { + console.log("Creating a photo..."); + + const photo = new Photo(); + photo.id = 2; + photo.name = "Me and Bears"; + photo.description = "I am near polar bears"; + photo.filename = "photo-with-bears.jpg"; + photo.views = 1; + photo.isPublished = true; + + await AppDataSource.manager.save(photo); + }, + }); + ``` + +- 0ed93a748: v3: Remove aggressive otel flush timeouts in dev/prod +- 8578c9b28: Support self-hosters pushing to a custom registry when running deploy +- 0e77e7ef7: v3: Trigger delayed runs and reschedule them +- e417aca87: Added config option extraCACerts to ProjectConfig type. This copies the ca file along with additionalFiles and sets NODE_EXTRA_CA_CERTS environment variable in built image as well as running the task. +- 568da0178: - Improve non-zero exit code error messages + - Detect OOM conditions within worker child processes + - Internal errors can have optional stack traces + - Docker provider can be set to enforce machine presets +- c738ef39c: OTEL attributes can include Dates that will be formatted as ISO strings +- ece6ca678: Fix issue when using SDK in non-node environments by scoping the stream import with node: +- f854cb90e: Added replayRun function to the SDK +- 0e919f56f: Better handle uncaught exceptions +- 44e1b8754: Improve the SDK function types and expose a new APIError instead of the APIResult type +- 55264657d: You can now add tags to runs and list runs using them +- 6d9dfbc75: Add configure function to be able to configure the SDK manually +- e337b2165: Add a postInstall option to allow running scripts after dependencies have been installed in deployed images +- 719c0a0b9: Fixed incorrect span timings around checkpoints by implementing a precise wall clock that resets after restores +- 4986bfda2: Adding task with a triggerSource of schedule +- e30beb779: Added support for custom esbuild plugins +- 68d32429b: Capture and display stderr on index failures +- 374edef02: Updates the `trigger`, `batchTrigger` and their `*AndWait` variants to use the first parameter for the payload/items, and the second parameter for options. + + Before: + + ```ts + await yourTask.trigger({ payload: { foo: "bar" }, options: { idempotencyKey: "key_1234" } }); + await yourTask.triggerAndWait({ + payload: { foo: "bar" }, + options: { idempotencyKey: "key_1234" }, + }); + + await yourTask.batchTrigger({ + items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }], + }); + await yourTask.batchTriggerAndWait({ + items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }], + }); + ``` + + After: + + ```ts + await yourTask.trigger({ foo: "bar" }, { idempotencyKey: "key_1234" }); + await yourTask.triggerAndWait({ foo: "bar" }, { idempotencyKey: "key_1234" }); + + await yourTask.batchTrigger([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); + await yourTask.batchTriggerAndWait([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); + ``` + + We've also changed the API of the `triggerAndWait` result. Before, if the subtask that was triggered finished with an error, we would automatically "rethrow" the error in the parent task. + + Now instead we're returning a `TaskRunResult` object that allows you to discriminate between successful and failed runs in the subtask: + + Before: + + ```ts + try { + const result = await yourTask.triggerAndWait({ foo: "bar" }); + + // result is the output of your task + console.log("result", result); + } catch (error) { + // handle subtask errors here + } + ``` + + After: + + ```ts + const result = await yourTask.triggerAndWait({ foo: "bar" }); + + if (result.ok) { + console.log(`Run ${result.id} succeeded with output`, result.output); + } else { + console.log(`Run ${result.id} failed with error`, result.error); + } + ``` + +- e04d44866: v3: sanitize errors with null unicode characters in some places +- 26093896d: When using idempotency keys, triggerAndWait and batchTriggerAndWait will still work even if the existing runs have already been completed (or even partially completed, in the case of batchTriggerAndWait) + + - TaskRunExecutionResult.id is now the run friendlyId, not the attempt friendlyId + - A single TaskRun can now have many batchItems, in the case of batchTriggerAndWait while using idempotency keys + - A run’s idempotencyKey is now added to the ctx as well as the TaskEvent and displayed in the span view + - When resolving batchTriggerAndWait, the runtimes no longer reject promises, leading to an error in the parent task + +- 55d1f8c67: Add callback to checkpoint created message +- c405ae711: Make deduplicationKey required when creating/updating a schedule +- 9e5382951: Improve the display of non-object return types in the run trace viewer +- b68012f81: Move to our global system from AsyncLocalStorage for the current task context storage +- 098932ea9: v3: vercel edge runtime support +- 68d32429b: - Fix uncaught provider exception + - Remove unused provider messages +- 9835f4ec5: v3: fix otel flushing causing CLEANUP ack timeout errors by always setting a forceFlushTimeoutMillis value +- 3f8b6d8fc: v2: Better handle recovering from platform communication errors by auto-yielding back to the platform in case of temporary API failures +- fde939a30: Make optional schedule object fields nullish +- 1281d40e4: When a v2 run hits the rate limit, reschedule with the reset date +- ba71f959e: Management SDK overhaul and adding the runs.list API +- 03b104a3d: Added JSDocs to the schedule SDK types +- f93eae300: Dynamically import superjson and fix some bundling issues +- 5ae3da6b4: - Fix artifact detection logs + - Fix OOM detection and error messages + - Add test link to cli deployment completion +- c405ae711: Added timezone support to schedules +- 34ca7667d: v3: Include presigned urls for downloading large payloads and outputs when using runs.retrieve +- 8ba998794: Added declarative cron schedules +- 62c9a5b71: Fixes an issue that caused failed tasks when resuming after calling `triggerAndWait` or `batchTriggerAndWait` in prod/staging (this doesn't effect dev). + + The version of Node.js we use for deployed workers (latest 20) would crash with an out-of-memory error when the checkpoint was restored. This crash does not happen on Node 18x or Node21x, so we've decided to upgrade the worker version to Node.js21x, to mitigate this issue. + + You'll need to re-deploy to production to fix the issue. + +- 392453e8a: Fix for when a log flush times out and the process is checkpointed +- 8578c9b28: Add remote forced externals system, in case we come across another package that cannot be bundled (spurred on by header-generator) +- 6a379e4e9: Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace +- f854cb90e: Added cancelRun to the SDK +- 584c7da5d: - Add graceful exit for prod workers + - Prevent overflow in long waits +- 4986bfda2: Added a new global - Task Catalog - to better handle task metadata +- e69ffd314: - Clear paused states before retry + - Detect and handle unrecoverable worker errors + - Remove checkpoints after successful push + - Permanently switch to DO hosted busybox image + - Fix IPC timeout issue, or at least handle it more gracefully + - Handle checkpoint failures + - Basic chaos monkey for checkpoint testing + - Stack traces are back in the dashboard + - Display final errors on root span +- b68012f81: Extracting out all the non-SDK related features from the main @trigger.dev/core/v3 export +- 39885a427: v3: fix missing init output in task run function when no middleware is defined +- 8578c9b28: fix node10 moduleResolution in @trigger.dev/core +- e69ffd314: Improve handling of IPC timeouts and fix checkpoint cancellation after failures +- 8578c9b28: Only import import-in-the-middle hook if there are instrumented packages +- f04041744: Support for custom conditions +- d934feb02: Add more package exports that can be used from the web app + ## 3.0.0-beta.55 ## 3.0.0-beta.54 diff --git a/packages/core/package.json b/packages/core/package.json index 197aed370..935358aa6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.0-beta.56", + "version": "3.0.0", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/database/CHANGELOG.md b/packages/database/CHANGELOG.md index 7d7309402..97aede3a9 100644 --- a/packages/database/CHANGELOG.md +++ b/packages/database/CHANGELOG.md @@ -1,3 +1,5 @@ # @trigger.dev/database +## 0.0.2 + ## 0.0.1 diff --git a/packages/database/package.json b/packages/database/package.json index 9461bac4c..41afe0e5e 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,7 +1,7 @@ { "name": "@trigger.dev/database", "private": true, - "version": "0.0.1", + "version": "0.0.2", "main": "./src/index.ts", "types": "./src/index.ts", "dependencies": { diff --git a/packages/otlp-importer/CHANGELOG.md b/packages/otlp-importer/CHANGELOG.md index b308f5b05..ba33ad5eb 100644 --- a/packages/otlp-importer/CHANGELOG.md +++ b/packages/otlp-importer/CHANGELOG.md @@ -1,5 +1,7 @@ # @trigger.dev/otlp-importer +## 3.0.0 + ## 3.0.0-beta.55 ## 3.0.0-beta.54 diff --git a/packages/otlp-importer/package.json b/packages/otlp-importer/package.json index 1991570d6..49d2fdbae 100644 --- a/packages/otlp-importer/package.json +++ b/packages/otlp-importer/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/otlp-importer", - "version": "3.0.0-beta.56", + "version": "3.0.0", "description": "OpenTelemetry OTLP Importer for Node.js written in TypeScript", "license": "MIT", "main": "./src/index.ts", diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 7c3f0df57..98b8741d1 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,210 @@ # @trigger.dev/sdk +## 3.0.0 + +### Major Changes + +- cf13fbdf3: Release 3.0.0 +- 395abe1b9: Updates to support Trigger.dev v3 + +### Patch Changes + +- b66d5525e: add machine config and secure zod connection +- 9491a1649: Implement task.onSuccess/onFailure and config.onSuccess/onFailure +- b271742dc: Configurable log levels in the config file and via env var +- 0591db5f2: Fixes for continuing after waits +- f9ec66c56: New Build System +- 8cae1d087: Fix trigger functions for custom queues +- 3a1b0c486: v3: Environment variable management API and SDK, along with resolveEnvVars CLI hook +- 979bee50d: Fix return type of runs.retrieve, and allow passing the type of the task to runs.retrieve +- b68012f81: Make msw a normal dependency (for now) to fix Module Not Found error in Next.js. + + It turns out that webpack will "hoist" dynamically imported modules and attempt to resolve them at build time, even though it's an optional peer dep: + + https://x.com/maverickdotdev/status/1782465214308319404 + +- 203e00208: Add runs.retrieve management API method to get info about a run by run ID +- 1b90ffbb8: v3: Usage tracking +- 51bb4c887: Fix for calling trigger and passing a custom queue +- 4986bfda2: Export queue from the SDK +- 086a0f95c: Extract common trigger code into internal functions and add a tasks.batchTriggerAndWait function +- 4f95c9de4: v3: recover from server rate limiting errors in a more reliable way +- 0591db5f2: Rollback to try and fix some dependent attempt issues +- 8578c9b28: Support self-hosters pushing to a custom registry when running deploy +- 0e77e7ef7: v3: Trigger delayed runs and reschedule them +- ecf1110ab: v3: Export AbortTaskRunError from @trigger.dev/sdk/v3 +- f854cb90e: Added replayRun function to the SDK +- 44e1b8754: Improve the SDK function types and expose a new APIError instead of the APIResult type +- 55264657d: You can now add tags to runs and list runs using them +- 6d9dfbc75: Add configure function to be able to configure the SDK manually +- ecef19966: Use global setTimeout to ensure cross-runtime support +- 719c0a0b9: Fixed incorrect span timings around checkpoints by implementing a precise wall clock that resets after restores +- 4986bfda2: Adding task with a triggerSource of schedule +- e9a63a486: Lock SDK and CLI deps on exact core version +- 374edef02: Updates the `trigger`, `batchTrigger` and their `*AndWait` variants to use the first parameter for the payload/items, and the second parameter for options. + + Before: + + ```ts + await yourTask.trigger({ payload: { foo: "bar" }, options: { idempotencyKey: "key_1234" } }); + await yourTask.triggerAndWait({ + payload: { foo: "bar" }, + options: { idempotencyKey: "key_1234" }, + }); + + await yourTask.batchTrigger({ + items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }], + }); + await yourTask.batchTriggerAndWait({ + items: [{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }], + }); + ``` + + After: + + ```ts + await yourTask.trigger({ foo: "bar" }, { idempotencyKey: "key_1234" }); + await yourTask.triggerAndWait({ foo: "bar" }, { idempotencyKey: "key_1234" }); + + await yourTask.batchTrigger([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); + await yourTask.batchTriggerAndWait([{ payload: { foo: "bar" } }, { payload: { foo: "baz" } }]); + ``` + + We've also changed the API of the `triggerAndWait` result. Before, if the subtask that was triggered finished with an error, we would automatically "rethrow" the error in the parent task. + + Now instead we're returning a `TaskRunResult` object that allows you to discriminate between successful and failed runs in the subtask: + + Before: + + ```ts + try { + const result = await yourTask.triggerAndWait({ foo: "bar" }); + + // result is the output of your task + console.log("result", result); + } catch (error) { + // handle subtask errors here + } + ``` + + After: + + ```ts + const result = await yourTask.triggerAndWait({ foo: "bar" }); + + if (result.ok) { + console.log(`Run ${result.id} succeeded with output`, result.output); + } else { + console.log(`Run ${result.id} failed with error`, result.error); + } + ``` + +- 26093896d: When using idempotency keys, triggerAndWait and batchTriggerAndWait will still work even if the existing runs have already been completed (or even partially completed, in the case of batchTriggerAndWait) + + - TaskRunExecutionResult.id is now the run friendlyId, not the attempt friendlyId + - A single TaskRun can now have many batchItems, in the case of batchTriggerAndWait while using idempotency keys + - A run’s idempotencyKey is now added to the ctx as well as the TaskEvent and displayed in the span view + - When resolving batchTriggerAndWait, the runtimes no longer reject promises, leading to an error in the parent task + +- b68012f81: Move to our global system from AsyncLocalStorage for the current task context storage +- c9e1a3e9c: Remove unimplemented batchOptions +- cf13fbdf3: Add triggerAndWait().unwrap() to more easily get at the output or throw the subtask error +- 3f8b6d8fc: v2: Better handle recovering from platform communication errors by auto-yielding back to the platform in case of temporary API failures +- 1281d40e4: When a v2 run hits the rate limit, reschedule with the reset date +- ba71f959e: Management SDK overhaul and adding the runs.list API +- 7c36a1a4b: v3: Adding SDK functions for triggering tasks in a typesafe way, without importing task file +- f93eae300: Dynamically import superjson and fix some bundling issues +- c405ae711: Added timezone support to schedules +- 34ca7667d: v3: Include presigned urls for downloading large payloads and outputs when using runs.retrieve +- 8ba998794: Added declarative cron schedules +- f854cb90e: Added cancelRun to the SDK +- 4986bfda2: Added a new global - Task Catalog - to better handle task metadata +- b68012f81: Extracting out all the non-SDK related features from the main @trigger.dev/core/v3 export +- 8578c9b28: Remove msw and retry.interceptFetch +- Updated dependencies [ed2a26c86] +- Updated dependencies [c702d6a9c] +- Updated dependencies [9882d66f8] +- Updated dependencies [b66d5525e] +- Updated dependencies [e3db25739] +- Updated dependencies [9491a1649] +- Updated dependencies [1670c4c41] +- Updated dependencies [b271742dc] +- Updated dependencies [cf13fbdf3] +- Updated dependencies [dbda820a7] +- Updated dependencies [4986bfda2] +- Updated dependencies [eb6012628] +- Updated dependencies [f9ec66c56] +- Updated dependencies [f7d32b83b] +- Updated dependencies [09413a62a] +- Updated dependencies [3a1b0c486] +- Updated dependencies [203e00208] +- Updated dependencies [b4f9b70ae] +- Updated dependencies [1b90ffbb8] +- Updated dependencies [5cf90da72] +- Updated dependencies [9af2570da] +- Updated dependencies [7ea8532cc] +- Updated dependencies [1477a2e30] +- Updated dependencies [4f95c9de4] +- Updated dependencies [83dc87155] +- Updated dependencies [d490bc5cb] +- Updated dependencies [e3cf456c6] +- Updated dependencies [14c2bdf89] +- Updated dependencies [9491a1649] +- Updated dependencies [0ed93a748] +- Updated dependencies [8578c9b28] +- Updated dependencies [0e77e7ef7] +- Updated dependencies [e417aca87] +- Updated dependencies [568da0178] +- Updated dependencies [c738ef39c] +- Updated dependencies [ece6ca678] +- Updated dependencies [f854cb90e] +- Updated dependencies [0e919f56f] +- Updated dependencies [44e1b8754] +- Updated dependencies [55264657d] +- Updated dependencies [6d9dfbc75] +- Updated dependencies [e337b2165] +- Updated dependencies [719c0a0b9] +- Updated dependencies [4986bfda2] +- Updated dependencies [e30beb779] +- Updated dependencies [68d32429b] +- Updated dependencies [374edef02] +- Updated dependencies [e04d44866] +- Updated dependencies [26093896d] +- Updated dependencies [55d1f8c67] +- Updated dependencies [c405ae711] +- Updated dependencies [9e5382951] +- Updated dependencies [b68012f81] +- Updated dependencies [098932ea9] +- Updated dependencies [68d32429b] +- Updated dependencies [9835f4ec5] +- Updated dependencies [3f8b6d8fc] +- Updated dependencies [fde939a30] +- Updated dependencies [1281d40e4] +- Updated dependencies [ba71f959e] +- Updated dependencies [395abe1b9] +- Updated dependencies [03b104a3d] +- Updated dependencies [f93eae300] +- Updated dependencies [5ae3da6b4] +- Updated dependencies [c405ae711] +- Updated dependencies [34ca7667d] +- Updated dependencies [8ba998794] +- Updated dependencies [62c9a5b71] +- Updated dependencies [392453e8a] +- Updated dependencies [8578c9b28] +- Updated dependencies [6a379e4e9] +- Updated dependencies [f854cb90e] +- Updated dependencies [584c7da5d] +- Updated dependencies [4986bfda2] +- Updated dependencies [e69ffd314] +- Updated dependencies [b68012f81] +- Updated dependencies [39885a427] +- Updated dependencies [8578c9b28] +- Updated dependencies [e69ffd314] +- Updated dependencies [8578c9b28] +- Updated dependencies [f04041744] +- Updated dependencies [d934feb02] + - @trigger.dev/core@3.0.0 + ## 3.0.0-beta.55 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 74312a8be..4e67cc7ef 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.0-beta.56", + "version": "3.0.0", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.0-beta.56", + "@trigger.dev/core": "workspace:3.0.0", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From 798a47e863380d72e912b70caa272f04faaa2bf7 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 15:38:05 +0100 Subject: [PATCH 05/55] Release v3.0.0 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 950ed17cf..5836dab0e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.0-beta.56 + specifier: workspace:3.0.0 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.0-beta.56 + specifier: workspace:3.0.0 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.0-beta.56 + specifier: workspace:3.0.0 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.0-beta.56 + specifier: workspace:3.0.0 version: link:../core chalk: specifier: ^5.2.0 From 94698ad13cb4a2b780efbd2fc0b5cea63f61c625 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Mon, 16 Sep 2024 16:54:39 +0100 Subject: [PATCH 06/55] Added JobRun eventId index --- .../20240916155127_added_job_run_event_id_index/migration.sql | 2 ++ packages/database/prisma/schema.prisma | 1 + 2 files changed, 3 insertions(+) create mode 100644 packages/database/prisma/migrations/20240916155127_added_job_run_event_id_index/migration.sql diff --git a/packages/database/prisma/migrations/20240916155127_added_job_run_event_id_index/migration.sql b/packages/database/prisma/migrations/20240916155127_added_job_run_event_id_index/migration.sql new file mode 100644 index 000000000..9a6095617 --- /dev/null +++ b/packages/database/prisma/migrations/20240916155127_added_job_run_event_id_index/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE INDEX CONCURRENTLY IF NOT EXISTS "JobRun_eventId_idx" ON "JobRun" ("eventId"); \ No newline at end of file diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma index 8740d22db..92c370fef 100644 --- a/packages/database/prisma/schema.prisma +++ b/packages/database/prisma/schema.prisma @@ -914,6 +914,7 @@ model JobRun { @@index([jobId, createdAt(sort: Desc)], map: "idx_jobrun_jobId_createdAt") @@index([organizationId, createdAt], map: "idx_jobrun_organizationId_createdAt") @@index([versionId], map: "idx_jobrun_versionId") + @@index([eventId], map: "JobRun_eventId_idx") } enum JobRunStatus { From 3aa581179088f8dd5add5b5a8dde77248b38166d Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 18:03:16 +0100 Subject: [PATCH 07/55] fix 3.0.0 update warning (#1308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Attempt to fix false package mismatch warnings * Add changeset * Add ability to test update checks in prerelease packages * Resolve the trigger.dev package based on the package.json dir * Try this * Don’t use the version module, just resolve the packageJson * One more dirname * Comment * Remove the version export because we aren’t using it anymore --- .changeset/calm-berries-trade.md | 8 +++++ packages/cli-v3/src/commands/update.ts | 44 +++++++++++++++++++++++--- scripts/publish-prerelease.sh | 1 - 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 .changeset/calm-berries-trade.md diff --git a/.changeset/calm-berries-trade.md b/.changeset/calm-berries-trade.md new file mode 100644 index 000000000..9442bd89e --- /dev/null +++ b/.changeset/calm-berries-trade.md @@ -0,0 +1,8 @@ +--- +"@trigger.dev/sdk": patch +"trigger.dev": patch +"@trigger.dev/build": patch +"@trigger.dev/core": patch +--- + +Fixing false-positive package version mismatches diff --git a/packages/cli-v3/src/commands/update.ts b/packages/cli-v3/src/commands/update.ts index f22fe9fd3..c8262da2f 100644 --- a/packages/cli-v3/src/commands/update.ts +++ b/packages/cli-v3/src/commands/update.ts @@ -1,7 +1,7 @@ import { confirm, intro, isCancel, log, outro } from "@clack/prompts"; import { Command } from "commander"; import { detectPackageManager, installDependencies } from "nypm"; -import { resolve } from "path"; +import { basename, dirname, resolve } from "path"; import { PackageJson, readPackageJSON, resolvePackageJSON } from "pkg-types"; import { z } from "zod"; import { CommonCommandOptions, OutroCommandError, wrapCommandAction } from "../cli/common.js"; @@ -12,6 +12,7 @@ import { logger } from "../utilities/logger.js"; import { spinner } from "../utilities/windows.js"; import { VERSION } from "../version.js"; import { hasTTY } from "std-env"; +import nodeResolve from "resolve"; export const UpdateCommandOptions = CommonCommandOptions.pick({ logLevel: true, @@ -54,7 +55,7 @@ export async function updateTriggerPackages( let hasOutput = false; const cliVersion = VERSION; - if (cliVersion.startsWith("0.0.0")) { + if (cliVersion.startsWith("0.0.0") && process.env.ENABLE_PRERELEASE_UPDATE_CHECKS !== "1") { return false; } @@ -83,7 +84,9 @@ export async function updateTriggerPackages( hasOutput = true; } - const triggerDependencies = getTriggerDependencies(packageJson); + const triggerDependencies = await getTriggerDependencies(packageJson, packageJsonPath); + + logger.debug("Resolved trigger deps", { triggerDependencies }); function getVersionMismatches( deps: Dependency[], @@ -268,7 +271,10 @@ type Dependency = { version: string; }; -function getTriggerDependencies(packageJson: PackageJson): Dependency[] { +async function getTriggerDependencies( + packageJson: PackageJson, + packageJsonPath: string +): Promise { const deps: Dependency[] = []; for (const type of ["dependencies", "devDependencies"] as const) { @@ -291,13 +297,41 @@ function getTriggerDependencies(packageJson: PackageJson): Dependency[] { continue; } - deps.push({ type, name, version }); + const $version = await tryResolveTriggerPackageVersion(name, packageJsonPath); + + deps.push({ type, name, version: $version ?? version }); } } return deps; } +async function tryResolveTriggerPackageVersion( + name: string, + packageJsonPath: string +): Promise { + try { + const resolvedPath = nodeResolve.sync(name, { + basedir: dirname(packageJsonPath), + }); + + logger.debug(`Resolved ${name} package version path`, { name, resolvedPath }); + + // IMPORTANT: keep the two dirname calls, as the first one resolves the nested package.json inside dist/commonjs or dist/esm + const { packageJson } = await getPackageJson(dirname(dirname(resolvedPath))); + + if (packageJson.version) { + logger.debug(`Resolved ${name} package version`, { name, version: packageJson.version }); + return packageJson.version; + } + + return; + } catch (error) { + logger.debug("Failed to resolve package version", { name, error }); + return undefined; + } +} + function mutatePackageJsonWithUpdatedPackages( packageJson: PackageJson, depsToUpdate: Dependency[], diff --git a/scripts/publish-prerelease.sh b/scripts/publish-prerelease.sh index 7162c6373..0b6e56ef2 100755 --- a/scripts/publish-prerelease.sh +++ b/scripts/publish-prerelease.sh @@ -15,7 +15,6 @@ else fi # Run your commands -rm .changeset/pre.json echo "Running: pnpm exec changeset version --snapshot $version" pnpm exec changeset version --snapshot $version From 499fd86cf250d32478764f4600811ad8189458cb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 18:11:20 +0100 Subject: [PATCH 08/55] chore: Update version for release (#1309) Co-authored-by: github-actions[bot] --- .changeset/calm-berries-trade.md | 8 -------- packages/build/CHANGELOG.md | 8 ++++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 9 +++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 8 ++++++++ packages/trigger-sdk/package.json | 4 ++-- 9 files changed, 39 insertions(+), 16 deletions(-) delete mode 100644 .changeset/calm-berries-trade.md diff --git a/.changeset/calm-berries-trade.md b/.changeset/calm-berries-trade.md deleted file mode 100644 index 9442bd89e..000000000 --- a/.changeset/calm-berries-trade.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"trigger.dev": patch -"@trigger.dev/build": patch -"@trigger.dev/core": patch ---- - -Fixing false-positive package version mismatches diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 9ff05d095..4d1c71319 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,13 @@ # @trigger.dev/build +## 3.0.1 + +### Patch Changes + +- 3aa581179: Fixing false-positive package version mismatches +- Updated dependencies [3aa581179] + - @trigger.dev/core@3.0.1 + ## 3.0.0 ### Major Changes diff --git a/packages/build/package.json b/packages/build/package.json index 30e3319a4..ee59c55d1 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.0", + "version": "3.0.1", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.0", + "@trigger.dev/core": "workspace:3.0.1", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 514a41f67..fa00fcf74 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,14 @@ # trigger.dev +## 3.0.1 + +### Patch Changes + +- 3aa581179: Fixing false-positive package version mismatches +- Updated dependencies [3aa581179] + - @trigger.dev/build@3.0.1 + - @trigger.dev/core@3.0.1 + ## 3.0.0 ### Major Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 89e349a73..c48acb0fe 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.0", + "version": "3.0.1", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -88,8 +88,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.0", - "@trigger.dev/core": "workspace:3.0.0", + "@trigger.dev/build": "workspace:3.0.1", + "@trigger.dev/core": "workspace:3.0.1", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 92981af1c..56d10404d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # internal-platform +## 3.0.1 + +### Patch Changes + +- 3aa581179: Fixing false-positive package version mismatches + ## 3.0.0 ### Major Changes diff --git a/packages/core/package.json b/packages/core/package.json index 935358aa6..75e344f04 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.0", + "version": "3.0.1", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 98b8741d1..999cad88a 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,13 @@ # @trigger.dev/sdk +## 3.0.1 + +### Patch Changes + +- 3aa581179: Fixing false-positive package version mismatches +- Updated dependencies [3aa581179] + - @trigger.dev/core@3.0.1 + ## 3.0.0 ### Major Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 4e67cc7ef..52fe3f246 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.0", + "version": "3.0.1", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.0", + "@trigger.dev/core": "workspace:3.0.1", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From 00668ff39d62c12801860d221e942abe3b8ff1c5 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 18:14:28 +0100 Subject: [PATCH 09/55] Release 3.0.1 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5836dab0e..f9584c76e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.0 + specifier: workspace:3.0.1 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.0 + specifier: workspace:3.0.1 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.0 + specifier: workspace:3.0.1 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.0 + specifier: workspace:3.0.1 version: link:../core chalk: specifier: ^5.2.0 From de135e4885dd2313fb8d38ac9e5087d92fa59ae8 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 19:10:19 +0100 Subject: [PATCH 10/55] Fix for TASK_RUN_HEARTBEAT errors in deployed and dev works --- .changeset/poor-starfishes-act.md | 5 +++++ apps/webapp/app/env.server.ts | 5 +++++ .../environmentVariablesRepository.server.ts | 9 +++++++++ apps/webapp/app/v3/marqs/devQueueConsumer.server.ts | 12 ++++++------ apps/webapp/app/v3/marqs/index.server.ts | 6 +++--- .../app/v3/marqs/sharedQueueConsumer.server.ts | 12 ++++++------ packages/cli-v3/src/entryPoints/deploy-run-worker.ts | 9 ++++++--- 7 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 .changeset/poor-starfishes-act.md diff --git a/.changeset/poor-starfishes-act.md b/.changeset/poor-starfishes-act.md new file mode 100644 index 000000000..5b6fbc735 --- /dev/null +++ b/.changeset/poor-starfishes-act.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Configurable deployed heartbeat interval via HEARTBEAT_INTERVAL_MS env var diff --git a/apps/webapp/app/env.server.ts b/apps/webapp/app/env.server.ts index 0d81c61d8..e4571f736 100644 --- a/apps/webapp/app/env.server.ts +++ b/apps/webapp/app/env.server.ts @@ -177,6 +177,11 @@ const EnvironmentSchema = z.object({ LOOPS_API_KEY: z.string().optional(), MARQS_DISABLE_REBALANCING: z.coerce.boolean().default(false), + MARQS_VISIBILITY_TIMEOUT_MS: z.coerce + .number() + .int() + .default(60 * 1000 * 15), + PROD_TASK_HEARTBEAT_INTERVAL_MS: z.coerce.number().int().optional(), VERBOSE_GRAPHILE_LOGGING: z.string().default("false"), V2_MARQS_ENABLED: z.string().default("0"), diff --git a/apps/webapp/app/v3/environmentVariables/environmentVariablesRepository.server.ts b/apps/webapp/app/v3/environmentVariables/environmentVariablesRepository.server.ts index c0ed29483..cdd845061 100644 --- a/apps/webapp/app/v3/environmentVariables/environmentVariablesRepository.server.ts +++ b/apps/webapp/app/v3/environmentVariables/environmentVariablesRepository.server.ts @@ -798,6 +798,15 @@ async function resolveBuiltInProdVariables(runtimeEnvironment: RuntimeEnvironmen ]); } + if (env.PROD_TASK_HEARTBEAT_INTERVAL_MS) { + result = result.concat([ + { + key: "HEARTBEAT_INTERVAL_MS", + value: String(env.PROD_TASK_HEARTBEAT_INTERVAL_MS), + }, + ]); + } + const commonVariables = await resolveCommonBuiltInVariables(runtimeEnvironment); return [...result, ...commonVariables]; diff --git a/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts index 7ee0953d9..4e80c9804 100644 --- a/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/devQueueConsumer.server.ts @@ -162,8 +162,8 @@ export class DevQueueConsumer { /** * @deprecated Use `taskRunHeartbeat` instead */ - public async taskHeartbeat(workerId: string, id: string, seconds: number = 60) { - logger.debug("[DevQueueConsumer] taskHeartbeat()", { id, seconds }); + public async taskHeartbeat(workerId: string, id: string) { + logger.debug("[DevQueueConsumer] taskHeartbeat()", { id }); const taskRunAttempt = await prisma.taskRunAttempt.findUnique({ where: { friendlyId: id }, @@ -173,13 +173,13 @@ export class DevQueueConsumer { return; } - await marqs?.heartbeatMessage(taskRunAttempt.taskRunId, seconds); + await marqs?.heartbeatMessage(taskRunAttempt.taskRunId); } - public async taskRunHeartbeat(workerId: string, id: string, seconds: number = 60) { - logger.debug("[DevQueueConsumer] taskRunHeartbeat()", { id, seconds }); + public async taskRunHeartbeat(workerId: string, id: string) { + logger.debug("[DevQueueConsumer] taskRunHeartbeat()", { id }); - await marqs?.heartbeatMessage(id, seconds); + await marqs?.heartbeatMessage(id); } public async stop(reason: string = "CLI disconnected") { diff --git a/apps/webapp/app/v3/marqs/index.server.ts b/apps/webapp/app/v3/marqs/index.server.ts index 5ebe087e8..81fec8e19 100644 --- a/apps/webapp/app/v3/marqs/index.server.ts +++ b/apps/webapp/app/v3/marqs/index.server.ts @@ -698,8 +698,8 @@ export class MarQS { } // This should increment by the number of seconds, but with a max value of Date.now() + visibilityTimeoutInMs - public async heartbeatMessage(messageId: string, seconds: number = 30) { - await this.options.visibilityTimeoutStrategy.heartbeat(messageId, seconds * 1000); + public async heartbeatMessage(messageId: string) { + await this.options.visibilityTimeoutStrategy.heartbeat(messageId, this.visibilityTimeoutInMs); } get visibilityTimeoutInMs() { @@ -1871,7 +1871,7 @@ function getMarQSClient() { redis: redisOptions, defaultEnvConcurrency: env.DEFAULT_ENV_EXECUTION_CONCURRENCY_LIMIT, defaultOrgConcurrency: env.DEFAULT_ORG_EXECUTION_CONCURRENCY_LIMIT, - visibilityTimeoutInMs: 120 * 1000, // 2 minutes, + visibilityTimeoutInMs: env.MARQS_VISIBILITY_TIMEOUT_MS, enableRebalancing: !env.MARQS_DISABLE_REBALANCING, subscriber: concurrencyTracker, }); diff --git a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts index 28ce217b7..606d9ca92 100644 --- a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts @@ -1169,8 +1169,8 @@ class SharedQueueTasks { } satisfies TaskRunExecutionLazyAttemptPayload; } - async taskHeartbeat(attemptFriendlyId: string, seconds: number = 60) { - logger.debug("[SharedQueueConsumer] taskHeartbeat()", { id: attemptFriendlyId, seconds }); + async taskHeartbeat(attemptFriendlyId: string) { + logger.debug("[SharedQueueConsumer] taskHeartbeat()", { id: attemptFriendlyId }); const taskRunAttempt = await prisma.taskRunAttempt.findUnique({ where: { friendlyId: attemptFriendlyId }, @@ -1180,13 +1180,13 @@ class SharedQueueTasks { return; } - await marqs?.heartbeatMessage(taskRunAttempt.taskRunId, seconds); + await marqs?.heartbeatMessage(taskRunAttempt.taskRunId); } - async taskRunHeartbeat(runId: string, seconds: number = 60) { - logger.debug("[SharedQueueConsumer] taskRunHeartbeat()", { runId, seconds }); + async taskRunHeartbeat(runId: string) { + logger.debug("[SharedQueueConsumer] taskRunHeartbeat()", { runId }); - await marqs?.heartbeatMessage(runId, seconds); + await marqs?.heartbeatMessage(runId); } public async taskRunFailed(completion: TaskRunFailedExecutionResult) { diff --git a/packages/cli-v3/src/entryPoints/deploy-run-worker.ts b/packages/cli-v3/src/entryPoints/deploy-run-worker.ts index 177694c73..e29a3d321 100644 --- a/packages/cli-v3/src/entryPoints/deploy-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/deploy-run-worker.ts @@ -77,12 +77,13 @@ process.on("uncaughtException", function (error, origin) { } }); -const heartbeatIntervalMs = getEnvVar("USAGE_HEARTBEAT_INTERVAL_MS"); +const usageIntervalMs = getEnvVar("USAGE_HEARTBEAT_INTERVAL_MS"); const usageEventUrl = getEnvVar("USAGE_EVENT_URL"); const triggerJWT = getEnvVar("TRIGGER_JWT"); +const heartbeatIntervalMs = getEnvVar("HEARTBEAT_INTERVAL_MS"); const prodUsageManager = new ProdUsageManager(new DevUsageManager(), { - heartbeatIntervalMs: heartbeatIntervalMs ? parseInt(heartbeatIntervalMs, 10) : undefined, + heartbeatIntervalMs: usageIntervalMs ? parseInt(usageIntervalMs, 10) : undefined, url: usageEventUrl, jwt: triggerJWT, }); @@ -383,7 +384,9 @@ runtime.setGlobalRuntimeManager(prodRuntimeManager); process.title = "trigger-dev-worker"; -for await (const _ of setInterval(15_000)) { +const heartbeatInterval = parseInt(heartbeatIntervalMs ?? "30000", 10); + +for await (const _ of setInterval(heartbeatInterval)) { if (_isRunning && _execution) { try { await zodIpc.send("TASK_HEARTBEAT", { id: _execution.attempt.id }); From 2b5771f38c5fad8ced8253d95b3fa409dc8e6be6 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Mon, 16 Sep 2024 21:40:01 +0100 Subject: [PATCH 11/55] Remove duplicate bin definition, fixes issue #1311 --- .changeset/flat-bees-jog.md | 5 +++++ packages/cli-v3/package.json | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .changeset/flat-bees-jog.md diff --git a/.changeset/flat-bees-jog.md b/.changeset/flat-bees-jog.md new file mode 100644 index 000000000..a8c5deadb --- /dev/null +++ b/.changeset/flat-bees-jog.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Remove duplicate bin definition, fixes issue #1311 diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index c48acb0fe..908452cac 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -29,7 +29,6 @@ "dist" ], "bin": { - "triggerdev": "./dist/esm/index.js", "trigger": "./dist/esm/index.js" }, "tshy": { From 282df76392d1dd52be85b59da4da7f3c5f6df239 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Tue, 17 Sep 2024 10:38:58 +0100 Subject: [PATCH 12/55] Enable changesets creating a github release --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c196ddfb6..f1c74b0bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,7 +69,7 @@ jobs: commit: "chore: Update version for release" title: "chore: Update version for release" publish: pnpm run changeset:release - createGithubReleases: false + createGithubReleases: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From b6b74046b9cecbbc1f71e5703ee88b3468b26c82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:44:51 +0100 Subject: [PATCH 13/55] chore: Update version for release (#1310) Co-authored-by: github-actions[bot] --- .changeset/flat-bees-jog.md | 5 ----- .changeset/poor-starfishes-act.md | 5 ----- packages/build/CHANGELOG.md | 6 ++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 9 +++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 2 ++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 6 ++++++ packages/trigger-sdk/package.json | 4 ++-- 10 files changed, 31 insertions(+), 18 deletions(-) delete mode 100644 .changeset/flat-bees-jog.md delete mode 100644 .changeset/poor-starfishes-act.md diff --git a/.changeset/flat-bees-jog.md b/.changeset/flat-bees-jog.md deleted file mode 100644 index a8c5deadb..000000000 --- a/.changeset/flat-bees-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Remove duplicate bin definition, fixes issue #1311 diff --git a/.changeset/poor-starfishes-act.md b/.changeset/poor-starfishes-act.md deleted file mode 100644 index 5b6fbc735..000000000 --- a/.changeset/poor-starfishes-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Configurable deployed heartbeat interval via HEARTBEAT_INTERVAL_MS env var diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 4d1c71319..36006764f 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,11 @@ # @trigger.dev/build +## 3.0.2 + +### Patch Changes + +- @trigger.dev/core@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index ee59c55d1..712f5464d 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.1", + "version": "3.0.2", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.1", + "@trigger.dev/core": "workspace:3.0.2", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index fa00fcf74..30138417b 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,14 @@ # trigger.dev +## 3.0.2 + +### Patch Changes + +- 2b5771f38: Remove duplicate bin definition, fixes issue #1311 +- de135e488: Configurable deployed heartbeat interval via HEARTBEAT_INTERVAL_MS env var + - @trigger.dev/build@3.0.2 + - @trigger.dev/core@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 908452cac..69ec01df3 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.1", + "version": "3.0.2", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -87,8 +87,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.1", - "@trigger.dev/core": "workspace:3.0.1", + "@trigger.dev/build": "workspace:3.0.2", + "@trigger.dev/core": "workspace:3.0.2", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 56d10404d..3572aef48 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,7 @@ # internal-platform +## 3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index 75e344f04..585703310 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.1", + "version": "3.0.2", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 999cad88a..3c0cbc3ac 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,11 @@ # @trigger.dev/sdk +## 3.0.2 + +### Patch Changes + +- @trigger.dev/core@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 52fe3f246..d69046338 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.1", + "version": "3.0.2", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.1", + "@trigger.dev/core": "workspace:3.0.2", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From 616eb55b0d55ae0ed5aef0a11b7ff136cc64931f Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Tue, 17 Sep 2024 10:45:39 +0100 Subject: [PATCH 14/55] Release 3.0.2 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9584c76e..992006fd2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.1 + specifier: workspace:3.0.2 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.1 + specifier: workspace:3.0.2 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.1 + specifier: workspace:3.0.2 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.1 + specifier: workspace:3.0.2 version: link:../core chalk: specifier: ^5.2.0 From 9a3eab5ac422c75bf99b3d0b23f92e551e1a9342 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:40:25 +0100 Subject: [PATCH 15/55] v3: docs improvements (#1302) * pull out common cli options * lint commands table * update dev command link * add undefined Crypto section * add self-hosting section to github actions docs * add cli usage section to self-hosting docs * add skip telemetry env var to cli option docs * add api url env var to cli options docs * lowercase cli commands in sidebar * add self-hosting beta notice * update beta to latest tag on electric route * add deploy command examples section * fix env file option * reorder deploy options sections * cli docs fixes --- .../route.tsx | 2 +- docs/cli-deploy-commands.mdx | 2 +- docs/cli-deploy.mdx | 3 - docs/cli-dev-commands.mdx | 2 +- docs/cli-init-commands.mdx | 27 ++------ docs/cli-introduction.mdx | 32 +++++---- docs/cli-list-profiles-commands.mdx | 28 ++++---- docs/cli-login-commands.mdx | 31 ++------- docs/cli-logout-commands.mdx | 27 ++------ docs/cli-update-commands.mdx | 26 ++++---- docs/cli-whoami-commands.mdx | 27 ++------ docs/github-actions.mdx | 65 ++++++++++++++++++- docs/open-source-self-hosting.mdx | 64 ++++++++++++++++-- docs/snippets/cli-args-project-path.mdx | 3 + docs/snippets/cli-commands-deploy.mdx | 58 ++++++++++------- docs/snippets/cli-commands-develop.mdx | 51 +++++++-------- docs/snippets/cli-options-common.mdx | 20 ++++++ docs/snippets/cli-options-config-file.mdx | 3 + docs/snippets/cli-options-env-file.mdx | 4 ++ docs/snippets/cli-options-help.mdx | 3 + docs/snippets/cli-options-log-level.mdx | 3 + docs/snippets/cli-options-project-ref.mdx | 3 + docs/snippets/cli-options-skip-telemetry.mdx | 3 + .../cli-options-skip-update-check.mdx | 3 + docs/snippets/cli-options-version.mdx | 3 + docs/troubleshooting.mdx | 14 ++-- 26 files changed, 309 insertions(+), 198 deletions(-) create mode 100644 docs/snippets/cli-args-project-path.mdx create mode 100644 docs/snippets/cli-options-common.mdx create mode 100644 docs/snippets/cli-options-config-file.mdx create mode 100644 docs/snippets/cli-options-env-file.mdx create mode 100644 docs/snippets/cli-options-help.mdx create mode 100644 docs/snippets/cli-options-log-level.mdx create mode 100644 docs/snippets/cli-options-project-ref.mdx create mode 100644 docs/snippets/cli-options-skip-telemetry.mdx create mode 100644 docs/snippets/cli-options-skip-update-check.mdx create mode 100644 docs/snippets/cli-options-version.mdx diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.electric.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.electric.$runParam/route.tsx index 85e660933..3be620065 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.electric.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.electric.$runParam/route.tsx @@ -1155,7 +1155,7 @@ function ConnectedDevWarning() { Runs usually start within 2 seconds in{" "} . Check you're running the - CLI: npx trigger.dev@beta dev + CLI: npx trigger.dev@latest dev diff --git a/docs/cli-deploy-commands.mdx b/docs/cli-deploy-commands.mdx index 2ced0fdca..ba334ae3b 100644 --- a/docs/cli-deploy-commands.mdx +++ b/docs/cli-deploy-commands.mdx @@ -1,6 +1,6 @@ --- title: "CLI deploy options" -sidebarTitle: "Deploy" +sidebarTitle: "deploy" description: "Use these options to help deploy your tasks to Trigger.dev." --- diff --git a/docs/cli-deploy.mdx b/docs/cli-deploy.mdx index fc40005f3..77b4f1765 100644 --- a/docs/cli-deploy.mdx +++ b/docs/cli-deploy.mdx @@ -3,9 +3,6 @@ title: "CLI deploy command" description: "The `trigger.dev deploy` command can be used to manually deploy." --- -import ComingSoon from '/snippets/coming-soon-generic.mdx'; import CliDeployCommands from '/snippets/cli-commands-deploy.mdx'; - -{/* todo add options, remove the reference docs */} diff --git a/docs/cli-dev-commands.mdx b/docs/cli-dev-commands.mdx index cc9d76ab5..b9152578f 100644 --- a/docs/cli-dev-commands.mdx +++ b/docs/cli-dev-commands.mdx @@ -1,6 +1,6 @@ --- title: "CLI dev command" -sidebarTitle: "Dev" +sidebarTitle: "dev" description: "The `trigger.dev dev` command is used to run your tasks locally." --- diff --git a/docs/cli-init-commands.mdx b/docs/cli-init-commands.mdx index 5329404ae..b5da8e18e 100644 --- a/docs/cli-init-commands.mdx +++ b/docs/cli-init-commands.mdx @@ -1,9 +1,11 @@ --- title: "CLI init command" -sidebarTitle: "Init" +sidebarTitle: "init" description: "Use these options when running the CLI `init` command." --- +import CommonOptions from '/snippets/cli-options-common.mdx'; + Run the command like this: @@ -49,25 +51,8 @@ yarn dlx trigger.dev@latest init Additional arguments to pass to the package manager. Accepts CSV for multiple args. - - The login profile to use. Defaults to "default". - +### Common options - - Override the default API URL. If not specified, it uses `https://api.trigger.dev`. - +These options are available on most commands. - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to "log". - - - - Opt-out of sending telemetry data. - - -## Standard options - - - Shows the help information for the command. - + diff --git a/docs/cli-introduction.mdx b/docs/cli-introduction.mdx index b718f0202..1db2f537c 100644 --- a/docs/cli-introduction.mdx +++ b/docs/cli-introduction.mdx @@ -3,25 +3,23 @@ title: "Introduction" description: "The Trigger.dev CLI has a number of options and commands to help you develop locally, self host, and deploy your tasks." --- -## Standard options +import HelpOption from '/snippets/cli-options-help.mdx'; +import VersionOption from '/snippets/cli-options-version.mdx'; - - Displays a list of all help commands. - +## Options - - Displays the version number. - + + ## Commands -| Command | Description | -| :------------------------------------------------------- | :--------------------------------------------------------------------- | -| [Login](/cli-login-commands) | Login with Trigger.dev so you can perform authenticated actions. | -| [Init](/cli-init-commands) | Initialize your existing project for development with Trigger.dev. | -| [Dev](/cli-dev-commands) | Run your Trigger.dev tasks locally. | -| [Deploy](/cli-deploy-commands) | Deploy your Trigger.dev v3 project to the cloud. | -| [Whoami](/cli-whoami-commands) | Display the current logged in user and project details. | -| [Logout](/cli-logout-commands) | Logout of Trigger.dev. | -| [List-profiles](/cli-list-profiles-commands) | List all of your CLI profiles. | -| [Update](/cli-update-commands) | Updates all `@trigger.dev/*` packages to match the CLI version. | \ No newline at end of file +| Command | Description | +| :------------------------------------------- | :----------------------------------------------------------------- | +| [login](/cli-login-commands) | Login with Trigger.dev so you can perform authenticated actions. | +| [init](/cli-init-commands) | Initialize your existing project for development with Trigger.dev. | +| [dev](/cli-dev-commands) | Run your Trigger.dev tasks locally. | +| [deploy](/cli-deploy-commands) | Deploy your Trigger.dev v3 project to the cloud. | +| [whoami](/cli-whoami-commands) | Display the current logged in user and project details. | +| [logout](/cli-logout-commands) | Logout of Trigger.dev. | +| [list-profiles](/cli-list-profiles-commands) | List all of your CLI profiles. | +| [update](/cli-update-commands) | Updates all `@trigger.dev/*` packages to match the CLI version. | diff --git a/docs/cli-list-profiles-commands.mdx b/docs/cli-list-profiles-commands.mdx index 4687811ae..0b45fffb5 100644 --- a/docs/cli-list-profiles-commands.mdx +++ b/docs/cli-list-profiles-commands.mdx @@ -1,9 +1,14 @@ --- -title: "CLI list profiles command" -sidebarTitle: "List profiles" +title: "CLI list-profiles command" +sidebarTitle: "list-profiles" description: "Use these options when using the `list-profiles` CLI command." --- +import LogLevelOption from "/snippets/cli-options-log-level.mdx"; +import SkipTelemetryOption from "/snippets/cli-options-skip-telemetry.mdx"; +import HelpOption from "/snippets/cli-options-help.mdx"; +import VersionOption from "/snippets/cli-options-version.mdx"; + Run the command like this: @@ -24,17 +29,14 @@ yarn dlx trigger.dev@latest list-profiles ## Options - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to `log`. - +### Common options - - Opt-out of sending telemetry data. - +These options are available on most commands. -## Standard options + - - Shows the help information for the command. - + + + + + diff --git a/docs/cli-login-commands.mdx b/docs/cli-login-commands.mdx index d20f9338d..ed5523639 100644 --- a/docs/cli-login-commands.mdx +++ b/docs/cli-login-commands.mdx @@ -1,9 +1,11 @@ --- title: "CLI login command" -sidebarTitle: "Login" +sidebarTitle: "login" description: "Use these options when logging in to Trigger.dev using the CLI." --- +import CommonOptions from '/snippets/cli-options-common.mdx'; + Run the command like this: @@ -24,29 +26,8 @@ yarn dlx trigger.dev@latest login ## Options - - Specifies the login profile to use. If not provided, it defaults to "default". - +### Common options - - Overrides the default API URL. If not specified, it uses `https://api.trigger.dev`. - +These options are available on most commands. - - Sets the CLI log level. Available options are `debug`, `info`, `log`, `warn`, `error`, and `none`. - This setting doesn't affect the log level of your trigger.dev tasks. The default is `log`. - - - - Opts out of sending telemetry data. - - -## Standard options - - - Displays the version number of the CLI. - - - - Shows the help information for the command. - + diff --git a/docs/cli-logout-commands.mdx b/docs/cli-logout-commands.mdx index 5b28eb260..f4c5bc77a 100644 --- a/docs/cli-logout-commands.mdx +++ b/docs/cli-logout-commands.mdx @@ -1,9 +1,11 @@ --- title: "CLI logout command" -sidebarTitle: "Logout" +sidebarTitle: "logout" description: "Use these options when using the `logout` CLI command." --- +import CommonOptions from '/snippets/cli-options-common.mdx'; + Run the command like this: @@ -24,25 +26,8 @@ yarn dlx trigger.dev@latest logout ## Options - - The login profile to use. Defaults to `default`. - +### Common options - - Override the API URL. Defaults to `https://api.trigger.dev`. - +These options are available on most commands. - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to `log`. - - - - Opt-out of sending telemetry data. - - -## Standard options - - - Shows the help information for the command. - + diff --git a/docs/cli-update-commands.mdx b/docs/cli-update-commands.mdx index 7a07b9d9b..beaaad0bf 100644 --- a/docs/cli-update-commands.mdx +++ b/docs/cli-update-commands.mdx @@ -1,9 +1,14 @@ --- title: "CLI update command" -sidebarTitle: "Update" +sidebarTitle: "update" description: "Use these options when using the `update` CLI command." --- +import LogLevelOption from "/snippets/cli-options-log-level.mdx"; +import SkipTelemetryOption from "/snippets/cli-options-skip-telemetry.mdx"; +import HelpOption from "/snippets/cli-options-help.mdx"; +import VersionOption from "/snippets/cli-options-version.mdx"; + Run the command like this: @@ -24,17 +29,14 @@ yarn dlx trigger.dev@latest update ## Options - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to `log`. - +### Common options - - Opt-out of sending telemetry data. - +These options are available on most commands. -## Standard options + - - Shows the help information for the command. - + + + + + diff --git a/docs/cli-whoami-commands.mdx b/docs/cli-whoami-commands.mdx index 1e51d3f73..0c51559bd 100644 --- a/docs/cli-whoami-commands.mdx +++ b/docs/cli-whoami-commands.mdx @@ -1,9 +1,11 @@ --- title: "CLI whoami command" -sidebarTitle: "Whoami" +sidebarTitle: "whoami" description: "Use these options to display the current logged in user and project details." --- +import CommonOptions from '/snippets/cli-options-common.mdx'; + Run the command like this: @@ -24,25 +26,8 @@ yarn dlx trigger.dev@latest whoami ## Options - - The login profile to use. Defaults to `default`. - +### Common options - - Override the API URL. Defaults to `https://api.trigger.dev`. - +These options are available on most commands. - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to `log`. - - - - Opt-out of sending telemetry data. - - -## Standard options - - - Shows the help information for the command. - + diff --git a/docs/github-actions.mdx b/docs/github-actions.mdx index 385459d34..3951ec0bc 100644 --- a/docs/github-actions.mdx +++ b/docs/github-actions.mdx @@ -77,7 +77,7 @@ jobs: If you already have a GitHub action file, you can just add the final step "🚀 Deploy Trigger.dev" to your existing file. -### Creating a Personal Access Token +## Creating a Personal Access Token @@ -97,6 +97,7 @@ If you already have a GitHub action file, you can just add the final step "🚀 + ## Version pinning The CLI and `@trigger.dev/*` package versions need to be in sync with the `trigger.dev` CLI, otherwise there will be errors and unpredictable behavior. Hence, the `deploy` command will automatically fail during CI on any version mismatches. @@ -122,3 +123,65 @@ Your workflow file will follow the version specified in the `package.json` scrip ``` You should use the version you run locally during dev and manual deploy. The current version is displayed in the banner, but you can also check it by appending `--version` to any command. + + +## Self-hosting + +When self-hosting, you will have to take a few additional steps: + +- Specify the `TRIGGER_API_URL` environment variable. You can add it to the GitHub secrets the same way as the access token. This should point at your webapp domain, for example: `https://trigger.example.com` +- Setup docker as you will need to build and push the image to your registry. On [Trigger.dev Cloud](https://cloud.trigger.dev) this is all done remotely. +- Add your registry credentials to the GitHub secrets. +- Use the `--self-hosted` and `--push` flags when deploying. + +Other than that, your GitHub action file will look very similar to the one above: + + + +```yaml .github/workflows/release-trigger-self-hosted.yml +name: Deploy to Trigger.dev (self-hosted) + +on: + push: + branches: + - main + paths: + - "trigger/**" + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20.x + uses: actions/setup-node@v4 + with: + node-version: "20.x" + + - name: Install dependencies + run: npm install + + # docker setup - part 1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # docker setup - part 2 + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: 🚀 Deploy Trigger.dev + env: + TRIGGER_ACCESS_TOKEN: ${{ secrets.TRIGGER_ACCESS_TOKEN }} + # required when self-hosting + TRIGGER_API_URL: ${{ secrets.TRIGGER_API_URL }} + # deploy with additional flags + run: | + npx trigger.dev@beta deploy --self-hosted --push +``` + + \ No newline at end of file diff --git a/docs/open-source-self-hosting.mdx b/docs/open-source-self-hosting.mdx index 2c005ac88..c00bad1cf 100644 --- a/docs/open-source-self-hosting.mdx +++ b/docs/open-source-self-hosting.mdx @@ -3,6 +3,8 @@ title: "Self-hosting" description: "You can self-host Trigger.dev on your own infrastructure." --- +Self-hosting does not support the latest CLI yet, you will have to continue using the `beta` tag for now. + ## Overview @@ -173,8 +175,8 @@ docker login -u 5. You can now deploy v3 projects using the CLI with these flags: -```bash -npx trigger.dev@latest deploy --self-hosted --push +``` +npx trigger.dev@beta deploy --self-hosted --push ``` ## Part 2: Split services @@ -292,10 +294,62 @@ By default, the Trigger.dev webapp sends telemetry data to our servers. This dat TRIGGER_TELEMETRY_DISABLED=1 ``` -## Login via the CLI +## CLI usage -To avoid being redirected to the Cloud login page when using the CLI, you can specify the URL of your self-hosted instance with the `-a` flag. For example: +This section highlights some of the CLI commands and options that are useful when self-hosting. Please check the [CLI reference](/cli-introduction) for more in-depth documentation. + +### Login + +To avoid being redirected to the [Trigger.dev Cloud](https://cloud.trigger.dev) login page when using the CLI, you can specify the URL of your self-hosted instance with the `--api-url` or `-a` flag. For example: + +```bash +npx trigger.dev@beta login -a http://trigger.example.com +``` + +Once you've logged in, the CLI will remember your login details and you won't need to specify the URL again with other commands. + +#### Custom profiles + +You can specify a custom profile when logging in. This allows you to easily use the CLI with our cloud product and your self-hosted instance at the same time. For example: ``` -npx trigger.dev@latest login -a http://example.com +npx trigger.dev@beta login -a http://trigger.example.com --profile my-profile ``` + +You can then use this profile with other commands: + +``` +npx trigger.dev@beta dev --profile my-profile +``` + +To list all your profiles, use the `list-profiles` command: + +``` +npx trigger.dev@beta list-profiles +``` + +#### Verify login + +It can be useful to check you have successfully logged in to the correct instance. You can do this with the `whoami` command, which will also show the API URL: + +```bash +npx trigger.dev@beta whoami + +# with a custom profile +npx trigger.dev@beta whoami --profile my-profile +``` + +### Deploy + +On [Trigger.dev Cloud](https://cloud.trigger.dev), we build deployments remotely and push those images for you. When self-hosting you will have to do that locally yourself. This can be done with the `--self-hosted` and `--push` flags. For example: + +``` +npx trigger.dev@beta deploy --self-hosted --push +``` + +### CI / GitHub Actions + +When running the CLI in a CI environment, your login profiles won't be available. Instead, you can use the `TRIGGER_API_URL` and `TRIGGER_ACCESS_TOKEN` environment +variables to point at your self-hosted instance and authenticate. + +For more detailed instructions, see the [GitHub Actions guide](/github-actions). diff --git a/docs/snippets/cli-args-project-path.mdx b/docs/snippets/cli-args-project-path.mdx new file mode 100644 index 000000000..72c18f0f6 --- /dev/null +++ b/docs/snippets/cli-args-project-path.mdx @@ -0,0 +1,3 @@ + + The path to the project. Defaults to the current directory. + \ No newline at end of file diff --git a/docs/snippets/cli-commands-deploy.mdx b/docs/snippets/cli-commands-deploy.mdx index 90c625369..427b7734b 100644 --- a/docs/snippets/cli-commands-deploy.mdx +++ b/docs/snippets/cli-commands-deploy.mdx @@ -1,3 +1,10 @@ +import ProjectPathArg from '/snippets/cli-args-project-path.mdx'; +import CommonOptions from '/snippets/cli-options-common.mdx'; +import ProjectRefOption from '/snippets/cli-options-project-ref.mdx'; +import EnvFileOption from '/snippets/cli-options-env-file.mdx'; +import ConfigFileOption from '/snippets/cli-options-config-file.mdx'; +import SkipUpdateCheckOption from '/snippets/cli-options-skip-update-check.mdx'; + Run the command like this: @@ -18,7 +25,7 @@ yarn dlx trigger.dev@latest deploy This will fail in CI if any version mismatches are detected. Ensure everything runs locally first - using the [dev](/cli-dev) command and don't bypass the version checks! + using the [dev](/cli-dev-commands) command and don't bypass the version checks! It performs a few steps to deploy: @@ -30,42 +37,47 @@ It performs a few steps to deploy: You can also setup [GitHub Actions](/github-actions) to deploy your tasks automatically. +## Arguments + +``` +npx trigger.dev@latest deploy [path] +``` + + + ## Options + + + + + + + + Defaults to `prod` but you can specify `staging`. - - The name of the config file, found where the command is run from. Defaults to `trigger.config.ts`. - - - - Load environment variables from a file. This will only hydrate the `process.env` of the CLI - process, not the tasks. - - Create a deployable build but don't deploy it. Prints out the build path so you can inspect it. - - Skip checking for `@trigger.dev` package updates. - - - - The project ref. Required if there is no config file. - - - - The log level to use (debug, info, log, warn, error, none). Defaults to `log`. + + The platform to build the deployment image for. Defaults to `linux/amd64`. Turn off syncing environment variables with the Trigger.dev instance. -## Self-hosting +### Common options + +These options are available on most commands. + + + +### Self-hosting These options are typically used when [self-hosting](/open-source-self-hosting) or for local development. @@ -96,7 +108,9 @@ These options are typically used when [self-hosting](/open-source-self-hosting) Hub, the namespace is your Docker Hub username. -### Push to Docker Hub +## Examples + +### Push to Docker Hub (self-hosted) An example of deploying to Docker Hub when using a self-hosted setup: diff --git a/docs/snippets/cli-commands-develop.mdx b/docs/snippets/cli-commands-develop.mdx index 720526eff..57e3d8a14 100644 --- a/docs/snippets/cli-commands-develop.mdx +++ b/docs/snippets/cli-commands-develop.mdx @@ -1,3 +1,10 @@ +import ProjectPathArg from '/snippets/cli-args-project-path.mdx'; +import CommonOptions from '/snippets/cli-options-common.mdx'; +import ProjectRefOption from '/snippets/cli-options-project-ref.mdx'; +import EnvFileOption from '/snippets/cli-options-env-file.mdx'; +import ConfigFileOption from '/snippets/cli-options-config-file.mdx'; +import SkipUpdateCheckOption from '/snippets/cli-options-skip-update-check.mdx'; + This runs a server on your machine that can execute Trigger.dev tasks: @@ -22,43 +29,29 @@ You will see in the terminal that the server is running and listening for tasks. It is worth noting that each task runs in a separate Node process. This means that if you have a long-running task, it will not block other tasks from running. +## Arguments + +``` +npx trigger.dev@latest dev [path] +``` + + + ## Options - - The name of the config file, found at [path]. - + - - The project ref. Required if there is no config file. - + - - Pass a custom path to an env file. We automatically detect `.env`, `.env.local`, - `.env.development`, and `.env.development.local` files. - + - - Skip checking for `@trigger.dev` package updates. - + - - The login profile to use. Defaults to `default`. - +### Common options - - Override the API URL. Defaults to `https://api.trigger.dev`. - +These options are available on most commands. - - The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This - does not affect the log level of your trigger.dev tasks. Defaults to `log`. - - -## Standard options - - - Shows the help information for the command. - + ## Concurrently running the terminal diff --git a/docs/snippets/cli-options-common.mdx b/docs/snippets/cli-options-common.mdx new file mode 100644 index 000000000..935b61396 --- /dev/null +++ b/docs/snippets/cli-options-common.mdx @@ -0,0 +1,20 @@ +import LogLevelOption from "/snippets/cli-options-log-level.mdx"; +import SkipTelemetryOption from "/snippets/cli-options-skip-telemetry.mdx"; +import HelpOption from "/snippets/cli-options-help.mdx"; +import VersionOption from "/snippets/cli-options-version.mdx"; + + + The login profile to use. Defaults to "default". + + + + Override the default API URL. If not specified, it uses `https://api.trigger.dev`. This can also be set via the `TRIGGER_API_URL` environment variable. + + + + + + + + + \ No newline at end of file diff --git a/docs/snippets/cli-options-config-file.mdx b/docs/snippets/cli-options-config-file.mdx new file mode 100644 index 000000000..36cebd9d3 --- /dev/null +++ b/docs/snippets/cli-options-config-file.mdx @@ -0,0 +1,3 @@ + + The name of the config file found at the project path. Defaults to `trigger.config.ts` + \ No newline at end of file diff --git a/docs/snippets/cli-options-env-file.mdx b/docs/snippets/cli-options-env-file.mdx new file mode 100644 index 000000000..1494c17f8 --- /dev/null +++ b/docs/snippets/cli-options-env-file.mdx @@ -0,0 +1,4 @@ + + Load environment variables from a file. This will only hydrate the `process.env` of the CLI + process, not the tasks. + \ No newline at end of file diff --git a/docs/snippets/cli-options-help.mdx b/docs/snippets/cli-options-help.mdx new file mode 100644 index 000000000..47451d946 --- /dev/null +++ b/docs/snippets/cli-options-help.mdx @@ -0,0 +1,3 @@ + + Shows the help information for the command. + \ No newline at end of file diff --git a/docs/snippets/cli-options-log-level.mdx b/docs/snippets/cli-options-log-level.mdx new file mode 100644 index 000000000..c16bbaee1 --- /dev/null +++ b/docs/snippets/cli-options-log-level.mdx @@ -0,0 +1,3 @@ + + The CLI log level to use. Options are `debug`, `info`, `log`, `warn`, `error`, and `none`. This does not affect the log level of your trigger.dev tasks. Defaults to `log`. + \ No newline at end of file diff --git a/docs/snippets/cli-options-project-ref.mdx b/docs/snippets/cli-options-project-ref.mdx new file mode 100644 index 000000000..efa7c46f6 --- /dev/null +++ b/docs/snippets/cli-options-project-ref.mdx @@ -0,0 +1,3 @@ + + The project ref. Required if there is no config file. + \ No newline at end of file diff --git a/docs/snippets/cli-options-skip-telemetry.mdx b/docs/snippets/cli-options-skip-telemetry.mdx new file mode 100644 index 000000000..6823b00b8 --- /dev/null +++ b/docs/snippets/cli-options-skip-telemetry.mdx @@ -0,0 +1,3 @@ + + Opt-out of sending telemetry data. This can also be done via the `TRIGGER_TELEMETRY_DISABLED` environment variable. Just set it to anything other than an empty string. + \ No newline at end of file diff --git a/docs/snippets/cli-options-skip-update-check.mdx b/docs/snippets/cli-options-skip-update-check.mdx new file mode 100644 index 000000000..f09865cd4 --- /dev/null +++ b/docs/snippets/cli-options-skip-update-check.mdx @@ -0,0 +1,3 @@ + + Skip checking for `@trigger.dev` package updates. + \ No newline at end of file diff --git a/docs/snippets/cli-options-version.mdx b/docs/snippets/cli-options-version.mdx new file mode 100644 index 000000000..0b1ec6990 --- /dev/null +++ b/docs/snippets/cli-options-version.mdx @@ -0,0 +1,3 @@ + + Displays the version number of the CLI. + \ No newline at end of file diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 4802a68b4..11aa4a6d6 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -13,19 +13,19 @@ import RateLimitHitUseBatchTrigger from "/snippets/rate-limit-hit-use-batchtrigg If you see this error: -```ts +``` 6090 verbose stack Error: EACCES: permission denied, rename '/Users/user/.npm/_cacache/tmp/f1bfea11' -> '/Users/user/.npm/_cacache/content-v2/sha512/31/d8/e094a47a0105d06fd246892ed1736c02eae323726ec6a3f34734eeb71308895dfba4f4f82a88ffe7e480c90b388c91fc3d9f851ba7b96db4dc33fbc65528' ``` First, clear the npm cache: -```ts +```sh npm cache clean --force ``` Then change the permissions of the npm folder (if 1 doesn't work): -```ts +```sh sudo chown -R $(whoami) ~/.npm ``` @@ -78,7 +78,7 @@ Your code is deployed separately from the rest of your app(s) so you need to mak ### `Error: @prisma/client did not initialize yet.` -Prisma uses code generation to create the client from your schema file. This means you need to add a bit of config so we can generate this file before your tasks run: [read the guide](/config/config-file#prisma). +Prisma uses code generation to create the client from your schema file. This means you need to add a bit of config so we can generate this file before your tasks run: [Read the guide](/config/config-file#prisma). ### When triggering subtasks the parent task finishes too soon @@ -90,6 +90,10 @@ Make sure that you always use `await` when you call `trigger`, `triggerAndWait`, View the [rate limits](/limits) page for more information. +### `Crypto is not defined` + +This can happen in different situations, for example when using plain strings as idempotency keys. Support for `Crypto` without a special flag was added in Node `v19.0.0`. You will have to upgrade Node - we recommend even-numbered major releases, e.g. `v20` or `v22`. Alternatively, you can switch from plain strings to the `idempotencyKeys.create` SDK function. [Read the guide](/idempotency). + ## Framework specific issues ### NestJS swallows all errors/exceptions @@ -115,7 +119,7 @@ NestJS has a global exception filter that catches all errors and swallows them, If you see this error: -```ts +``` Worker failed to start ReferenceError: React is not defined ``` From a84e601da8ca2ba38f4bbf8de74a4a31cba428f3 Mon Sep 17 00:00:00 2001 From: Dan <8297864+D-K-P@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:16:10 +0100 Subject: [PATCH 16/55] Added new example tasks (FFmpeg / Sharp / Vercel AI SDK) (#1312) * Added FFmpeg / sharp / vercel and updated mint.json * Amends including s3 -> r2 --- ...dall-e3.mdx => dall-e3-generate-image.mdx} | 0 docs/examples/ffmpeg-video-processing.mdx | 329 ++++++++++++++++++ docs/examples/sharp-image-processing.mdx | 121 +++++++ docs/examples/vercel-ai-sdk.mdx | 43 +++ docs/mint.json | 67 +--- 5 files changed, 510 insertions(+), 50 deletions(-) rename docs/examples/{generate-image-with-dall-e3.mdx => dall-e3-generate-image.mdx} (100%) create mode 100644 docs/examples/ffmpeg-video-processing.mdx create mode 100644 docs/examples/sharp-image-processing.mdx create mode 100644 docs/examples/vercel-ai-sdk.mdx diff --git a/docs/examples/generate-image-with-dall-e3.mdx b/docs/examples/dall-e3-generate-image.mdx similarity index 100% rename from docs/examples/generate-image-with-dall-e3.mdx rename to docs/examples/dall-e3-generate-image.mdx diff --git a/docs/examples/ffmpeg-video-processing.mdx b/docs/examples/ffmpeg-video-processing.mdx new file mode 100644 index 000000000..33665b77d --- /dev/null +++ b/docs/examples/ffmpeg-video-processing.mdx @@ -0,0 +1,329 @@ +--- +title: "Video processing with FFmpeg" +sidebarTitle: "FFmpeg video processing" +description: "These examples show you how to process videos in various ways using FFmpeg with Trigger.dev." +--- + +## Adding the FFmpeg build extension + +To use these example tasks, you'll first need to add our FFmpeg extension to your project configuration like this: + +```ts trigger.config.ts +import { ffmpeg } from "@trigger.dev/build/extensions/core"; +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "", + // Your other config settings... + build: { + extensions: [ffmpeg()], + }, +}); +``` + + + [Build extensions](../guides/build-extensions) allow you to hook into the build system and + customize the build process or the resulting bundle and container image (in the case of + deploying). You can use pre-built extensions or create your own. + + +You'll also need to add `@trigger.dev/build` to your `package.json` file under `devDependencies` if you don't already have it there. + +## Compress a video using FFmpeg + +This task demonstrates how to use FFmpeg to compress a video, reducing its file size while maintaining reasonable quality, and upload the compressed video to R2 storage. + +### Key Features: + +- Fetches a video from a given URL +- Compresses the video using FFmpeg with various compression settings +- Uploads the compressed video to R2 storage + +### Task code + +```ts trigger/ffmpeg-compress-video.ts +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import ffmpeg from "fluent-ffmpeg"; +import fs from "fs/promises"; +import fetch from "node-fetch"; +import { Readable } from "node:stream"; +import os from "os"; +import path from "path"; + +// Initialize S3 client +const s3Client = new S3Client({ + // How to authenticate to R2: https://developers.cloudflare.com/r2/api/s3/tokens/ + region: "auto", + endpoint: process.env.R2_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const ffmpegCompressVideo = task({ + id: "ffmpeg-compress-video", + run: async (payload: { videoUrl: string }) => { + const { videoUrl } = payload; + + // Generate temporary file names + const tempDirectory = os.tmpdir(); + const outputPath = path.join(tempDirectory, `output_${Date.now()}.mp4`); + + // Fetch the video + const response = await fetch(videoUrl); + + // Compress the video + await new Promise((resolve, reject) => { + if (!response.body) { + return reject(new Error("Failed to fetch video")); + } + + ffmpeg(Readable.from(response.body)) + .outputOptions([ + "-c:v libx264", // Use H.264 codec + "-crf 28", // Higher CRF for more compression (28 is near the upper limit for acceptable quality) + "-preset veryslow", // Slowest preset for best compression + "-vf scale=iw/2:ih/2", // Reduce resolution to 320p width (height auto-calculated) + "-c:a aac", // Use AAC for audio + "-b:a 64k", // Reduce audio bitrate to 64k + "-ac 1", // Convert to mono audio + ]) + .output(outputPath) + .on("end", resolve) + .on("error", reject) + .run(); + }); + + // Read the compressed video + const compressedVideo = await fs.readFile(outputPath); + + const compressedSize = compressedVideo.length; + + // Log compression results + logger.log(`Compressed video size: ${compressedSize} bytes`); + logger.log(`Compressed video saved at: ${outputPath}`); + + // Upload the compressed video to S3, replacing slashes with underscores + const r2Key = `processed-videos/${path.basename(outputPath)}`; + + const uploadParams = { + Bucket: process.env.R2_BUCKET, + Key: r2Key, + Body: compressedVideo, + }; + + // Upload the video to R2 and get the URL + await s3Client.send(new PutObjectCommand(uploadParams)); + const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; + logger.log("Compressed video uploaded to R2", { url: r2Url }); + + // Delete the temporary compressed video file + await fs.unlink(outputPath); + + // Return the compressed video file path, compressed size, and S3 URL + return { + compressedVideoPath: outputPath, + compressedSize, + r2Url, + }; + }, +}); +``` + +## Extract audio from a video using FFmpeg + +This task demonstrates how to use FFmpeg to extract audio from a video, convert it to WAV format, and upload it to R2 storage. + +### Key Features: + +- Fetches a video from a given URL +- Extracts the audio from the video using FFmpeg +- Converts the extracted audio to WAV format +- Uploads the extracted audio to R2 storage + +### Task code + + + When testing, make sure to provide a video URL that contains audio. If the video does not have + audio, the task will fail. + + +```ts trigger/ffmpeg-extract-audio.ts +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import ffmpeg from "fluent-ffmpeg"; +import fs from "fs/promises"; +import fetch from "node-fetch"; +import { Readable } from "node:stream"; +import os from "os"; +import path from "path"; + +// Initialize S3 client +const s3Client = new S3Client({ + // How to authenticate to R2: https://developers.cloudflare.com/r2/api/s3/tokens/ + region: "auto", + endpoint: process.env.R2_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const ffmpegExtractAudio = task({ + id: "ffmpeg-extract-audio", + run: async (payload: { videoUrl: string }) => { + const { videoUrl } = payload; + + // Generate temporary and output file names + const tempDirectory = os.tmpdir(); + const outputPath = path.join(tempDirectory, `output_${Date.now()}.wav`); + + // Fetch the video + const response = await fetch(videoUrl); + + // Convert the video to WAV + await new Promise((resolve, reject) => { + if (!response.body) { + return reject(new Error("Failed to fetch video")); + } + ffmpeg(Readable.from(response.body)) + .toFormat("wav") + .save(outputPath) + .on("end", () => { + logger.log(`WAV file saved to ${outputPath}`); + resolve(outputPath); + }) + .on("error", (err) => { + reject(err); + }); + }); + + // Read the WAV file + const wavBuffer = await fs.readFile(outputPath); + + // Log the output file path + logger.log(`Converted video saved at: ${outputPath}`); + + // Upload the compressed video to S3, replacing slashes with underscores + const r2Key = `processed-audio/${path.basename(outputPath)}`; + + const uploadParams = { + Bucket: process.env.R2_BUCKET, + Key: r2Key, + Body: wavBuffer, + }; + + // Upload the audio to R2 and get the URL + await s3Client.send(new PutObjectCommand(uploadParams)); + const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; + logger.log("Extracted audio uploaded to R2", { url: r2Url }); + + // Delete the temporary file + await fs.unlink(outputPath); + + // Return the WAV buffer and file path + return { + wavBuffer, + wavFilePath: outputPath, + r2Url, + }; + }, +}); +``` + +## Generate a thumbnail from a video using FFmpeg + +This task demonstrates how to use FFmpeg to generate a thumbnail from a video at a specific time and upload the generated thumbnail to R2 storage. + +### Key Features: + +- Fetches a video from a given URL +- Generates a thumbnail from the video at the 5-second mark +- Uploads the generated thumbnail to R2 storage + +### Task code + +```ts trigger/ffmpeg-generate-thumbnail.ts +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import ffmpeg from "fluent-ffmpeg"; +import fs from "fs/promises"; +import fetch from "node-fetch"; +import { Readable } from "node:stream"; +import os from "os"; +import path from "path"; + +// Initialize S3 client +const s3Client = new S3Client({ + // How to authenticate to R2: https://developers.cloudflare.com/r2/api/s3/tokens/ + region: "auto", + endpoint: process.env.R2_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const ffmpegGenerateThumbnail = task({ + id: "ffmpeg-generate-thumbnail", + run: async (payload: { videoUrl: string }) => { + const { videoUrl } = payload; + + // Generate output file name + const tempDirectory = os.tmpdir(); + const outputPath = path.join(tempDirectory, `thumbnail_${Date.now()}.jpg`); + + // Fetch the video + const response = await fetch(videoUrl); + + // Generate the thumbnail + await new Promise((resolve, reject) => { + if (!response.body) { + return reject(new Error("Failed to fetch video")); + } + ffmpeg(Readable.from(response.body)) + .screenshots({ + count: 1, + folder: "/tmp", + filename: path.basename(outputPath), + size: "320x240", + timemarks: ["5"], // 5 seconds + }) + .on("end", resolve) + .on("error", reject); + }); + + // Read the generated thumbnail + const thumbnail = await fs.readFile(outputPath); + + // Upload the compressed video to S3, replacing slashes with underscores + const r2Key = `thumbnails/${path.basename(outputPath)}`; + + const uploadParams = { + Bucket: process.env.R2_BUCKET, + Key: r2Key, + Body: thumbnail, + }; + + // Upload the thumbnail to R2 and get the URL + await s3Client.send(new PutObjectCommand(uploadParams)); + const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; + logger.log("Thumbnail uploaded to R2", { url: r2Url }); + + // Delete the temporary file + await fs.unlink(outputPath); + + // Log thumbnail generation results + logger.log(`Thumbnail uploaded to S3: ${r2Url}`); + + // Return the thumbnail buffer, file path, sizes, and S3 URL + return { + thumbnailBuffer: thumbnail, + thumbnailPath: outputPath, + r2Url, + }; + }, +}); +``` diff --git a/docs/examples/sharp-image-processing.mdx b/docs/examples/sharp-image-processing.mdx new file mode 100644 index 000000000..ba4bf5856 --- /dev/null +++ b/docs/examples/sharp-image-processing.mdx @@ -0,0 +1,121 @@ +--- +title: "Process images using Sharp" +sidebarTitle: "Sharp image processing" +description: "This example demonstrates how to process images using the Sharp library with Trigger.dev." +--- + +## Overview + +This task optimizes and watermarks an image using the Sharp library, and then uploads the processed image to R2 storage. + +## Adding build configurations + +To use this example, you'll first need to add these build settings to your `trigger.config.ts` file: + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "", + // Your other config settings... + build: { + // This is required to use the Sharp library + external: ["sharp"], + }, +}); +``` + + + Any packages that install or build a native binary should be added to external, as native binaries + cannot be bundled. + + +## Key features + + - Resizes and rotates an image + - Adds a watermark to the image + - Uploads the processed image to R2 storage + +## Task code + +```ts trigger/sharp-image-processing.ts +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { logger, task } from "@trigger.dev/sdk/v3"; +import fs from "fs/promises"; +import fetch from "node-fetch"; +import os from "os"; +import path from "path"; +import sharp from "sharp"; + +// Initialize R2 client +const r2Client = new S3Client({ + region: "auto", + endpoint: process.env.R2_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const sharpProcessImage = task({ + id: "sharp-process-image", + run: async (payload: { imageUrl: string; watermarkUrl: string }) => { + const { imageUrl, watermarkUrl } = payload; + + // Generate temporary and output file names + const tempDirectory = os.tmpdir(); + const outputPath = path.join(tempDirectory, `output_${Date.now()}.jpg`); + + // Fetch the image and watermark + const [imageResponse, watermarkResponse] = await Promise.all([ + fetch(imageUrl), + fetch(watermarkUrl), + ]); + const imageBuffer = await imageResponse.arrayBuffer(); + const watermarkBuffer = await watermarkResponse.arrayBuffer(); + + // Optimize the image using Sharp + await sharp(Buffer.from(imageBuffer)) + .rotate(90) // Rotate the image by 90 degrees + .resize(800, 600) // Resize the image to 800x600 + .composite([ + { + input: Buffer.from(watermarkBuffer), + gravity: "southeast", // Position the watermark in the bottom-right corner + }, + ]) + .toFormat("jpeg") + .toFile(outputPath); + + // Log the output file path + logger.log(`Optimized image saved at: ${outputPath}`); + + // Read the optimized image file + const optimizedImageBuffer = await fs.readFile(outputPath); + + // Upload the optimized image to R2, replacing slashes with underscores + const r2Key = `processed-images/${path.basename(outputPath)}`; + + const uploadParams = { + Bucket: process.env.R2_BUCKET, + Key: r2Key, + Body: optimizedImageBuffer, + }; + + // Upload the image to R2 and get the URL + await r2Client.send(new PutObjectCommand(uploadParams)); + const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; + logger.log("Optimized image uploaded to R2", { url: r2Url }); + + // Delete the temporary file + await fs.unlink(outputPath); + + // Return the optimized image buffer, file path, and R2 URL + return { + optimizedImageBuffer, + optimizedImagePath: outputPath, + r2Url, + }; + }, +}); +``` diff --git a/docs/examples/vercel-ai-sdk.mdx b/docs/examples/vercel-ai-sdk.mdx new file mode 100644 index 000000000..f7ed7b5fb --- /dev/null +++ b/docs/examples/vercel-ai-sdk.mdx @@ -0,0 +1,43 @@ +--- +title: "Using the Vercel AI SDK" +sidebarTitle: "Vercel AI SDK" +description: "This example demonstrates how to use the Vercel AI SDK with Trigger.dev." +--- + +## Overview + +The [Vercel AI SDK](https://www.npmjs.com/package/ai) is a simple way to use AI models from many different providers, including OpenAI, Microsoft Azure, Google Generative AI, Anthropic, Amazon Bedrock, Groq, Perplexity and [more](https://sdk.vercel.ai/providers/ai-sdk-providers). + +It provides a consistent interface to interact with the different AI models, so you can easily switch between them without needing to change your code. + +## Generate text using OpenAI + +This task shows how to use the Vercel AI SDK to generate text from a prompt with OpenAI. + +### Task code + +```ts trigger/vercel-ai-sdk-openai.ts +import { logger, task } from "@trigger.dev/sdk/v3"; +import { generateText } from "ai"; +// Install the package of the AI model you want to use, in this case OpenAI +import { openai } from "@ai-sdk/openai"; // Ensure OPENAI_API_KEY environment variable is set + +export const openaiTask = task({ + id: "openai-text-generate", + + run: async (payload: { prompt: string }) => { + const chatCompletion = await generateText({ + model: openai("gpt-4-turbo"), + // Add a system message which will be included with the prompt + system: "You are a friendly assistant!", + // The prompt passed in from the payload + prompt: payload.prompt, + }); + + // Log the generated text + logger.log("chatCompletion text:" + chatCompletion.text); + + return chatCompletion; + }, +}); +``` diff --git a/docs/mint.json b/docs/mint.json index 254c934c7..06ff7d733 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,10 +1,7 @@ { "$schema": "https://mintlify.com/schema.json", "name": "Trigger.dev", - "openapi": [ - "/openapi.yml", - "/v3-openapi.yaml" - ], + "openapi": ["/openapi.yml", "/v3-openapi.yaml"], "api": { "playground": { "mode": "simple" @@ -103,23 +100,14 @@ "navigation": [ { "group": "Getting Started", - "pages": [ - "introduction", - "quick-start", - "how-it-works", - "upgrading-beta", - "limits" - ] + "pages": ["introduction", "quick-start", "how-it-works", "upgrading-beta", "limits"] }, { "group": "Fundamentals", "pages": [ { "group": "Tasks", - "pages": [ - "tasks/overview", - "tasks/scheduled" - ] + "pages": ["tasks/overview", "tasks/scheduled"] }, "triggering", "apikeys", @@ -128,10 +116,7 @@ }, { "group": "Development", - "pages": [ - "cli-dev", - "run-tests" - ] + "pages": ["cli-dev", "run-tests"] }, { "group": "Deployment", @@ -141,9 +126,7 @@ "github-actions", { "group": "Deployment integrations", - "pages": [ - "vercel-integration" - ] + "pages": ["vercel-integration"] } ] }, @@ -155,13 +138,7 @@ "errors-retrying", { "group": "Wait", - "pages": [ - "wait", - "wait-for", - "wait-until", - "wait-for-event", - "wait-for-request" - ] + "pages": ["wait", "wait-for", "wait-until", "wait-for-event", "wait-for-request"] }, "queue-concurrency", "versioning", @@ -179,10 +156,7 @@ "management/overview", { "group": "Tasks API", - "pages": [ - "management/tasks/trigger", - "management/tasks/batch-trigger" - ] + "pages": ["management/tasks/trigger", "management/tasks/batch-trigger"] }, { "group": "Runs API", @@ -220,9 +194,7 @@ }, { "group": "Projects API", - "pages": [ - "management/projects/runs" - ] + "pages": ["management/projects/runs"] } ] }, @@ -268,11 +240,7 @@ }, { "group": "Help", - "pages": [ - "community", - "help-slack", - "help-email" - ] + "pages": ["community", "help-slack", "help-email"] }, { "group": "Frameworks", @@ -294,23 +262,22 @@ }, { "group": "Dashboard", - "pages": [ - "guides/dashboard/creating-a-project" - ] + "pages": ["guides/dashboard/creating-a-project"] }, { "group": "Migrations", - "pages": [ - "guides/use-cases/upgrading-from-v2" - ] + "pages": ["guides/use-cases/upgrading-from-v2"] }, { "group": "Examples", "pages": [ - "examples/generate-image-with-dall-e3", + "examples/dall-e3-generate-image", + "examples/ffmpeg-video-processing", "examples/open-ai-with-retrying", + "examples/sharp-image-processing", "examples/react-pdf", - "examples/resend-email-sequence" + "examples/resend-email-sequence", + "examples/vercel-ai-sdk" ] } ], @@ -319,4 +286,4 @@ "github": "https://github.com/triggerdotdev", "linkedin": "https://www.linkedin.com/company/triggerdotdev" } -} \ No newline at end of file +} From 74c20762622c2088e3492e920b9043242282b1d7 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Tue, 17 Sep 2024 20:27:07 +0100 Subject: [PATCH 17/55] A couple of docs fixes --- docs/how-it-works.mdx | 4 ++-- docs/logging.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/how-it-works.mdx b/docs/how-it-works.mdx index 4f9369377..45de378b4 100644 --- a/docs/how-it-works.mdx +++ b/docs/how-it-works.mdx @@ -167,7 +167,7 @@ Example of a parent and child task using the Checkpoint-Resume System: ```ts import { task, wait } from "@trigger.dev/sdk/v3"; -const parentTask = task({ +export const parentTask = task({ id: "parent-task", run: async () => { console.log("Starting parent task"); @@ -186,7 +186,7 @@ const parentTask = task({ }, }); -const childTask = task({ +export const childTask = task({ id: "child-task", run: async (payload: { data: string }) => { console.log("Starting child task with data:", payload.data); diff --git a/docs/logging.mdx b/docs/logging.mdx index 8d9c25eba..7fc810f29 100644 --- a/docs/logging.mdx +++ b/docs/logging.mdx @@ -47,7 +47,7 @@ Trigger.dev uses OpenTelemetry tracing under the hood. With automatic tracing fo ![The run log](/images/auto-instrumentation.png) -You can [add instrumentations](/trigger-config#instrumentations). The Prisma one above will automatically trace all Prisma queries. +You can [add instrumentations](/config/config-file#instrumentations). The Prisma one above will automatically trace all Prisma queries. ### Add custom traces From 56a5b588490fb0442f6d743e78b3858487f7b8b2 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Wed, 18 Sep 2024 10:29:55 +0100 Subject: [PATCH 18/55] Add acking to RESUME_AFTER_DEPENDENCY message to the coordinator (#1313) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix for run filtering not working with some special characters (double encoded) * Add the full dependentTaskAttempt to a ResumeBatchRunService log * Added RESUME_AFTER_DEPENDENCY_WITH_ACK * Set the delay to 5s * If a checkpoint has been created, the coordinator won’t continue the run with RESUME_AFTER_DEPENDENCY_WITH_ACK * If we’re keeping the run alive then set socket.data.requiresCheckpointResumeWithMessage to undefined * Log out the data before and after setting socket.data.requiresCheckpointResumeWithMessage --- apps/coordinator/src/index.ts | 69 +++++++++++++++++++ apps/webapp/app/hooks/useSearchParam.ts | 4 +- .../v3/marqs/sharedQueueConsumer.server.ts | 43 +++++++++--- .../app/v3/services/resumeBatchRun.server.ts | 4 +- packages/core/src/v3/schemas/messages.ts | 43 ++++++++---- 5 files changed, 138 insertions(+), 25 deletions(-) diff --git a/apps/coordinator/src/index.ts b/apps/coordinator/src/index.ts index 0d922174f..15cd87ab6 100644 --- a/apps/coordinator/src/index.ts +++ b/apps/coordinator/src/index.ts @@ -162,6 +162,49 @@ class TaskCoordinator { taskSocket.emit("RESUME_AFTER_DEPENDENCY", message); }, + RESUME_AFTER_DEPENDENCY_WITH_ACK: async (message) => { + const taskSocket = await this.#getAttemptSocket(message.attemptFriendlyId); + + if (!taskSocket) { + logger.log("Socket for attempt not found", { + attemptFriendlyId: message.attemptFriendlyId, + }); + return { + success: false, + error: { + name: "SocketNotFoundError", + message: "Socket for attempt not found", + }, + }; + } + + //if this is set, we want to kill the process because it will be resumed with the checkpoint from the queue + if (taskSocket.data.requiresCheckpointResumeWithMessage) { + logger.log("RESUME_AFTER_DEPENDENCY_WITH_ACK: Checkpoint is set so going to nack", { + socketData: taskSocket.data, + }); + + return { + success: false, + error: { + name: "CheckpointMessagePresentError", + message: + "Checkpoint message is present, so we need to kill the process and resume from the queue.", + }, + }; + } + + await chaosMonkey.call(); + + // In case the task resumed faster than we could checkpoint + this.#cancelCheckpoint(message.runId); + + taskSocket.emit("RESUME_AFTER_DEPENDENCY", message); + + return { + success: true, + }; + }, RESUME_AFTER_DURATION: async (message) => { const taskSocket = await this.#getAttemptSocket(message.attemptFriendlyId); @@ -792,6 +835,18 @@ class TaskCoordinator { return; } + logger.log("WAIT_FOR_TASK checkpoint created", { + checkpoint, + socketData: socket.data, + }); + + //setting this means we can only resume from a checkpoint + socket.data.requiresCheckpointResumeWithMessage = `location:${checkpoint.location}-docker:${checkpoint.docker}`; + logger.log("WAIT_FOR_TASK set requiresCheckpointResumeWithMessage", { + checkpoint, + socketData: socket.data, + }); + const ack = await this.#platformSocket?.sendWithAck("CHECKPOINT_CREATED", { version: "v1", attemptFriendlyId: message.attemptFriendlyId, @@ -804,6 +859,7 @@ class TaskCoordinator { }); if (ack?.keepRunAlive) { + socket.data.requiresCheckpointResumeWithMessage = undefined; logger.log("keeping run alive after task checkpoint", { runId: socket.data.runId }); return; } @@ -862,6 +918,18 @@ class TaskCoordinator { return; } + logger.log("WAIT_FOR_BATCH checkpoint created", { + checkpoint, + socketData: socket.data, + }); + + //setting this means we can only resume from a checkpoint + socket.data.requiresCheckpointResumeWithMessage = `location:${checkpoint.location}-docker:${checkpoint.docker}`; + logger.log("WAIT_FOR_BATCH set checkpoint", { + checkpoint, + socketData: socket.data, + }); + const ack = await this.#platformSocket?.sendWithAck("CHECKPOINT_CREATED", { version: "v1", attemptFriendlyId: message.attemptFriendlyId, @@ -875,6 +943,7 @@ class TaskCoordinator { }); if (ack?.keepRunAlive) { + socket.data.requiresCheckpointResumeWithMessage = undefined; logger.log("keeping run alive after batch checkpoint", { runId: socket.data.runId }); return; } diff --git a/apps/webapp/app/hooks/useSearchParam.ts b/apps/webapp/app/hooks/useSearchParam.ts index 0ed81fb3e..c0f939abc 100644 --- a/apps/webapp/app/hooks/useSearchParam.ts +++ b/apps/webapp/app/hooks/useSearchParam.ts @@ -18,13 +18,13 @@ export function useSearchParams() { } if (typeof value === "string") { - search.set(param, encodeURIComponent(value)); + search.set(param, value); continue; } search.delete(param); for (const v of value) { - search.append(param, encodeURIComponent(v)); + search.append(param, v); } } }, diff --git a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts index 606d9ca92..61a05b6ee 100644 --- a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts @@ -725,20 +725,47 @@ export class SharedQueueConsumer { } try { - logger.debug("Broadcasting RESUME_AFTER_DEPENDENCY", { - runId: resumableAttempt.taskRunId, - attemptId: resumableAttempt.id, - }); - - // The attempt should still be running so we can broadcast to all coordinators to resume immediately - socketIo.coordinatorNamespace.emit("RESUME_AFTER_DEPENDENCY", { - version: "v1", + const resumeMessage = { + version: "v1" as const, runId: resumableAttempt.taskRunId, attemptId: resumableAttempt.id, attemptFriendlyId: resumableAttempt.friendlyId, completions, executions, + }; + + logger.debug("Broadcasting RESUME_AFTER_DEPENDENCY_WITH_ACK", { resumeMessage, message }); + + // The attempt should still be running so we can broadcast to all coordinators to resume immediately + const responses = await socketIo.coordinatorNamespace + .timeout(10_000) + .emitWithAck("RESUME_AFTER_DEPENDENCY_WITH_ACK", resumeMessage); + + logger.debug("RESUME_AFTER_DEPENDENCY_WITH_ACK received", { + resumeMessage, + responses, + message, }); + + if (responses.length === 0) { + logger.error("RESUME_AFTER_DEPENDENCY_WITH_ACK no response", { + resumeMessage, + message, + }); + await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval, 5_000); + return; + } + + const failed = responses.filter((response) => !response.success); + if (failed.length > 0) { + logger.error("RESUME_AFTER_DEPENDENCY_WITH_ACK failed", { + resumeMessage, + failed, + message, + }); + await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval, 5_000); + return; + } } catch (e) { if (e instanceof Error) { this._currentSpan?.recordException(e); diff --git a/apps/webapp/app/v3/services/resumeBatchRun.server.ts b/apps/webapp/app/v3/services/resumeBatchRun.server.ts index f0a9b57f9..b7e6d0ca6 100644 --- a/apps/webapp/app/v3/services/resumeBatchRun.server.ts +++ b/apps/webapp/app/v3/services/resumeBatchRun.server.ts @@ -132,7 +132,9 @@ export class ResumeBatchRunService extends BaseService { if (wasUpdated) { logger.debug("ResumeBatchRunService: Resuming dependent run without checkpoint", { batchRunId: batchRun.id, - dependentTaskAttemptId: batchRun.dependentTaskAttempt.id, + dependentTaskAttempt: batchRun.dependentTaskAttempt, + checkpointEventId: batchRun.checkpointEventId, + hasCheckpointEvent: !!batchRun.checkpointEventId, }); await marqs?.replaceMessage(dependentRun.id, { type: "RESUME", diff --git a/packages/core/src/v3/schemas/messages.ts b/packages/core/src/v3/schemas/messages.ts index 5ce65de9f..746848640 100644 --- a/packages/core/src/v3/schemas/messages.ts +++ b/packages/core/src/v3/schemas/messages.ts @@ -15,6 +15,21 @@ import { WaitReason, } from "./schemas.js"; +const ackCallbackResult = z.discriminatedUnion("success", [ + z.object({ + success: z.literal(false), + error: z.object({ + name: z.string(), + message: z.string(), + stack: z.string().optional(), + stderr: z.string().optional(), + }), + }), + z.object({ + success: z.literal(true), + }), +]); + export const BackgroundWorkerServerMessages = z.discriminatedUnion("type", [ z.object({ type: z.literal("CANCEL_ATTEMPT"), @@ -269,20 +284,7 @@ export const PlatformToProviderMessages = { projectId: z.string(), deploymentId: z.string(), }), - callback: z.discriminatedUnion("success", [ - z.object({ - success: z.literal(false), - error: z.object({ - name: z.string(), - message: z.string(), - stack: z.string().optional(), - stderr: z.string().optional(), - }), - }), - z.object({ - success: z.literal(true), - }), - ]), + callback: ackCallbackResult, }, RESTORE: { message: z.object({ @@ -504,6 +506,7 @@ export const CoordinatorToPlatformMessages = { }; export const PlatformToCoordinatorMessages = { + /** @deprecated use RESUME_AFTER_DEPENDENCY_WITH_ACK instead */ RESUME_AFTER_DEPENDENCY: { message: z.object({ version: z.literal("v1").default("v1"), @@ -514,6 +517,17 @@ export const PlatformToCoordinatorMessages = { executions: TaskRunExecution.array(), }), }, + RESUME_AFTER_DEPENDENCY_WITH_ACK: { + message: z.object({ + version: z.literal("v1").default("v1"), + runId: z.string(), + attemptId: z.string(), + attemptFriendlyId: z.string(), + completions: TaskRunExecutionResult.array(), + executions: TaskRunExecution.array(), + }), + callback: ackCallbackResult, + }, RESUME_AFTER_DURATION: { message: z.object({ version: z.literal("v1").default("v1"), @@ -847,6 +861,7 @@ export const ProdWorkerSocketData = z.object({ podName: z.string(), deploymentId: z.string(), deploymentVersion: z.string(), + requiresCheckpointResumeWithMessage: z.string().optional(), }); export const CoordinatorSocketData = z.object({ From 3d53d4c0867a5ded5770425a2010c9fa9266c8ad Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 11:07:09 +0100 Subject: [PATCH 19/55] Improve the update CLI command and fix missing tsconfig.json error (#1315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes for CLI update command, and make the hide the "whoami" command output when running in dev * Fix an issue where a missing tsconfig.json file would throw an error on dev/deploy * Don’t show latest CLI warning when using a prerelease * Only print CLI update required message when update is embedded * Strip out TRIGGER\_ keys when using syncEnvVars, to prevent deploy errors --- .changeset/clever-buses-watch.md | 6 ++ .changeset/soft-ladybugs-promise.md | 5 ++ .changeset/twelve-onions-decide.md | 5 ++ .../build/src/extensions/core/syncEnvVars.ts | 7 +++ packages/cli-v3/src/commands/dev.ts | 1 + packages/cli-v3/src/commands/login.ts | 11 +++- packages/cli-v3/src/commands/update.ts | 63 ++++++++++++------- packages/cli-v3/src/commands/whoami.ts | 23 ++++--- packages/cli-v3/src/config.ts | 12 +++- packages/cli-v3/src/utilities/sourceFiles.ts | 2 +- packages/core/src/v3/build/resolvedConfig.ts | 1 + 11 files changed, 98 insertions(+), 38 deletions(-) create mode 100644 .changeset/clever-buses-watch.md create mode 100644 .changeset/soft-ladybugs-promise.md create mode 100644 .changeset/twelve-onions-decide.md diff --git a/.changeset/clever-buses-watch.md b/.changeset/clever-buses-watch.md new file mode 100644 index 000000000..a2cc1065d --- /dev/null +++ b/.changeset/clever-buses-watch.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/core": patch +--- + +Fix an issue where a missing tsconfig.json file would throw an error on dev/deploy diff --git a/.changeset/soft-ladybugs-promise.md b/.changeset/soft-ladybugs-promise.md new file mode 100644 index 000000000..68eafd456 --- /dev/null +++ b/.changeset/soft-ladybugs-promise.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Fixes for CLI update command, and make the hide the "whoami" command output when running in dev. diff --git a/.changeset/twelve-onions-decide.md b/.changeset/twelve-onions-decide.md new file mode 100644 index 000000000..8d33f8341 --- /dev/null +++ b/.changeset/twelve-onions-decide.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Strip out TRIGGER\_ keys when using syncEnvVars, to prevent deploy errors diff --git a/packages/build/src/extensions/core/syncEnvVars.ts b/packages/build/src/extensions/core/syncEnvVars.ts index f0a0ac5dc..231bdb86f 100644 --- a/packages/build/src/extensions/core/syncEnvVars.ts +++ b/packages/build/src/extensions/core/syncEnvVars.ts @@ -63,6 +63,8 @@ const UNSYNCABLE_ENV_VARS = [ "_", ]; +const UNSYNCABLE_ENV_VARS_PREFIXES = ["TRIGGER_"]; + export type SyncEnvVarsFunction = (params: SyncEnvVarsParams) => SyncEnvVarsResult; export type SyncEnvVarsOptions = { @@ -98,6 +100,11 @@ export function syncEnvVars(fn: SyncEnvVarsFunction, options?: SyncEnvVarsOption return acc; } + // Strip out any TRIGGER_ prefix env vars + if (UNSYNCABLE_ENV_VARS_PREFIXES.some((prefix) => key.startsWith(prefix))) { + return acc; + } + acc[key] = value; return acc; }, diff --git a/packages/cli-v3/src/commands/dev.ts b/packages/cli-v3/src/commands/dev.ts index 55f1f4112..da82bc907 100644 --- a/packages/cli-v3/src/commands/dev.ts +++ b/packages/cli-v3/src/commands/dev.ts @@ -51,6 +51,7 @@ export async function devCommand(options: DevCommandOptions) { const authorization = await login({ embedded: true, + silent: true, defaultApiUrl: options.apiUrl, profile: options.profile, }); diff --git a/packages/cli-v3/src/commands/login.ts b/packages/cli-v3/src/commands/login.ts index f4aa318f7..67e136c77 100644 --- a/packages/cli-v3/src/commands/login.ts +++ b/packages/cli-v3/src/commands/login.ts @@ -59,12 +59,18 @@ export type LoginOptions = { defaultApiUrl?: string; embedded?: boolean; profile?: string; + silent?: boolean; }; export async function login(options?: LoginOptions): Promise { return await tracer.startActiveSpan("login", async (span) => { try { - const opts = { defaultApiUrl: "https://api.trigger.dev", embedded: false, ...options }; + const opts = { + defaultApiUrl: "https://api.trigger.dev", + embedded: false, + silent: false, + ...options, + }; span.setAttributes({ "cli.config.apiUrl": opts.defaultApiUrl, @@ -111,7 +117,8 @@ export async function login(options?: LoginOptions): Promise { skipTelemetry: !span.isRecording(), logLevel: logger.loggerLevel, }, - true + true, + opts.silent ); if (!whoAmIResult.success) { diff --git a/packages/cli-v3/src/commands/update.ts b/packages/cli-v3/src/commands/update.ts index c8262da2f..d6d1bb75c 100644 --- a/packages/cli-v3/src/commands/update.ts +++ b/packages/cli-v3/src/commands/update.ts @@ -43,7 +43,7 @@ export function configureUpdateCommand(program: Command) { const triggerPackageFilter = /^@trigger\.dev/; export async function updateCommand(dir: string, options: UpdateCommandOptions) { - await updateTriggerPackages(dir, options); + await updateTriggerPackages(dir, options, false); } export async function updateTriggerPackages( @@ -74,7 +74,7 @@ export async function updateTriggerPackages( const newCliVersion = await updateCheck(); - if (newCliVersion) { + if (newCliVersion && !cliVersion.startsWith("0.0.0")) { prettyWarning( "You're not running the latest CLI version, please consider updating ASAP", `Current: ${cliVersion}\nLatest: ${newCliVersion}`, @@ -127,24 +127,30 @@ export async function updateTriggerPackages( if (mismatches.length === 0) { if (!embedded) { - outro(`Nothing to do${newCliVersion ? " ..but you should really update your CLI!" : ""}`); + outro(`Nothing to update${newCliVersion ? " ..but you should really update your CLI!" : ""}`); return hasOutput; } return hasOutput; } - if (isDowngrade) { - prettyError("Some of the installed @trigger.dev packages are newer than your CLI version"); - } else { - prettyWarning( - "Mismatch between your CLI version and installed packages", - "We recommend pinned versions for guaranteed compatibility" - ); + if (embedded) { + if (isDowngrade) { + prettyError("Some of the installed @trigger.dev packages are newer than your CLI version"); + } else { + if (embedded) { + prettyWarning( + "Mismatch between your CLI version and installed packages", + "We recommend pinned versions for guaranteed compatibility" + ); + } + } } if (!hasTTY) { // Running in CI with version mismatch detected - outro("Deploy failed"); + if (embedded) { + outro("Deploy failed"); + } console.log( `ERROR: Version mismatch detected while running in CI. This won't end well. Aborting. @@ -162,8 +168,7 @@ export async function updateTriggerPackages( } // WARNING: We can only start accepting user input once we know this is a TTY, otherwise, the process will exit with an error in CI - - if (isDowngrade) { + if (isDowngrade && embedded) { printUpdateTable("Versions", mismatches, cliVersion, "installed", "CLI"); outro("CLI update required!"); @@ -187,14 +192,20 @@ export async function updateTriggerPackages( if (!userWantsToUpdate) { if (requireUpdate) { - outro("You shall not pass!"); + if (embedded) { + outro("You shall not pass!"); - logger.log( - `${chalkError( - "X Error:" - )} Update required: Version mismatches are a common source of bugs and errors. Please update or use \`--skip-update-check\` at your own risk.\n` - ); - process.exit(1); + logger.log( + `${chalkError( + "X Error:" + )} Update required: Version mismatches are a common source of bugs and errors. Please update or use \`--skip-update-check\` at your own risk.\n` + ); + process.exit(1); + } else { + outro("No updates applied"); + + process.exit(0); + } } if (!embedded) { @@ -205,7 +216,7 @@ export async function updateTriggerPackages( } const installSpinner = spinner(); - installSpinner.start("Writing new package.json file"); + installSpinner.start("Updating dependencies in package.json"); // Backup package.json const packageJsonBackupPath = `${packageJsonPath}.bak`; @@ -235,12 +246,16 @@ export async function updateTriggerPackages( const packageManager = await detectPackageManager(projectPath); try { - installSpinner.message(`Installing new package versions with ${packageManager}`); + installSpinner.message( + `Installing new package versions${packageManager ? ` with ${packageManager.name}` : ""}` + ); - await installDependencies({ cwd: projectPath }); + await installDependencies({ cwd: projectPath, silent: true }); } catch (error) { installSpinner.stop( - `Failed to install new package versions${packageManager ? ` with ${packageManager}` : ""}` + `Failed to install new package versions${ + packageManager ? ` with ${packageManager.name}` : "" + }` ); // Remove exit handler in case of failure diff --git a/packages/cli-v3/src/commands/whoami.ts b/packages/cli-v3/src/commands/whoami.ts index 73c740c94..f4451da36 100644 --- a/packages/cli-v3/src/commands/whoami.ts +++ b/packages/cli-v3/src/commands/whoami.ts @@ -51,27 +51,32 @@ export async function whoAmICommand(options: unknown) { export async function whoAmI( options?: WhoamiCommandOptions, - embedded: boolean = false + embedded: boolean = false, + silent: boolean = false ): Promise { if (!embedded) { intro(`Displaying your account details [${options?.profile ?? "default"}]`); } const loadingSpinner = spinner(); - loadingSpinner.start("Checking your account details"); + + if (!silent) { + loadingSpinner.start("Checking your account details"); + } const authentication = await isLoggedIn(options?.profile); if (!authentication.ok) { if (authentication.error === "fetch failed") { - loadingSpinner.stop("Fetch failed. Platform down?"); + !silent && loadingSpinner.stop("Fetch failed. Platform down?"); } else { if (embedded) { - loadingSpinner.stop( - `Failed to check account details. You may want to run \`trigger.dev logout --profile ${ - options?.profile ?? "default" - }\` and try again.` - ); + !silent && + loadingSpinner.stop( + `Failed to check account details. You may want to run \`trigger.dev logout --profile ${ + options?.profile ?? "default" + }\` and try again.` + ); } else { loadingSpinner.stop( `You must login first. Use \`trigger.dev login --profile ${ @@ -110,7 +115,7 @@ URL: ${chalkLink(authentication.auth.apiUrl)} `Account details [${authentication.profile}]` ); } else { - loadingSpinner.stop(`Retrieved your account details for ${userData.data.email}`); + !silent && loadingSpinner.stop(`Retrieved your account details for ${userData.data.email}`); } return userData; diff --git a/packages/cli-v3/src/config.ts b/packages/cli-v3/src/config.ts index 5e284572d..6cab7dd45 100644 --- a/packages/cli-v3/src/config.ts +++ b/packages/cli-v3/src/config.ts @@ -138,7 +138,7 @@ async function resolveConfig( warn = true ): Promise { const packageJsonPath = await resolvePackageJSON(cwd); - const tsconfigPath = await resolveTSConfig(cwd); + const tsconfigPath = await safeResolveTsConfig(cwd); const lockfilePath = await resolveLockfile(cwd); const workspaceDir = await findWorkspaceDir(cwd); @@ -179,7 +179,7 @@ async function resolveConfig( conditions: [], }, } - ); + ) as ResolvedConfig; // TODO: For some reason, without this, there is a weird type error complaining about tsconfigPath being string | nullish, which can't be assigned to string | undefined return { ...mergedConfig, @@ -188,6 +188,14 @@ async function resolveConfig( }; } +async function safeResolveTsConfig(cwd: string) { + try { + return await resolveTSConfig(cwd); + } catch { + return undefined; + } +} + const IGNORED_DIRS = ["node_modules", ".git", "dist", "out", "build"]; async function autoDetectDirs(workingDir: string): Promise { diff --git a/packages/cli-v3/src/utilities/sourceFiles.ts b/packages/cli-v3/src/utilities/sourceFiles.ts index 556e5d8e5..b0b976ff8 100644 --- a/packages/cli-v3/src/utilities/sourceFiles.ts +++ b/packages/cli-v3/src/utilities/sourceFiles.ts @@ -31,7 +31,7 @@ export async function resolveFileSources( } await resolveConfigSource(sources, resolvedConfig.workingDir, resolvedConfig.configFile); - await resolveConfigSource(sources, resolvedConfig.workingDir, resolvedConfig.tsconfig); + await resolveConfigSource(sources, resolvedConfig.workingDir, resolvedConfig.tsconfigPath); await resolveConfigSource(sources, resolvedConfig.workingDir, resolvedConfig.packageJsonPath); return sources; diff --git a/packages/core/src/v3/build/resolvedConfig.ts b/packages/core/src/v3/build/resolvedConfig.ts index 9aa249a5f..674a7fce1 100644 --- a/packages/core/src/v3/build/resolvedConfig.ts +++ b/packages/core/src/v3/build/resolvedConfig.ts @@ -24,6 +24,7 @@ export type ResolvedConfig = Prettify< packageJsonPath: string; lockfilePath: string; configFile?: string; + tsconfigPath?: string; resolveEnvVars?: ResolveEnvironmentVariablesFunction; instrumentedPackageNames?: string[]; } From 382ce8daff77c4a5b148c0e8acd78b9b93cdb3ee Mon Sep 17 00:00:00 2001 From: Dan <8297864+D-K-P@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:08:55 +0100 Subject: [PATCH 20/55] Added overview pages for guides and examples, and improved examples (#1314) * Added introduction page for guides * New intro page for examples * Fixed links * Updated examples intro to include all of the new ones * Improved FFmpeg example * Improved the react pdf example * Added Supabase overview page * Updated card-supabase snippet * Added sharp payload instructions * Added vercel payload instructions * Added dall-e payload instructions * Added openai payload instructions * Added resend payload instructions * Made the prompts more consistent * Minor tweaks and moved bun * Updated links and added bun logo --------- Co-authored-by: James Ritchie --- docs/examples/dall-e3-generate-image.mdx | 14 +- docs/examples/ffmpeg-video-processing.mdx | 115 ++++++---- docs/examples/intro.mdx | 15 ++ docs/examples/open-ai-with-retrying.mdx | 11 +- docs/examples/react-pdf.mdx | 56 +++-- docs/examples/resend-email-sequence.mdx | 23 +- docs/examples/sharp-image-processing.mdx | 11 + docs/examples/vercel-ai-sdk.mdx | 10 + docs/guides/{ => frameworks}/bun.mdx | 0 docs/guides/frameworks/introduction.mdx | 20 ++ .../frameworks/supabase-guides-overview.mdx | 22 ++ docs/mint.json | 7 +- docs/snippets/card-bun.mdx | 10 + docs/snippets/card-nextjs.mdx | 22 ++ docs/snippets/card-nodejs.mdx | 11 + docs/snippets/card-remix.mdx | 206 ++++++++++++++++++ docs/snippets/card-supabase.mdx | 34 +++ 17 files changed, 514 insertions(+), 73 deletions(-) create mode 100644 docs/examples/intro.mdx rename docs/guides/{ => frameworks}/bun.mdx (100%) create mode 100644 docs/guides/frameworks/introduction.mdx create mode 100644 docs/guides/frameworks/supabase-guides-overview.mdx create mode 100644 docs/snippets/card-bun.mdx create mode 100644 docs/snippets/card-nextjs.mdx create mode 100644 docs/snippets/card-nodejs.mdx create mode 100644 docs/snippets/card-remix.mdx create mode 100644 docs/snippets/card-supabase.mdx diff --git a/docs/examples/dall-e3-generate-image.mdx b/docs/examples/dall-e3-generate-image.mdx index abcab2cf7..5846be703 100644 --- a/docs/examples/dall-e3-generate-image.mdx +++ b/docs/examples/dall-e3-generate-image.mdx @@ -29,7 +29,6 @@ export const generateContent = task({ maxAttempts: 3, // Retry up to 3 times }, run: async ({ theme, description }: Payload) => { - // Generate text const textResult = await openai.chat.completions.create({ model: "gpt-4o", @@ -64,4 +63,15 @@ function generateTextPrompt(theme: string, description: string): any { function generateImagePrompt(theme: string, description: string): any { return `Theme: ${theme}\n\nDescription: ${description}`; } -``` \ No newline at end of file +``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "theme": "A beautiful sunset", + "description": "A sunset over the ocean with a tiny yacht in the distance." +} +``` diff --git a/docs/examples/ffmpeg-video-processing.mdx b/docs/examples/ffmpeg-video-processing.mdx index 33665b77d..a5a33a010 100644 --- a/docs/examples/ffmpeg-video-processing.mdx +++ b/docs/examples/ffmpeg-video-processing.mdx @@ -98,14 +98,13 @@ export const ffmpegCompressVideo = task({ // Read the compressed video const compressedVideo = await fs.readFile(outputPath); - const compressedSize = compressedVideo.length; // Log compression results logger.log(`Compressed video size: ${compressedSize} bytes`); - logger.log(`Compressed video saved at: ${outputPath}`); + logger.log(`Temporary compressed video file created`, { outputPath }); - // Upload the compressed video to S3, replacing slashes with underscores + // Create the r2Key for the extracted audio, using the base name of the output path const r2Key = `processed-videos/${path.basename(outputPath)}`; const uploadParams = { @@ -116,22 +115,31 @@ export const ffmpegCompressVideo = task({ // Upload the video to R2 and get the URL await s3Client.send(new PutObjectCommand(uploadParams)); - const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; - logger.log("Compressed video uploaded to R2", { url: r2Url }); + logger.log(`Compressed video saved to your r2 bucket`, { r2Key }); // Delete the temporary compressed video file await fs.unlink(outputPath); + logger.log(`Temporary compressed video file deleted`, { outputPath }); - // Return the compressed video file path, compressed size, and S3 URL + // Return the compressed video buffer and r2 key return { - compressedVideoPath: outputPath, - compressedSize, - r2Url, + Bucket: process.env.R2_BUCKET, + r2Key, }; }, }); ``` +### Testing: + +To test this task, use this payload structure: + +```json +{ + "videoUrl": "" +} +``` + ## Extract audio from a video using FFmpeg This task demonstrates how to use FFmpeg to extract audio from a video, convert it to WAV format, and upload it to R2 storage. @@ -145,11 +153,6 @@ This task demonstrates how to use FFmpeg to extract audio from a video, convert ### Task code - - When testing, make sure to provide a video URL that contains audio. If the video does not have - audio, the task will fail. - - ```ts trigger/ffmpeg-extract-audio.ts import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { logger, task } from "@trigger.dev/sdk/v3"; @@ -176,63 +179,81 @@ export const ffmpegExtractAudio = task({ run: async (payload: { videoUrl: string }) => { const { videoUrl } = payload; - // Generate temporary and output file names + // Generate temporary file names const tempDirectory = os.tmpdir(); - const outputPath = path.join(tempDirectory, `output_${Date.now()}.wav`); + const outputPath = path.join(tempDirectory, `audio_${Date.now()}.wav`); // Fetch the video const response = await fetch(videoUrl); - // Convert the video to WAV + // Extract the audio await new Promise((resolve, reject) => { if (!response.body) { return reject(new Error("Failed to fetch video")); } + ffmpeg(Readable.from(response.body)) - .toFormat("wav") - .save(outputPath) - .on("end", () => { - logger.log(`WAV file saved to ${outputPath}`); - resolve(outputPath); - }) - .on("error", (err) => { - reject(err); - }); + .outputOptions([ + "-vn", // Disable video output + "-acodec pcm_s16le", // Use PCM 16-bit little-endian encoding + "-ar 44100", // Set audio sample rate to 44.1 kHz + "-ac 2", // Set audio channels to stereo + ]) + .output(outputPath) + .on("end", resolve) + .on("error", reject) + .run(); }); - // Read the WAV file - const wavBuffer = await fs.readFile(outputPath); + // Read the extracted audio + const audioBuffer = await fs.readFile(outputPath); + const audioSize = audioBuffer.length; - // Log the output file path - logger.log(`Converted video saved at: ${outputPath}`); + // Log audio extraction results + logger.log(`Extracted audio size: ${audioSize} bytes`); + logger.log(`Temporary audio file created`, { outputPath }); - // Upload the compressed video to S3, replacing slashes with underscores - const r2Key = `processed-audio/${path.basename(outputPath)}`; + // Create the r2Key for the extracted audio, using the base name of the output path + const r2Key = `extracted-audio/${path.basename(outputPath)}`; const uploadParams = { Bucket: process.env.R2_BUCKET, Key: r2Key, - Body: wavBuffer, + Body: audioBuffer, }; // Upload the audio to R2 and get the URL await s3Client.send(new PutObjectCommand(uploadParams)); - const r2Url = `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET}/${r2Key}`; - logger.log("Extracted audio uploaded to R2", { url: r2Url }); + logger.log(`Extracted audio saved to your R2 bucket`, { r2Key }); - // Delete the temporary file + // Delete the temporary audio file await fs.unlink(outputPath); + logger.log(`Temporary audio file deleted`, { outputPath }); - // Return the WAV buffer and file path + // Return the audio file path, size, and R2 URL return { - wavBuffer, - wavFilePath: outputPath, - r2Url, + Bucket: process.env.R2_BUCKET, + r2Key, }; }, }); ``` +### Testing: + +To test this task, use this payload structure: + + + Make sure to provide a video URL that contains audio. If the video does not have audio, the task + will fail. + + +```json +{ + "videoUrl": "" +} +``` + ## Generate a thumbnail from a video using FFmpeg This task demonstrates how to use FFmpeg to generate a thumbnail from a video at a specific time and upload the generated thumbnail to R2 storage. @@ -298,7 +319,7 @@ export const ffmpegGenerateThumbnail = task({ // Read the generated thumbnail const thumbnail = await fs.readFile(outputPath); - // Upload the compressed video to S3, replacing slashes with underscores + // Create the r2Key for the extracted audio, using the base name of the output path const r2Key = `thumbnails/${path.basename(outputPath)}`; const uploadParams = { @@ -318,7 +339,7 @@ export const ffmpegGenerateThumbnail = task({ // Log thumbnail generation results logger.log(`Thumbnail uploaded to S3: ${r2Url}`); - // Return the thumbnail buffer, file path, sizes, and S3 URL + // Return the thumbnail buffer, path, and R2 URL return { thumbnailBuffer: thumbnail, thumbnailPath: outputPath, @@ -327,3 +348,13 @@ export const ffmpegGenerateThumbnail = task({ }, }); ``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "videoUrl": "" +} +``` diff --git a/docs/examples/intro.mdx b/docs/examples/intro.mdx new file mode 100644 index 000000000..e9881ebdf --- /dev/null +++ b/docs/examples/intro.mdx @@ -0,0 +1,15 @@ +--- +title: "Introduction" +sidebarTitle: "Introduction" +description: "Learn how to use Trigger.dev with these practical task examples." +--- + +| Example task | Description | +| :------------------------------------------------------------ | :-------------------------------------------------------------------------- | +| [DALL·E 3 image generation](/examples/dall-e3-generate-image) | Use OpenAI's GPT-4o and DALL·E 3 to generate an image and text. | +| [FFmpeg video processing](/examples/ffmpeg-video-processing) | Use FFmpeg to process a video in various ways and save it to Cloudflare R2. | +| [OpenAI with retrying](/examples/open-ai-with-retrying) | Create a reusable OpenAI task with custom retry options. | +| [React to PDF](/examples/react-pdf) | Use `react-pdf` to generate a PDF and save it to Cloudflare R2. | +| [Resend email sequence](/examples/resend-email-sequence) | Send a sequence of emails over several days using Resend with Trigger.dev. | +| [Sharp image processing](/examples/sharp-image-processing) | Use Sharp to process an image and save it to Cloudflare R2. | +| [Vercel AI SDK](/examples/vercel-ai-sdk) | Use Vercel AI SDK to generate text using OpenAI. | diff --git a/docs/examples/open-ai-with-retrying.mdx b/docs/examples/open-ai-with-retrying.mdx index c89ca4bdc..2a0ae1f6b 100644 --- a/docs/examples/open-ai-with-retrying.mdx +++ b/docs/examples/open-ai-with-retrying.mdx @@ -43,5 +43,14 @@ export const openaiTask = task({ return chatCompletion.choices[0].message.content; }, }); +``` -``` \ No newline at end of file +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "prompt": "What is the meaning of life?" +} +``` diff --git a/docs/examples/react-pdf.mdx b/docs/examples/react-pdf.mdx index 165e93847..cfda52faa 100644 --- a/docs/examples/react-pdf.mdx +++ b/docs/examples/react-pdf.mdx @@ -10,16 +10,18 @@ This example demonstrates how to use Trigger.dev to generate a PDF using `react- ## Task code -```ts trigger/generateResumePDF.ts + This example must be a .tsx file to use React components. + +```ts trigger/generateResumePDF.tsx import { logger, task } from "@trigger.dev/sdk/v3"; -import { Document, Page, Text, View } from "@react-pdf/renderer"; -import { renderToBuffer } from "@react-pdf/renderer"; +import { renderToBuffer, Document, Page, Text, View } from "@react-pdf/renderer"; import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; -// Initialize S3 client -const s3Client = new S3Client({ +// Initialize R2 client +const r2Client = new S3Client({ + // How to authenticate to R2: https://developers.cloudflare.com/r2/api/s3/tokens/ region: "auto", - endpoint: process.env.S3_ENDPOINT, + endpoint: process.env.R2_ENDPOINT, credentials: { accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", @@ -29,6 +31,7 @@ const s3Client = new S3Client({ export const generateResumePDF = task({ id: "generate-resume-pdf", run: async (payload: { text: string }) => { + // Log the payload logger.log("Generating PDF resume", payload); // Render the ResumeDocument component to a PDF buffer @@ -42,28 +45,41 @@ export const generateResumePDF = task({ ); - // Generate a unique filename - const filename = `${payload.text - .replace(/\s+/g, "-") - .toLowerCase()}-${Date.now()}.pdf`; + // Generate a unique filename based on the text and current timestamp + const filename = `${payload.text.replace(/\s+/g, "-").toLowerCase()}-${Date.now()}.pdf`; - // Upload to R2 - const s3Key = `resumes/${filename}`; + // Set the R2 key for the PDF file + const r2Key = `resumes/${filename}`; + + // Set the upload parameters for R2 const uploadParams = { - Bucket: process.env.S3_BUCKET, - Key: s3Key, + Bucket: process.env.R2_BUCKET, + Key: r2Key, Body: pdfBuffer, ContentType: "application/pdf", }; + // Log the upload parameters logger.log("Uploading to R2 with params", uploadParams); - // Upload the PDF to R2 and return the URL. - await s3Client.send(new PutObjectCommand(uploadParams)); - const s3Url = `https://${process.env.S3_BUCKET}.s3.amazonaws.com/${s3Key}`; - logger.log("PDF uploaded to R2", { url: s3Url }); - return { pdfUrl: s3Url }; + // Upload the PDF to R2 + await r2Client.send(new PutObjectCommand(uploadParams)); + + // Return the Bucket and R2 key for the uploaded PDF + return { + Bucket: process.env.R2_BUCKET, + Key: r2Key, + }; }, }); +``` -``` \ No newline at end of file +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "text": "Hello, world!" +} +``` diff --git a/docs/examples/resend-email-sequence.mdx b/docs/examples/resend-email-sequence.mdx index 522aaa2be..2efe8b802 100644 --- a/docs/examples/resend-email-sequence.mdx +++ b/docs/examples/resend-email-sequence.mdx @@ -22,7 +22,7 @@ export const emailSequence = task({ run: async (payload: { userId: string; email: string; name: string }) => { console.log(`Start email sequence for user ${payload.userId}`, payload); - //send the first email immediately + // Send the first email immediately const firstEmailResult = await retry.onThrow( async ({ attempt }) => { const { data, error } = await resend.emails.send({ @@ -33,7 +33,7 @@ export const emailSequence = task({ }); if (error) { - //throwing an error will trigger a retry of this block + // Throwing an error will trigger a retry of this block throw error; } @@ -42,10 +42,10 @@ export const emailSequence = task({ { maxAttempts: 3 } ); - //then wait 3 days + // Then wait 3 days await wait.for({ days: 3 }); - //send the second email + // Send the second email const secondEmailResult = await retry.onThrow( async ({ attempt }) => { const { data, error } = await resend.emails.send({ @@ -56,7 +56,7 @@ export const emailSequence = task({ }); if (error) { - //throwing an error will trigger a retry of this block + // Throwing an error will trigger a retry of this block throw error; } @@ -68,5 +68,16 @@ export const emailSequence = task({ //etc... }, }); +``` -``` \ No newline at end of file +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "userId": "123", + "email": "", // Replace with your test email + "name": "Alice Testington" +} +``` diff --git a/docs/examples/sharp-image-processing.mdx b/docs/examples/sharp-image-processing.mdx index ba4bf5856..76d781f6b 100644 --- a/docs/examples/sharp-image-processing.mdx +++ b/docs/examples/sharp-image-processing.mdx @@ -119,3 +119,14 @@ export const sharpProcessImage = task({ }, }); ``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "imageUrl": "", // Replace with a URL to a JPEG image + "watermarkUrl": "" // Replace with a URL to a PNG watermark image +} +``` diff --git a/docs/examples/vercel-ai-sdk.mdx b/docs/examples/vercel-ai-sdk.mdx index f7ed7b5fb..755b87859 100644 --- a/docs/examples/vercel-ai-sdk.mdx +++ b/docs/examples/vercel-ai-sdk.mdx @@ -41,3 +41,13 @@ export const openaiTask = task({ }, }); ``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "prompt": "What is the meaning of life?" +} +``` diff --git a/docs/guides/bun.mdx b/docs/guides/frameworks/bun.mdx similarity index 100% rename from docs/guides/bun.mdx rename to docs/guides/frameworks/bun.mdx diff --git a/docs/guides/frameworks/introduction.mdx b/docs/guides/frameworks/introduction.mdx new file mode 100644 index 000000000..eb74771e7 --- /dev/null +++ b/docs/guides/frameworks/introduction.mdx @@ -0,0 +1,20 @@ +--- +title: "Introduction" +sidebarTitle: "Introduction" +description: "Get started with Trigger.dev in your favorite framework." +icon: "grid-2" +--- + +import CardBun from "/snippets/card-bun.mdx"; +import CardNodejs from "/snippets/card-nodejs.mdx"; +import CardNextjs from "/snippets/card-nextjs.mdx"; +import CardRemix from "/snippets/card-remix.mdx"; +import CardSupabase from "/snippets/card-supabase.mdx"; + + + + + + + + diff --git a/docs/guides/frameworks/supabase-guides-overview.mdx b/docs/guides/frameworks/supabase-guides-overview.mdx new file mode 100644 index 000000000..74405a4f3 --- /dev/null +++ b/docs/guides/frameworks/supabase-guides-overview.mdx @@ -0,0 +1,22 @@ +--- +title: "Supabase guides" +sidebarTitle: "Overview" +description: "Guides for using Supabase with Trigger.dev." +--- + + + + Learn how to trigger a task from a Supabase edge function when a URL is visited. + + + Learn how to trigger a task from a Supabase edge function when an event occurs in your database. + + diff --git a/docs/mint.json b/docs/mint.json index 06ff7d733..2521f8ec9 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -245,15 +245,17 @@ { "group": "Frameworks", "pages": [ - "guides/frameworks/nodejs", - "guides/bun", + "guides/frameworks/introduction", + "guides/frameworks/bun", "guides/frameworks/nextjs", + "guides/frameworks/nodejs", "guides/frameworks/remix", { "group": "Supabase", "icon": "bolt", "iconType": "solid", "pages": [ + "guides/frameworks/supabase-guides-overview", "guides/frameworks/supabase-edge-functions-basic", "guides/frameworks/supabase-edge-functions-database-webhooks" ] @@ -271,6 +273,7 @@ { "group": "Examples", "pages": [ + "examples/intro", "examples/dall-e3-generate-image", "examples/ffmpeg-video-processing", "examples/open-ai-with-retrying", diff --git a/docs/snippets/card-bun.mdx b/docs/snippets/card-bun.mdx new file mode 100644 index 000000000..720dc0315 --- /dev/null +++ b/docs/snippets/card-bun.mdx @@ -0,0 +1,10 @@ + + + + +} +href="/guides/frameworks/bun" + +/> diff --git a/docs/snippets/card-nextjs.mdx b/docs/snippets/card-nextjs.mdx new file mode 100644 index 000000000..043fe53cd --- /dev/null +++ b/docs/snippets/card-nextjs.mdx @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + +} + href="/guides/frameworks/nextjs" + +/> diff --git a/docs/snippets/card-nodejs.mdx b/docs/snippets/card-nodejs.mdx new file mode 100644 index 000000000..f9d18a3d2 --- /dev/null +++ b/docs/snippets/card-nodejs.mdx @@ -0,0 +1,11 @@ + + + + + +} + href="/guides/frameworks/nodejs" + +/> diff --git a/docs/snippets/card-remix.mdx b/docs/snippets/card-remix.mdx new file mode 100644 index 000000000..c5d0c4398 --- /dev/null +++ b/docs/snippets/card-remix.mdx @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + href="/guides/frameworks/remix" +/> diff --git a/docs/snippets/card-supabase.mdx b/docs/snippets/card-supabase.mdx new file mode 100644 index 000000000..628ca74d4 --- /dev/null +++ b/docs/snippets/card-supabase.mdx @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +href="/guides/frameworks/supabase-guides-overview" +/> From 33c108b739f18a1f9a30920451b13c588d74422d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:22:16 +0100 Subject: [PATCH 21/55] chore: Update version for release (#1316) Co-authored-by: github-actions[bot] --- .changeset/clever-buses-watch.md | 6 ------ .changeset/soft-ladybugs-promise.md | 5 ----- .changeset/twelve-onions-decide.md | 5 ----- packages/build/CHANGELOG.md | 8 ++++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 11 +++++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 7 +++++++ packages/trigger-sdk/package.json | 4 ++-- 11 files changed, 40 insertions(+), 24 deletions(-) delete mode 100644 .changeset/clever-buses-watch.md delete mode 100644 .changeset/soft-ladybugs-promise.md delete mode 100644 .changeset/twelve-onions-decide.md diff --git a/.changeset/clever-buses-watch.md b/.changeset/clever-buses-watch.md deleted file mode 100644 index a2cc1065d..000000000 --- a/.changeset/clever-buses-watch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/core": patch ---- - -Fix an issue where a missing tsconfig.json file would throw an error on dev/deploy diff --git a/.changeset/soft-ladybugs-promise.md b/.changeset/soft-ladybugs-promise.md deleted file mode 100644 index 68eafd456..000000000 --- a/.changeset/soft-ladybugs-promise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Fixes for CLI update command, and make the hide the "whoami" command output when running in dev. diff --git a/.changeset/twelve-onions-decide.md b/.changeset/twelve-onions-decide.md deleted file mode 100644 index 8d33f8341..000000000 --- a/.changeset/twelve-onions-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Strip out TRIGGER\_ keys when using syncEnvVars, to prevent deploy errors diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 36006764f..45e921b06 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,13 @@ # @trigger.dev/build +## 3.0.3 + +### Patch Changes + +- 3d53d4c08: Strip out TRIGGER\_ keys when using syncEnvVars, to prevent deploy errors +- Updated dependencies [3d53d4c08] + - @trigger.dev/core@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index 712f5464d..763a92bef 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.2", + "version": "3.0.3", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.2", + "@trigger.dev/core": "workspace:3.0.3", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 30138417b..25f457d59 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,16 @@ # trigger.dev +## 3.0.3 + +### Patch Changes + +- 3d53d4c08: Fix an issue where a missing tsconfig.json file would throw an error on dev/deploy +- 3d53d4c08: Fixes for CLI update command, and make the hide the "whoami" command output when running in dev. +- Updated dependencies [3d53d4c08] +- Updated dependencies [3d53d4c08] + - @trigger.dev/core@3.0.3 + - @trigger.dev/build@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 69ec01df3..02cc10341 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.2", + "version": "3.0.3", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -87,8 +87,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.2", - "@trigger.dev/core": "workspace:3.0.2", + "@trigger.dev/build": "workspace:3.0.3", + "@trigger.dev/core": "workspace:3.0.3", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 3572aef48..f134b1595 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # internal-platform +## 3.0.3 + +### Patch Changes + +- 3d53d4c08: Fix an issue where a missing tsconfig.json file would throw an error on dev/deploy + ## 3.0.2 ## 3.0.1 diff --git a/packages/core/package.json b/packages/core/package.json index 585703310..2b4af307b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.2", + "version": "3.0.3", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 3c0cbc3ac..1e51e41e4 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/sdk +## 3.0.3 + +### Patch Changes + +- Updated dependencies [3d53d4c08] + - @trigger.dev/core@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index d69046338..629209c64 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.2", + "version": "3.0.3", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.2", + "@trigger.dev/core": "workspace:3.0.3", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From ce89925176c1a1e6414ada1e16c8ad4b3276d235 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Wed, 18 Sep 2024 11:26:33 +0100 Subject: [PATCH 22/55] RESUME_AFTER_DEPENDENCY_WITH_ACK: any successful responses = success Also added a backoff if the catch is hit, and log the error out --- .../app/v3/marqs/sharedQueueConsumer.server.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts index 61a05b6ee..6f2eca0b5 100644 --- a/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts +++ b/apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts @@ -756,11 +756,11 @@ export class SharedQueueConsumer { return; } - const failed = responses.filter((response) => !response.success); - if (failed.length > 0) { - logger.error("RESUME_AFTER_DEPENDENCY_WITH_ACK failed", { + const hasSuccess = responses.some((response) => response.success); + if (!hasSuccess) { + logger.warn("RESUME_AFTER_DEPENDENCY_WITH_ACK failed", { resumeMessage, - failed, + responses, message, }); await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval, 5_000); @@ -775,7 +775,12 @@ export class SharedQueueConsumer { this._endSpanInNextIteration = true; - await this.#nackAndDoMoreWork(message.messageId); + logger.error("RESUME_AFTER_DEPENDENCY_WITH_ACK threw, nacking with delay", { + message, + error: e, + }); + + await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval, 5_000); return; } From 7652d8e1316aee7f7974f4099dcd823a94f75d8a Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 11:27:16 +0100 Subject: [PATCH 23/55] Release 3.0.3 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 992006fd2..a6b9afd3a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.2 + specifier: workspace:3.0.3 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.2 + specifier: workspace:3.0.3 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.2 + specifier: workspace:3.0.3 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.2 + specifier: workspace:3.0.3 version: link:../core chalk: specifier: ^5.2.0 From b5cdb0c855959fa2bc245074027cc6f67ff66f62 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Wed, 18 Sep 2024 13:55:59 +0100 Subject: [PATCH 24/55] Better logging when resuming with pause and no checkpoint --- apps/webapp/app/v3/services/resumeBatchRun.server.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/webapp/app/v3/services/resumeBatchRun.server.ts b/apps/webapp/app/v3/services/resumeBatchRun.server.ts index b7e6d0ca6..4be9cbc37 100644 --- a/apps/webapp/app/v3/services/resumeBatchRun.server.ts +++ b/apps/webapp/app/v3/services/resumeBatchRun.server.ts @@ -122,7 +122,9 @@ export class ResumeBatchRunService extends BaseService { // When the checkpoint is created, it will continue the run logger.error("ResumeBatchRunService: attempt is paused but there's no checkpoint event", { batchRunId: batchRun.id, - dependentTaskAttemptId: batchRun.dependentTaskAttempt.id, + dependentTaskAttempt: batchRun.dependentTaskAttempt, + checkpointEventId: batchRun.checkpointEventId, + hasCheckpointEvent: !!batchRun.checkpointEventId, }); return; } From 4adc773c773e73dc58f7e0a100f6ca64f5eac518 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 15:20:02 +0100 Subject: [PATCH 25/55] Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve (#1317) --- .changeset/polite-tables-exercise.md | 6 +++ packages/core/src/v3/utils/ioSerialization.ts | 25 +++++++++++ packages/trigger-sdk/src/v3/runs.ts | 32 +++++++++++--- references/v3-catalog/src/trigger/sdkUsage.ts | 43 ++++++++++++++++++- 4 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 .changeset/polite-tables-exercise.md diff --git a/.changeset/polite-tables-exercise.md b/.changeset/polite-tables-exercise.md new file mode 100644 index 000000000..895f61d9b --- /dev/null +++ b/.changeset/polite-tables-exercise.md @@ -0,0 +1,6 @@ +--- +"@trigger.dev/sdk": patch +"@trigger.dev/core": patch +--- + +Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve diff --git a/packages/core/src/v3/utils/ioSerialization.ts b/packages/core/src/v3/utils/ioSerialization.ts index c2fddb5d2..32d47d237 100644 --- a/packages/core/src/v3/utils/ioSerialization.ts +++ b/packages/core/src/v3/utils/ioSerialization.ts @@ -160,6 +160,31 @@ export async function conditionallyImportPacket( } } +export async function resolvePresignedPacketUrl( + url: string, + tracer?: TriggerTracer +): Promise { + try { + const response = await fetch(url); + + if (!response.ok) { + return; + } + + const data = await response.text(); + const dataType = response.headers.get("content-type") ?? "application/json"; + + const packet = { + data, + dataType, + }; + + return await parsePacket(packet); + } catch (error) { + return; + } +} + async function importPacket(packet: IOPacket, span?: Span): Promise { if (!packet.data) { return packet; diff --git a/packages/trigger-sdk/src/v3/runs.ts b/packages/trigger-sdk/src/v3/runs.ts index 571d4e432..50cd77e03 100644 --- a/packages/trigger-sdk/src/v3/runs.ts +++ b/packages/trigger-sdk/src/v3/runs.ts @@ -3,6 +3,7 @@ import type { ListProjectRunsQueryParams, ListRunsQueryParams, RescheduleRunRequestBody, + TriggerTracer, } from "@trigger.dev/core/v3"; import { ApiPromise, @@ -19,6 +20,7 @@ import { } from "@trigger.dev/core/v3"; import { AnyTask, Prettify, RunHandle, Task, apiClientMissingError } from "./shared.js"; import { tracer } from "./tracer.js"; +import { resolvePresignedPacketUrl } from "@trigger.dev/core/v3/utils/ioSerialization"; export type RetrieveRunResult = Prettify< TRunId extends RunHandle @@ -183,13 +185,31 @@ function retrieveRun | AnyTask | string>( requestOptions ); - if (typeof runId === "string") { - return apiClient.retrieveRun(runId, $requestOptions) as ApiPromise>; - } else { - return apiClient.retrieveRun(runId.id, $requestOptions) as ApiPromise< - RetrieveRunResult - >; + const $runId = typeof runId === "string" ? runId : runId.id; + + return apiClient.retrieveRun($runId, $requestOptions).then((retrievedRun) => { + return resolvePayloadAndOutputUrls(retrievedRun); + }) as ApiPromise>; +} + +async function resolvePayloadAndOutputUrls(run: RetrieveRunResult) { + const resolvedRun = { ...run }; + + if (run.payloadPresignedUrl && run.outputPresignedUrl) { + const [payload, output] = await Promise.all([ + resolvePresignedPacketUrl(run.payloadPresignedUrl, tracer), + resolvePresignedPacketUrl(run.outputPresignedUrl, tracer), + ]); + + resolvedRun.payload = payload; + resolvedRun.output = output; + } else if (run.payloadPresignedUrl) { + resolvedRun.payload = await resolvePresignedPacketUrl(run.payloadPresignedUrl, tracer); + } else if (run.outputPresignedUrl) { + resolvedRun.output = await resolvePresignedPacketUrl(run.outputPresignedUrl, tracer); } + + return resolvedRun; } function replayRun( diff --git a/references/v3-catalog/src/trigger/sdkUsage.ts b/references/v3-catalog/src/trigger/sdkUsage.ts index 0597b1f30..0bca9231e 100644 --- a/references/v3-catalog/src/trigger/sdkUsage.ts +++ b/references/v3-catalog/src/trigger/sdkUsage.ts @@ -119,10 +119,51 @@ export const sdkUsage = task({ export const sdkChild = task({ id: "sdk-child", - run: async (payload: any) => {}, + run: async (payload: any) => { + return payload; + }, }); export const sdkSchedule = schedules.task({ id: "sdk-schedule", run: async (payload: any) => {}, }); + +export const autoResolvePayloadAndOutput = task({ + id: "auto-resolve-payload-and-output", + run: async (payload: any, { ctx }) => { + // Generate a large JSON payload (bigger than 128KB) + const childPayload = Array.from({ length: 10000 }, () => ({ + key: "value", + date: new Date(), + })); + + const handle = await tasks.trigger("sdk-child", childPayload); + + const childRun = await runs.retrieve(handle.id); + + if (childRun.payload) { + console.log("Child run payload exists", { + payloadPresignedUrl: childRun.payloadPresignedUrl, + }); + } else { + console.log("Child run payload does not exist", { + payloadPresignedUrl: childRun.payloadPresignedUrl, + }); + } + + await runs.poll(handle.id); + + const finishedRun = await runs.retrieve(handle.id); + + if (finishedRun.output) { + console.log("Finished run output exists", { + outputPresignedUrl: finishedRun.outputPresignedUrl, + }); + } else { + console.log("Finished run payload does not exist", { + outputPresignedUrl: finishedRun.outputPresignedUrl, + }); + } + }, +}); From 8d1e41693a326641210f5268507d9e29dc3ffc32 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:07:47 +0100 Subject: [PATCH 26/55] v3: self-hosting support for latest packages (#1319) * display --profile flag after init if used * add containerfile debug logs * log all indexing errors in case of connection issues * specify dockerfile syntax version * add network flag for self-hosting * move all self-hosting tags to latest * add self-hosting update section * manual setup subsection * registry flag implies push * add changeset --- .changeset/metal-geckos-pretend.md | 8 +++ docs/github-actions.mdx | 2 +- docs/open-source-self-hosting.mdx | 67 +++++++++++++++---- docs/snippets/cli-commands-deploy.mdx | 17 +++-- docs/upgrading-beta.mdx | 1 - packages/cli-v3/src/build/buildWorker.ts | 7 +- packages/cli-v3/src/commands/deploy.ts | 3 + packages/cli-v3/src/commands/init.ts | 4 +- packages/cli-v3/src/deploy/buildImage.ts | 8 ++- .../entryPoints/deploy-index-controller.ts | 2 + 10 files changed, 90 insertions(+), 29 deletions(-) create mode 100644 .changeset/metal-geckos-pretend.md diff --git a/.changeset/metal-geckos-pretend.md b/.changeset/metal-geckos-pretend.md new file mode 100644 index 000000000..c8c975d4a --- /dev/null +++ b/.changeset/metal-geckos-pretend.md @@ -0,0 +1,8 @@ +--- +"trigger.dev": patch +--- + +- Improve index error logging +- Add network flag for self-hosted deploys +- Fix checksum flag on some docker versions +- Add Containerfile debug logs diff --git a/docs/github-actions.mdx b/docs/github-actions.mdx index 3951ec0bc..cb163aebf 100644 --- a/docs/github-actions.mdx +++ b/docs/github-actions.mdx @@ -181,7 +181,7 @@ jobs: TRIGGER_API_URL: ${{ secrets.TRIGGER_API_URL }} # deploy with additional flags run: | - npx trigger.dev@beta deploy --self-hosted --push + npx trigger.dev@latest deploy --self-hosted --push ``` \ No newline at end of file diff --git a/docs/open-source-self-hosting.mdx b/docs/open-source-self-hosting.mdx index c00bad1cf..3caf78696 100644 --- a/docs/open-source-self-hosting.mdx +++ b/docs/open-source-self-hosting.mdx @@ -3,8 +3,6 @@ title: "Self-hosting" description: "You can self-host Trigger.dev on your own infrastructure." --- -Self-hosting does not support the latest CLI yet, you will have to continue using the `beta` tag for now. - ## Overview @@ -94,7 +92,7 @@ git checkout v3 ./start.sh # hint: you can append -d to run in detached mode ``` -### Manual setup +#### Manual Alternatively, you can follow these manual steps after cloning the docker repo: @@ -176,7 +174,7 @@ docker login -u 5. You can now deploy v3 projects using the CLI with these flags: ``` -npx trigger.dev@beta deploy --self-hosted --push +npx trigger.dev@latest deploy --self-hosted --push ``` ## Part 2: Split services @@ -286,12 +284,44 @@ echo "FORCE_CHECKPOINT_SIMULATION=0" >> .env ./stop.sh worker && ./start.sh worker ``` -## Telemetry +## Updating -By default, the Trigger.dev webapp sends telemetry data to our servers. This data is used to improve the product and is not shared with third parties. If you would like to opt-out of this, you can set the `TRIGGER_TELEMETRY_DISABLED` environment variable in your `.env` file. The value doesn't matter, it just can't be empty. For example: +Once you have everything set up, you will periodically want to update your Docker images. You can easily do this by running the update script and restarting your services: ```bash -TRIGGER_TELEMETRY_DISABLED=1 +./update.sh +./stop.sh && ./start.sh +``` + +Sometimes, we will make more extensive changes that require pulling updated compose files, scripts, etc from our docker repo: + +```bash +git pull +./stop.sh && ./start.sh +``` + +Occasionally, you may also have to update your `.env` file, but we will try to keep these changes to a minimum. Check the `.env.example` file for new variables. + +### From beta + +If you're coming from the beta CLI package images, you will need to: +- **Pull changes from our docker repo.** We've added a new container for [Electric](https://github.com/electric-sql/electric) and made some other improvements. + +```bash +# wherever you cloned the docker repo +git pull && ./stop.sh && ./start.sh +``` + +## Version locking + +There are several reasons to lock the version of your Docker images: +- **Backwards compatibility.** We try our best to maintain compatibility with older CLI versions, but it's not always possible. If you don't want to update your CLI, you can lock your Docker images to that specific version. +- **Ensuring full feature support.** Sometimes, new CLI releases will also require new or updated platform features. Running unlocked images can make any issues difficult to debug. Using a specific tag can help here as well. + +By default, the images will point at the latest versioned release via the `v3` tag. You can override this by specifying a different tag in your `.env` file. For example: + +```bash +TRIGGER_IMAGE_TAG=v3.0.5 ``` ## CLI usage @@ -303,7 +333,7 @@ This section highlights some of the CLI commands and options that are useful whe To avoid being redirected to the [Trigger.dev Cloud](https://cloud.trigger.dev) login page when using the CLI, you can specify the URL of your self-hosted instance with the `--api-url` or `-a` flag. For example: ```bash -npx trigger.dev@beta login -a http://trigger.example.com +npx trigger.dev@latest login -a http://trigger.example.com ``` Once you've logged in, the CLI will remember your login details and you won't need to specify the URL again with other commands. @@ -313,19 +343,19 @@ Once you've logged in, the CLI will remember your login details and you won't ne You can specify a custom profile when logging in. This allows you to easily use the CLI with our cloud product and your self-hosted instance at the same time. For example: ``` -npx trigger.dev@beta login -a http://trigger.example.com --profile my-profile +npx trigger.dev@latest login -a http://trigger.example.com --profile my-profile ``` You can then use this profile with other commands: ``` -npx trigger.dev@beta dev --profile my-profile +npx trigger.dev@latest dev --profile my-profile ``` To list all your profiles, use the `list-profiles` command: ``` -npx trigger.dev@beta list-profiles +npx trigger.dev@latest list-profiles ``` #### Verify login @@ -333,10 +363,10 @@ npx trigger.dev@beta list-profiles It can be useful to check you have successfully logged in to the correct instance. You can do this with the `whoami` command, which will also show the API URL: ```bash -npx trigger.dev@beta whoami +npx trigger.dev@latest whoami # with a custom profile -npx trigger.dev@beta whoami --profile my-profile +npx trigger.dev@latest whoami --profile my-profile ``` ### Deploy @@ -344,7 +374,7 @@ npx trigger.dev@beta whoami --profile my-profile On [Trigger.dev Cloud](https://cloud.trigger.dev), we build deployments remotely and push those images for you. When self-hosting you will have to do that locally yourself. This can be done with the `--self-hosted` and `--push` flags. For example: ``` -npx trigger.dev@beta deploy --self-hosted --push +npx trigger.dev@latest deploy --self-hosted --push ``` ### CI / GitHub Actions @@ -353,3 +383,12 @@ When running the CLI in a CI environment, your login profiles won't be available variables to point at your self-hosted instance and authenticate. For more detailed instructions, see the [GitHub Actions guide](/github-actions). + + +## Telemetry + +By default, the Trigger.dev webapp sends telemetry data to our servers. This data is used to improve the product and is not shared with third parties. If you would like to opt-out of this, you can set the `TRIGGER_TELEMETRY_DISABLED` environment variable in your `.env` file. The value doesn't matter, it just can't be empty. For example: + +```bash +TRIGGER_TELEMETRY_DISABLED=1 +``` diff --git a/docs/snippets/cli-commands-deploy.mdx b/docs/snippets/cli-commands-deploy.mdx index 427b7734b..441622a54 100644 --- a/docs/snippets/cli-commands-deploy.mdx +++ b/docs/snippets/cli-commands-deploy.mdx @@ -81,26 +81,26 @@ These options are available on most commands. These options are typically used when [self-hosting](/open-source-self-hosting) or for local development. - - Load the built image into your local docker. - - Builds and loads the image using your local docker. Use the `--registry` option to specify the registry to push the image to when using `--self-hosted`, or just use `--push` to push to the default registry. + + Load the built image into your local docker. + + Loads the image into your local docker after building it. - Specify the registry to push the image to when using `--self-hosted`. + Specify the registry to push the image to when using `--self-hosted`. Will automatically enable `--push`. - When using the --self-hosted flag, push the image to the registry. + When using the `--self-hosted` flag, push the image to the registry. @@ -108,6 +108,10 @@ These options are typically used when [self-hosting](/open-source-self-hosting) Hub, the namespace is your Docker Hub username. + + The networking mode for RUN instructions when using `--self-hosted`. + + ## Examples ### Push to Docker Hub (self-hosted) @@ -118,7 +122,6 @@ An example of deploying to Docker Hub when using a self-hosted setup: npx trigger.dev@latest deploy \ --self-hosted \ --load-image \ - --push \ --registry docker.io \ --namespace mydockerhubusername ``` diff --git a/docs/upgrading-beta.mdx b/docs/upgrading-beta.mdx index 65af28bd0..6439190ef 100644 --- a/docs/upgrading-beta.mdx +++ b/docs/upgrading-beta.mdx @@ -412,7 +412,6 @@ You can now specify a custom registry and namespace when deploying via a self-ho npx trigger.dev@latest deploy \ --self-hosted \ --load-image \ - --push \ --registry docker.io \ --namespace mydockerhubusername ``` diff --git a/packages/cli-v3/src/build/buildWorker.ts b/packages/cli-v3/src/build/buildWorker.ts index 4b15bcb92..0ab03f1e6 100644 --- a/packages/cli-v3/src/build/buildWorker.ts +++ b/packages/cli-v3/src/build/buildWorker.ts @@ -223,5 +223,10 @@ async function writeContainerfile(outputPath: string, buildManifest: BuildManife indexScript: buildManifest.indexControllerEntryPoint, }); - await writeFile(join(outputPath, "Containerfile"), containerfile); + const containerfilePath = join(outputPath, "Containerfile"); + + logger.debug("Writing Containerfile", { containerfilePath }); + logger.debug(containerfile); + + await writeFile(containerfilePath, containerfile); } diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 76b78ae7c..7552b52e3 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -55,6 +55,7 @@ const DeployCommandOptions = CommonCommandOptions.extend({ skipUpdateCheck: z.boolean().default(false), noCache: z.boolean().default(false), envFile: z.string().optional(), + network: z.enum(["default", "none", "host"]).optional(), }); type DeployCommandOptions = z.infer; @@ -144,6 +145,7 @@ export function configureDeployCommand(program: Command) { "If provided, will save logs even for successful builds" ).hideHelp() ) + .option("--network ", "The networking mode for RUN instructions when using --self-hosted") .action(async (path, options) => { await handleTelemetry(async () => { await printStandloneInitialBanner(true); @@ -349,6 +351,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { authAccessToken: authorization.auth.accessToken, compilationPath: destination.path, buildEnvVars: buildManifest.build.env, + network: options.network, }); logger.debug("Build result", buildResult); diff --git a/packages/cli-v3/src/commands/init.ts b/packages/cli-v3/src/commands/init.ts index df60445cf..90a99ffce 100644 --- a/packages/cli-v3/src/commands/init.ts +++ b/packages/cli-v3/src/commands/init.ts @@ -194,9 +194,7 @@ async function _initCommand(dir: string, options: InitCommandOptions) { log.info("Next steps:"); log.info( ` 1. To start developing, run ${chalk.green( - `npx trigger.dev@${options.tag} dev${ - options.apiUrl === CLOUD_API_URL ? "" : ` -a ${options.apiUrl}` - }` + `npx trigger.dev@${options.tag} dev${options.profile ? "" : ` --profile ${options.profile}`}` )} in your project directory` ); log.info(` 2. Visit your ${projectDashboard} to view your newly created tasks.`); diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index 508750ca9..a5fed62b6 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -14,6 +14,7 @@ export interface BuildImageOptions { // Self-hosted specific options push: boolean; registry?: string; + network?: string; // Non-self-hosted specific options loadImage?: boolean; @@ -84,6 +85,7 @@ export async function buildImage(options: BuildImageOptions) { apiUrl, apiKey, buildEnvVars, + network: options.network, }); } @@ -277,6 +279,7 @@ interface SelfHostedBuildImageOptions { noCache?: boolean; extraCACerts?: string; buildEnvVars?: Record; + network?: string; } async function selfHostedBuildImage( @@ -295,6 +298,7 @@ async function selfHostedBuildImage( options.noCache ? "--no-cache" : undefined, "--platform", options.buildPlatform, + ...(options.network ? ["--network", options.network] : []), "--build-arg", `TRIGGER_PROJECT_ID=${options.projectId}`, "--build-arg", @@ -458,7 +462,7 @@ async function generateBunContainerfile(options: GenerateContainerfileOptions) { " " ); - return ` + return `# syntax=docker/dockerfile:1 FROM imbios/bun-node:22-debian AS base ${baseInstructions} @@ -563,7 +567,7 @@ async function generateNodeContainerfile(options: GenerateContainerfileOptions) " " ); - return ` + return `# syntax=docker/dockerfile:1 FROM node:21-bookworm-slim@sha256:99afef5df7400a8d118e0504576d32ca700de5034c4f9271d2ff7c91cc12d170 AS base ${baseInstructions} diff --git a/packages/cli-v3/src/entryPoints/deploy-index-controller.ts b/packages/cli-v3/src/entryPoints/deploy-index-controller.ts index 89b9d18a8..9232c9acf 100644 --- a/packages/cli-v3/src/entryPoints/deploy-index-controller.ts +++ b/packages/cli-v3/src/entryPoints/deploy-index-controller.ts @@ -104,6 +104,8 @@ async function indexDeployment({ } catch (error) { const serialiedIndexError = serializeIndexingError(error, stderr.join("\n")); + console.error("Failed to index deployment", serialiedIndexError); + await cliApiClient.failDeployment(deploymentId, { error: serialiedIndexError }); process.exit(1); From 0ac7f4b24b3b03a54876a13f964aa3f14cc2cec5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:28:59 +0100 Subject: [PATCH 27/55] chore: Update version for release (#1318) Co-authored-by: github-actions[bot] --- .changeset/metal-geckos-pretend.md | 8 -------- .changeset/polite-tables-exercise.md | 6 ------ packages/build/CHANGELOG.md | 7 +++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 12 ++++++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 8 ++++++++ packages/trigger-sdk/package.json | 4 ++-- 10 files changed, 41 insertions(+), 22 deletions(-) delete mode 100644 .changeset/metal-geckos-pretend.md delete mode 100644 .changeset/polite-tables-exercise.md diff --git a/.changeset/metal-geckos-pretend.md b/.changeset/metal-geckos-pretend.md deleted file mode 100644 index c8c975d4a..000000000 --- a/.changeset/metal-geckos-pretend.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"trigger.dev": patch ---- - -- Improve index error logging -- Add network flag for self-hosted deploys -- Fix checksum flag on some docker versions -- Add Containerfile debug logs diff --git a/.changeset/polite-tables-exercise.md b/.changeset/polite-tables-exercise.md deleted file mode 100644 index 895f61d9b..000000000 --- a/.changeset/polite-tables-exercise.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/sdk": patch -"@trigger.dev/core": patch ---- - -Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 45e921b06..79a4e492f 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/build +## 3.0.4 + +### Patch Changes + +- Updated dependencies [4adc773c7] + - @trigger.dev/core@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index 763a92bef..6d446d86c 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.3", + "version": "3.0.4", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.3", + "@trigger.dev/core": "workspace:3.0.4", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 25f457d59..e1cfb80d0 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,17 @@ # trigger.dev +## 3.0.4 + +### Patch Changes + +- 8d1e41693: - Improve index error logging + - Add network flag for self-hosted deploys + - Fix checksum flag on some docker versions + - Add Containerfile debug logs +- Updated dependencies [4adc773c7] + - @trigger.dev/core@3.0.4 + - @trigger.dev/build@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 02cc10341..caff25437 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.3", + "version": "3.0.4", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -87,8 +87,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.3", - "@trigger.dev/core": "workspace:3.0.3", + "@trigger.dev/build": "workspace:3.0.4", + "@trigger.dev/core": "workspace:3.0.4", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f134b1595..ac4382505 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # internal-platform +## 3.0.4 + +### Patch Changes + +- 4adc773c7: Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve + ## 3.0.3 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index 2b4af307b..be326ef83 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.3", + "version": "3.0.4", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 1e51e41e4..80620343f 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,13 @@ # @trigger.dev/sdk +## 3.0.4 + +### Patch Changes + +- 4adc773c7: Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve +- Updated dependencies [4adc773c7] + - @trigger.dev/core@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 629209c64..a2f75fe0b 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.3", + "version": "3.0.4", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.3", + "@trigger.dev/core": "workspace:3.0.4", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From 2dbf550a708a39c424a5b680fd8f8ed720dcf3eb Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 17:31:03 +0100 Subject: [PATCH 28/55] Release 3.0.4 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6b9afd3a..03057eed2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.3 + specifier: workspace:3.0.4 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.3 + specifier: workspace:3.0.4 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.3 + specifier: workspace:3.0.4 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.3 + specifier: workspace:3.0.4 version: link:../core chalk: specifier: ^5.2.0 From f89d93b905f686c011157b6c1a4fd33219fbc800 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:33:26 +0100 Subject: [PATCH 29/55] Update self-hosting docs for switch to latest --- docs/open-source-self-hosting.mdx | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/docs/open-source-self-hosting.mdx b/docs/open-source-self-hosting.mdx index 3caf78696..e378d1688 100644 --- a/docs/open-source-self-hosting.mdx +++ b/docs/open-source-self-hosting.mdx @@ -83,7 +83,6 @@ sudo apt-get install -y \ ```bash git clone https://github.com/triggerdotdev/docker cd docker -git checkout v3 ``` 2. Run the start script and follow the prompts @@ -305,11 +304,27 @@ Occasionally, you may also have to update your `.env` file, but we will try to k ### From beta If you're coming from the beta CLI package images, you will need to: -- **Pull changes from our docker repo.** We've added a new container for [Electric](https://github.com/electric-sql/electric) and made some other improvements. +- **Stash you changes.** If you made any changes, stash them with `git stash`. +- **Switch branches.** We moved back to main. Run `git checkout main` in your docker repo. +- **Pull in updates.** We've added a new container for [Electric](https://github.com/electric-sql/electric) and made some other improvements. Run `git pull` to get the latest updates. +- **Apply your changes.** If you stashed your changes, apply them with `git stash pop`. +- **Restart all services.** Run `./stop.sh && ./start.sh` and you're good to go. + +In summary, run this wherever you cloned the docker repo: ```bash -# wherever you cloned the docker repo -git pull && ./stop.sh && ./start.sh +# if you made changes +git stash + +# switch to the main branch and pull the latest changes +git checkout main +git pull + +# if you stashed your changes +git stash pop + +# restart your services +./stop.sh && ./start.sh ``` ## Version locking @@ -321,7 +336,7 @@ There are several reasons to lock the version of your Docker images: By default, the images will point at the latest versioned release via the `v3` tag. You can override this by specifying a different tag in your `.env` file. For example: ```bash -TRIGGER_IMAGE_TAG=v3.0.5 +TRIGGER_IMAGE_TAG=v3.0.4 ``` ## CLI usage From d8006e15acea25c4c30bdbf26ad0a0975d054f98 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:18:00 +0100 Subject: [PATCH 30/55] Prevent abort signals from causing uncaught exceptions (#1320) * never abort the same controller twice * prevent uncaught exception when aborting pipe * abort signal assertions and more logging * never abort running pipe --- apps/coordinator/src/checkpointer.ts | 40 ++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/apps/coordinator/src/checkpointer.ts b/apps/coordinator/src/checkpointer.ts index d191f488f..ad14d8145 100644 --- a/apps/coordinator/src/checkpointer.ts +++ b/apps/coordinator/src/checkpointer.ts @@ -48,6 +48,8 @@ type CheckpointerOptions = { chaosMonkey?: ChaosMonkey; }; +class CheckpointAbortError extends Error {} + async function getFileSize(filePath: string): Promise { try { const stats = await fs.stat(filePath); @@ -248,7 +250,12 @@ export class Checkpointer { return false; } - controller.abort("cancelCheckpointing()"); + if (controller.signal.aborted) { + this.#logger.debug("Controller already aborted", { runId }); + return false; + } + + controller.abort("cancelCheckpoint()"); this.#abortControllers.delete(runId); return true; @@ -395,6 +402,14 @@ export class Checkpointer { const controller = new AbortController(); this.#abortControllers.set(runId, controller); + const assertNotAborted = (abortMessage?: string) => { + if (controller.signal.aborted) { + throw new CheckpointAbortError(abortMessage); + } + + this.#logger.debug("Not aborted", { abortMessage }); + }; + const $$ = $({ signal: controller.signal }); const shortCode = nanoid(8); @@ -418,6 +433,7 @@ export class Checkpointer { }; try { + assertNotAborted("chaosMonkey.call"); await this.chaosMonkey.call({ $: $$ }); this.#logger.log("Checkpointing:", { options }); @@ -474,11 +490,12 @@ export class Checkpointer { return { success: false, reason: "SKIP_RETRYING" }; } + assertNotAborted("cmd: crictl ps"); const containerId = this.#logger.debug( // @ts-expect-error - await $$`crictl ps` - .pipeStdout($$({ stdin: "pipe" })`grep ${containterName}`) - .pipeStdout($$({ stdin: "pipe" })`cut -f1 ${"-d "}`) + await $`crictl ps` + .pipeStdout($({ stdin: "pipe" })`grep ${containterName}`) + .pipeStdout($({ stdin: "pipe" })`cut -f1 ${"-d "}`) ); if (!containerId.stdout) { @@ -496,6 +513,7 @@ export class Checkpointer { } // Create checkpoint + assertNotAborted("cmd: crictl checkpoint"); this.#logger.debug(await $$`crictl checkpoint --export=${exportLocation} ${containerId}`); const postCheckpoint = performance.now(); @@ -504,20 +522,25 @@ export class Checkpointer { this.#logger.log("checkpoint archive created", { size, options }); // Create image from checkpoint + assertNotAborted("cmd: buildah from scratch"); const container = this.#logger.debug(await $$`buildah from scratch`); const postFrom = performance.now(); + assertNotAborted("cmd: buildah add"); this.#logger.debug(await $$`buildah add ${container} ${exportLocation} /`); const postAdd = performance.now(); + assertNotAborted("cmd: buildah config"); this.#logger.debug( await $$`buildah config --annotation=io.kubernetes.cri-o.annotations.checkpoint.name=counter ${container}` ); const postConfig = performance.now(); + assertNotAborted("cmd: buildah commit"); this.#logger.debug(await $$`buildah commit ${container} ${imageRef}`); const postCommit = performance.now(); + assertNotAborted("cmd: buildah rm"); this.#logger.debug(await $$`buildah rm ${container}`); const postRm = performance.now(); @@ -529,6 +552,7 @@ export class Checkpointer { } // Push checkpoint image + assertNotAborted("cmd: buildah push"); this.#logger.debug( await $$`buildah push --tls-verify=${String(this.registryTlsVerify)} ${imageRef}` ); @@ -554,9 +578,15 @@ export class Checkpointer { }, }; } catch (error) { + if (error instanceof CheckpointAbortError) { + this.#logger.error("Checkpoint canceled: CheckpointAbortError", { options, error }); + + return { success: false, reason: "CANCELED" }; + } + if (isExecaChildProcess(error)) { if (error.isCanceled) { - this.#logger.error("Checkpoint canceled", { options, error }); + this.#logger.error("Checkpoint canceled: ExecaChildProcess", { options, error }); return { success: false, reason: "CANCELED" }; } From 3b15224453d226c22fa5f696cc6123c4a8a028c7 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 22:00:59 +0100 Subject: [PATCH 31/55] Fix default machine preset in config not being used (#1321) * Add additional error message and stack trace when a task file cannot be imported for run * Apply default machine preset in config --- .changeset/new-yaks-fail.md | 5 +++++ .changeset/quick-bulldogs-float.md | 5 +++++ .../src/entryPoints/deploy-index-worker.ts | 20 +++++++++++++++++-- .../src/entryPoints/deploy-run-worker.ts | 3 +++ .../cli-v3/src/entryPoints/dev-run-worker.ts | 2 ++ .../src/indexing/indexWorkerManifest.ts | 1 + references/v3-catalog/src/trigger/simple.ts | 1 + references/v3-catalog/trigger.config.ts | 2 +- 8 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 .changeset/new-yaks-fail.md create mode 100644 .changeset/quick-bulldogs-float.md diff --git a/.changeset/new-yaks-fail.md b/.changeset/new-yaks-fail.md new file mode 100644 index 000000000..f13b00417 --- /dev/null +++ b/.changeset/new-yaks-fail.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Apply default machine preset in config diff --git a/.changeset/quick-bulldogs-float.md b/.changeset/quick-bulldogs-float.md new file mode 100644 index 000000000..da07c0dec --- /dev/null +++ b/.changeset/quick-bulldogs-float.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Add additional error message and stack trace when a task file cannot be imported for run diff --git a/packages/cli-v3/src/entryPoints/deploy-index-worker.ts b/packages/cli-v3/src/entryPoints/deploy-index-worker.ts index 0a7b369cf..5bc2dadeb 100644 --- a/packages/cli-v3/src/entryPoints/deploy-index-worker.ts +++ b/packages/cli-v3/src/entryPoints/deploy-index-worker.ts @@ -95,9 +95,25 @@ async function bootstrap() { }; } -const { buildManifest, importErrors } = await bootstrap(); +const { buildManifest, importErrors, config } = await bootstrap(); -const tasks = taskCatalog.listTaskManifests(); +let tasks = taskCatalog.listTaskManifests(); + +// If the config has a machine preset, we need to apply it to all tasks that don't have a machine preset +if (typeof config.machine === "string") { + tasks = tasks.map((task) => { + if (typeof task.machine?.preset !== "string") { + return { + ...task, + machine: { + preset: config.machine, + }, + }; + } + + return task; + }); +} await sendMessageInCatalog( indexerToWorkerMessages, diff --git a/packages/cli-v3/src/entryPoints/deploy-run-worker.ts b/packages/cli-v3/src/entryPoints/deploy-run-worker.ts index e29a3d321..9a03922ee 100644 --- a/packages/cli-v3/src/entryPoints/deploy-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/deploy-run-worker.ts @@ -219,6 +219,7 @@ const zodIpc = new ZodIpcConnection({ error: { type: "INTERNAL_ERROR", code: TaskRunErrorCodes.COULD_NOT_FIND_TASK, + message: `Could not find task ${execution.task.id}. Make sure the task is exported and the ID is correct.`, }, usage: { durationMs: 0, @@ -248,6 +249,8 @@ const zodIpc = new ZodIpcConnection({ error: { type: "INTERNAL_ERROR", code: TaskRunErrorCodes.COULD_NOT_IMPORT_TASK, + message: err instanceof Error ? err.message : String(err), + stackTrace: err instanceof Error ? err.stack : undefined, }, usage: { durationMs: 0, diff --git a/packages/cli-v3/src/entryPoints/dev-run-worker.ts b/packages/cli-v3/src/entryPoints/dev-run-worker.ts index e9ef71db3..49123aab1 100644 --- a/packages/cli-v3/src/entryPoints/dev-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/dev-run-worker.ts @@ -219,6 +219,8 @@ const zodIpc = new ZodIpcConnection({ error: { type: "INTERNAL_ERROR", code: TaskRunErrorCodes.COULD_NOT_IMPORT_TASK, + message: err instanceof Error ? err.message : String(err), + stackTrace: err instanceof Error ? err.stack : undefined, }, usage: { durationMs: 0, diff --git a/packages/cli-v3/src/indexing/indexWorkerManifest.ts b/packages/cli-v3/src/indexing/indexWorkerManifest.ts index 15ef5ed59..ff8de685c 100644 --- a/packages/cli-v3/src/indexing/indexWorkerManifest.ts +++ b/packages/cli-v3/src/indexing/indexWorkerManifest.ts @@ -49,6 +49,7 @@ export async function indexWorkerManifest({ OTEL_IMPORT_HOOK_EXCLUDES: otelHookExclude?.join(","), TRIGGER_BUILD_MANIFEST_PATH: buildManifestPath, NODE_OPTIONS: nodeOptions, + TRIGGER_INDEXING: "1", }, execPath: execPathForRuntime(runtime), }); diff --git a/references/v3-catalog/src/trigger/simple.ts b/references/v3-catalog/src/trigger/simple.ts index 4db91ac0f..d6d46092e 100644 --- a/references/v3-catalog/src/trigger/simple.ts +++ b/references/v3-catalog/src/trigger/simple.ts @@ -11,6 +11,7 @@ let headerGenerator = new HeaderGenerator({ export const fetchPostTask = task({ id: "fetch-post-task", + machine: { preset: "small-1x" }, run: async (payload: { url: string }) => { const headers = headerGenerator.getHeaders({ operatingSystems: ["linux"], diff --git a/references/v3-catalog/trigger.config.ts b/references/v3-catalog/trigger.config.ts index 356060918..9f9b3554c 100644 --- a/references/v3-catalog/trigger.config.ts +++ b/references/v3-catalog/trigger.config.ts @@ -13,7 +13,7 @@ export { handleError } from "./src/handleError.js"; export default defineConfig({ runtime: "node", project: "yubjwjsfkxnylobaqvqz", - machine: "small-2x", + machine: "medium-1x", instrumentations: [new OpenAIInstrumentation()], additionalFiles: ["wrangler/wrangler.toml"], retries: { From a538fa879f00bddc09c3b06afd956bb0a0bea59a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 22:07:50 +0100 Subject: [PATCH 32/55] chore: Update version for release (#1322) Co-authored-by: github-actions[bot] --- .changeset/new-yaks-fail.md | 5 ----- .changeset/quick-bulldogs-float.md | 5 ----- packages/build/CHANGELOG.md | 6 ++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 9 +++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 2 ++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 6 ++++++ packages/trigger-sdk/package.json | 4 ++-- 10 files changed, 31 insertions(+), 18 deletions(-) delete mode 100644 .changeset/new-yaks-fail.md delete mode 100644 .changeset/quick-bulldogs-float.md diff --git a/.changeset/new-yaks-fail.md b/.changeset/new-yaks-fail.md deleted file mode 100644 index f13b00417..000000000 --- a/.changeset/new-yaks-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Apply default machine preset in config diff --git a/.changeset/quick-bulldogs-float.md b/.changeset/quick-bulldogs-float.md deleted file mode 100644 index da07c0dec..000000000 --- a/.changeset/quick-bulldogs-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Add additional error message and stack trace when a task file cannot be imported for run diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 79a4e492f..41189422f 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,11 @@ # @trigger.dev/build +## 3.0.5 + +### Patch Changes + +- @trigger.dev/core@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index 6d446d86c..0698fb1db 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.4", + "version": "3.0.5", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -61,7 +61,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.4", + "@trigger.dev/core": "workspace:3.0.5", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index e1cfb80d0..9784fbec1 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,14 @@ # trigger.dev +## 3.0.5 + +### Patch Changes + +- 3b1522445: Apply default machine preset in config +- 3b1522445: Add additional error message and stack trace when a task file cannot be imported for run + - @trigger.dev/build@3.0.5 + - @trigger.dev/core@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index caff25437..84efabf2d 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.4", + "version": "3.0.5", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -87,8 +87,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.4", - "@trigger.dev/core": "workspace:3.0.4", + "@trigger.dev/build": "workspace:3.0.5", + "@trigger.dev/core": "workspace:3.0.5", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index ac4382505..285be2b2f 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,7 @@ # internal-platform +## 3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index be326ef83..08907cfda 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.4", + "version": "3.0.5", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 80620343f..8014e6141 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,11 @@ # @trigger.dev/sdk +## 3.0.5 + +### Patch Changes + +- @trigger.dev/core@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index a2f75fe0b..2fc132238 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.4", + "version": "3.0.5", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.4", + "@trigger.dev/core": "workspace:3.0.5", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From b3a6f4e0ac62f10f6c539c933e7ec46b8843c87e Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Sep 2024 22:08:45 +0100 Subject: [PATCH 33/55] Release 3.0.5 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03057eed2..8f1c6e2b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.4 + specifier: workspace:3.0.5 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.4 + specifier: workspace:3.0.5 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.4 + specifier: workspace:3.0.5 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.4 + specifier: workspace:3.0.5 version: link:../core chalk: specifier: ^5.2.0 From 6952ec2c877a58c2b9814546d7a8f4604d9c3cfd Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:20:30 +0100 Subject: [PATCH 34/55] Prevent crashes on expected checkpoint cancellations (#1324) * cancel checkpoint waits when cancelling runs * only crash in case of readiness timeouts --- apps/coordinator/src/index.ts | 36 ++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/apps/coordinator/src/index.ts b/apps/coordinator/src/index.ts index 15cd87ab6..ca3f1b427 100644 --- a/apps/coordinator/src/index.ts +++ b/apps/coordinator/src/index.ts @@ -55,6 +55,9 @@ const chaosMonkey = new ChaosMonkey( !!process.env.CHAOS_MONKEY_DISABLE_DELAYS ); +class CheckpointReadinessTimeoutError extends Error {} +class CheckpointCancelError extends Error {} + class TaskCoordinator { #httpServer: ReturnType; #checkpointer = new Checkpointer({ @@ -241,7 +244,7 @@ class TaskCoordinator { return; } - this.#checkpointer.cancelCheckpoint(message.runId); + this.#cancelCheckpoint(message.runId); if (message.delayInMs) { taskSocket.emit("REQUEST_EXIT", { @@ -398,9 +401,14 @@ class TaskCoordinator { let timeout: NodeJS.Timeout | undefined = undefined; + const CHECKPOINTABLE_TIMEOUT_SECONDS = 20; + const isCheckpointable = new Promise((resolve, reject) => { // We set a reasonable timeout to prevent waiting forever - timeout = setTimeout(() => reject("timeout"), 20_000); + timeout = setTimeout( + () => reject(new CheckpointReadinessTimeoutError()), + CHECKPOINTABLE_TIMEOUT_SECONDS * 1000 + ); this.#checkpointableTasks.set(socket.data.runId, { resolve, reject }); }); @@ -415,10 +423,24 @@ class TaskCoordinator { } catch (error) { logger.error("Error while waiting for checkpointable state", { error }); - await crashRun({ - name: "ReadyForCheckpointError", - message: `Failed to become checkpointable for ${reason}`, - }); + if (error instanceof CheckpointReadinessTimeoutError) { + await crashRun({ + name: error.name, + message: `Failed to become checkpointable in ${CHECKPOINTABLE_TIMEOUT_SECONDS}s for ${reason}`, + }); + + return { + success: false, + reason: "timeout", + }; + } + + if (error instanceof CheckpointCancelError) { + return { + success: false, + reason: "canceled", + }; + } return { success: false, @@ -1065,7 +1087,7 @@ class TaskCoordinator { if (checkpointWait) { // Stop waiting for task to reach checkpointable state - checkpointWait.reject("Checkpoint cancelled"); + checkpointWait.reject(new CheckpointCancelError()); } // Cancel checkpointing procedure From 55dcdc7b52d6ee6c9b43bc35c31a0a6f2f592fa8 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:57:50 +0100 Subject: [PATCH 35/55] Add self-hosting image update instructions --- docs/open-source-self-hosting.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/open-source-self-hosting.mdx b/docs/open-source-self-hosting.mdx index e378d1688..44f3bea51 100644 --- a/docs/open-source-self-hosting.mdx +++ b/docs/open-source-self-hosting.mdx @@ -308,6 +308,7 @@ If you're coming from the beta CLI package images, you will need to: - **Switch branches.** We moved back to main. Run `git checkout main` in your docker repo. - **Pull in updates.** We've added a new container for [Electric](https://github.com/electric-sql/electric) and made some other improvements. Run `git pull` to get the latest updates. - **Apply your changes.** If you stashed your changes, apply them with `git stash pop`. +- **Update your images.** We've also published new images. Run `./update.sh` to pull them. - **Restart all services.** Run `./stop.sh && ./start.sh` and you're good to go. In summary, run this wherever you cloned the docker repo: @@ -323,7 +324,8 @@ git pull # if you stashed your changes git stash pop -# restart your services +# update and restart your services +./update.sh ./stop.sh && ./start.sh ``` From b590a318a22216dd93063c8a05acde35dd44929b Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 11:58:06 +0100 Subject: [PATCH 36/55] Removed the usage prediction for now (#1326) --- .../app/components/billing/v3/UsageBar.tsx | 39 ++----------------- .../route.tsx | 32 +++++---------- 2 files changed, 12 insertions(+), 59 deletions(-) diff --git a/apps/webapp/app/components/billing/v3/UsageBar.tsx b/apps/webapp/app/components/billing/v3/UsageBar.tsx index c12d6d030..7d4e5db23 100644 --- a/apps/webapp/app/components/billing/v3/UsageBar.tsx +++ b/apps/webapp/app/components/billing/v3/UsageBar.tsx @@ -8,32 +8,16 @@ type UsageBarProps = { current: number; billingLimit?: number; tierLimit?: number; - projectedUsage?: number; isPaying: boolean; }; const startFactor = 4; -export function UsageBar({ - current, - billingLimit, - tierLimit, - projectedUsage, - isPaying, -}: UsageBarProps) { - const getLargestNumber = Math.max( - current, - tierLimit ?? -Infinity, - projectedUsage ?? -Infinity, - billingLimit ?? -Infinity, - 5 - ); +export function UsageBar({ current, billingLimit, tierLimit, isPaying }: UsageBarProps) { + const getLargestNumber = Math.max(current, tierLimit ?? -Infinity, billingLimit ?? -Infinity, 5); //creates a maximum range for the progress bar, add 10% to the largest number so the bar doesn't reach the end const maxRange = Math.round(getLargestNumber * 1.1); const tierRunLimitPercentage = tierLimit ? Math.round((tierLimit / maxRange) * 100) : 0; - const projectedRunsPercentage = projectedUsage - ? Math.round((projectedUsage / maxRange) * 100) - : 0; const billingLimitPercentage = billingLimit !== undefined ? Math.round((billingLimit / maxRange) * 100) : 0; const usagePercentage = Math.round((current / maxRange) * 100); @@ -42,7 +26,7 @@ export function UsageBar({ const usageCappedToLimitPercentage = Math.min(usagePercentage, tierRunLimitPercentage); return ( -

+
{billingLimit !== undefined && ( )} - {projectedUsage !== undefined && projectedUsage !== 0 && ( - - - - )} - {(usage) => ( - <> -
-
- - {isCurrentMonth ? "Month-to-date" : "Usage"} - -

- {formatCurrency(usage.overall.current, false)} -

-
- {isCurrentMonth ? ( - <> - -
- Projected -

- {formatCurrency(usage.overall.projected, false)} -

-
- - ) : null} +
+
+ + {isCurrentMonth ? "Month-to-date" : "Usage"} + +

+ {formatCurrency(usage.overall.current, false)} +

- +
)} From 4e0bc485a12f17116dcd1ddad8c3eac9c03e1b3f Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 19 Sep 2024 13:20:26 +0100 Subject: [PATCH 37/55] Add support for Buffer in payloads and outputs --- .changeset/healthy-donkeys-grab.md | 5 +++++ packages/core/src/v3/utils/ioSerialization.ts | 13 ++++++++++++- references/v3-catalog/src/trigger/superjson.ts | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 .changeset/healthy-donkeys-grab.md diff --git a/.changeset/healthy-donkeys-grab.md b/.changeset/healthy-donkeys-grab.md new file mode 100644 index 000000000..903a50d9c --- /dev/null +++ b/.changeset/healthy-donkeys-grab.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/core": patch +--- + +Add support for Buffer in payloads and outputs diff --git a/packages/core/src/v3/utils/ioSerialization.ts b/packages/core/src/v3/utils/ioSerialization.ts index 32d47d237..830a6fb40 100644 --- a/packages/core/src/v3/utils/ioSerialization.ts +++ b/packages/core/src/v3/utils/ioSerialization.ts @@ -366,7 +366,18 @@ function getPacketExtension(outputType: string): string { } async function loadSuperJSON() { - return await import("superjson"); + const superjson = await import("superjson"); + + superjson.registerCustom( + { + isApplicable: (v): v is Buffer => v instanceof Buffer, + serialize: (v) => [...v], + deserialize: (v) => Buffer.from(v), + }, + "buffer" + ); + + return superjson; } function safeJsonParse(value: string): any { diff --git a/references/v3-catalog/src/trigger/superjson.ts b/references/v3-catalog/src/trigger/superjson.ts index a6af9c5d9..1e25be9a5 100644 --- a/references/v3-catalog/src/trigger/superjson.ts +++ b/references/v3-catalog/src/trigger/superjson.ts @@ -6,6 +6,7 @@ export const superParentTask = task({ const result = await superChildTask.triggerAndWait({ foo: "bar", whenToDo: new Date(), + buffer: Buffer.from("foo"), }); if (result.ok) { @@ -24,10 +25,11 @@ export const superParentTask = task({ export const superChildTask = task({ id: "super-child-task", - run: async (payload: { whenToDo: Date; foo: string }) => { + run: async (payload: { whenToDo: Date; foo: string; buffer: Buffer }) => { logger.log("super-child-task payload: ", { payload }); logger.log(`typeof payload.whenToDo = ${typeof payload.whenToDo}`); logger.log(`typeof payload.foo = ${typeof payload.foo}`); + logger.log(`typeof payload.buffer = ${payload.buffer.toString("utf-8")}`); return { date: new Date(), From b4be7365551629e04732c6ecaa49aa82a5f1874c Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 19 Sep 2024 15:21:03 +0100 Subject: [PATCH 38/55] prismaExtension fixes for #1325 and #1327 --- .changeset/friendly-brooms-cry.md | 6 ++++ .vscode/launch.json | 8 +++++ docs/config/config-file.mdx | 7 ++--- packages/build/src/extensions/prisma.ts | 31 ++++++++++++++----- packages/cli-v3/src/deploy/buildImage.ts | 4 +-- pnpm-lock.yaml | 22 +++++++++++++ references/prisma-catalog/package.json | 18 +++++++++++ .../migration.sql | 20 ++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ .../prisma-catalog/prisma/schema.prisma | 26 ++++++++++++++++ .../prisma/sql/getUsersWithPosts.sql | 10 ++++++ references/prisma-catalog/src/db.ts | 6 ++++ .../prisma-catalog/src/trigger/dbTasks.ts | 21 +++++++++++++ references/prisma-catalog/trigger.config.ts | 26 ++++++++++++++++ references/prisma-catalog/tsconfig.json | 15 +++++++++ 15 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 .changeset/friendly-brooms-cry.md create mode 100644 references/prisma-catalog/package.json create mode 100644 references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql create mode 100644 references/prisma-catalog/prisma/migrations/migration_lock.toml create mode 100644 references/prisma-catalog/prisma/schema.prisma create mode 100644 references/prisma-catalog/prisma/sql/getUsersWithPosts.sql create mode 100644 references/prisma-catalog/src/db.ts create mode 100644 references/prisma-catalog/src/trigger/dbTasks.ts create mode 100644 references/prisma-catalog/trigger.config.ts create mode 100644 references/prisma-catalog/tsconfig.json diff --git a/.changeset/friendly-brooms-cry.md b/.changeset/friendly-brooms-cry.md new file mode 100644 index 000000000..aa7fff9a7 --- /dev/null +++ b/.changeset/friendly-brooms-cry.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/build": patch +--- + +prismaExtension fixes for #1325 and #1327 diff --git a/.vscode/launch.json b/.vscode/launch.json index 1e7cf8eb0..8fd69a9b4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,6 +36,14 @@ "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, + { + "type": "node-terminal", + "request": "launch", + "name": "Debug prisma-catalog deploy CLI", + "command": "pnpm exec trigger deploy --self-hosted --load-image", + "cwd": "${workspaceFolder}/references/prisma-catalog", + "sourceMaps": true + }, { "type": "node-terminal", "request": "launch", diff --git a/docs/config/config-file.mdx b/docs/config/config-file.mdx index 7c898e494..661331410 100644 --- a/docs/config/config-file.mdx +++ b/docs/config/config-file.mdx @@ -444,12 +444,9 @@ export default defineConfig({ ``` - The `prismaExtension` will inject the `DATABASE_URL` environment variable into the build process - when running the `deploy` command. This means the CLI needs to have `process.env.DATABASE_URL` set - at the time of calling the `deploy` command. You can do this via a `.env` file and passing the - `--env-file .env` option to the deploy command or via shell environment variables. This goes for direct database URLs as well. + The `prismaExtension` will inject the `DATABASE_URL` environment variable into the build process. Learn more about setting environment variables for deploying in our [Environment Variables](/deploy-environment-variables) guide. -These environment variables are only used during the build process and are not embedded in the final image. +These environment variables are only used during the build process and are not embedded in the final container image. diff --git a/packages/build/src/extensions/prisma.ts b/packages/build/src/extensions/prisma.ts index 26d5253d6..b67adc7ef 100644 --- a/packages/build/src/extensions/prisma.ts +++ b/packages/build/src/extensions/prisma.ts @@ -127,8 +127,9 @@ export class PrismaExtension implements BuildExtension { if (this.options.typedSql) { generatorFlags.push(`--sql`); - const schemaDir = dirname(this._resolvedSchemaPath); - const prismaDir = dirname(schemaDir); + const prismaDir = usingSchemaFolder + ? dirname(dirname(this._resolvedSchemaPath)) + : dirname(this._resolvedSchemaPath); context.logger.debug(`Using typedSql`); @@ -226,15 +227,29 @@ export class PrismaExtension implements BuildExtension { commands.push( `${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js migrate deploy` ); + } - env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL; + env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL; - if (this.options.directUrlEnvVarName) { - env[this.options.directUrlEnvVarName] = - manifest.deploy.env?.[this.options.directUrlEnvVarName]; - } else { - env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL; + if (this.options.directUrlEnvVarName) { + env[this.options.directUrlEnvVarName] = + manifest.deploy.env?.[this.options.directUrlEnvVarName] ?? + process.env[this.options.directUrlEnvVarName]; + + if (!env[this.options.directUrlEnvVarName]) { + context.logger.warn( + `prismaExtension could not resolve the ${this.options.directUrlEnvVarName} environment variable. Make sure you add it to your environment variables or provide it as an environment variable to the deploy CLI command. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables` + ); } + } else { + env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL; + env.DIRECT_DATABASE_URL = manifest.deploy.env?.DIRECT_DATABASE_URL; + } + + if (!env.DATABASE_URL) { + context.logger.warn( + `prismaExtension could not resolve the DATABASE_URL environment variable. Make sure you add it to your environment variables. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables` + ); } context.logger.debug(`Adding the prisma layer with the following commands`, { diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index a5fed62b6..db933fa5b 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -492,7 +492,7 @@ COPY --chown=bun:bun . . ${postInstallCommands} -from build as indexer +FROM build AS indexer USER bun WORKDIR /app @@ -601,7 +601,7 @@ COPY --chown=node:node . . ${postInstallCommands} -from build as indexer +FROM build AS indexer USER node WORKDIR /app diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f1c6e2b3..6d4af21c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1360,6 +1360,28 @@ importers: specifier: workspace:* version: link:../../packages/cli-v3 + references/prisma-catalog: + dependencies: + '@prisma/client': + specifier: 5.19.0 + version: 5.19.0(prisma@5.19.0) + '@trigger.dev/sdk': + specifier: workspace:* + version: link:../../packages/trigger-sdk + devDependencies: + '@trigger.dev/build': + specifier: workspace:* + version: link:../../packages/build + prisma: + specifier: 5.19.0 + version: 5.19.0 + trigger.dev: + specifier: workspace:* + version: link:../../packages/cli-v3 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + references/v3-catalog: dependencies: '@infisical/sdk': diff --git a/references/prisma-catalog/package.json b/references/prisma-catalog/package.json new file mode 100644 index 000000000..74f9f3943 --- /dev/null +++ b/references/prisma-catalog/package.json @@ -0,0 +1,18 @@ +{ + "name": "references-prisma-catalog", + "private": true, + "type": "module", + "devDependencies": { + "trigger.dev": "workspace:*", + "@trigger.dev/build": "workspace:*", + "typescript": "^5.5.4", + "prisma": "5.19.0" + }, + "dependencies": { + "@trigger.dev/sdk": "workspace:*", + "@prisma/client": "5.19.0" + }, + "scripts": { + "generate:prisma": "prisma generate --sql" + } +} \ No newline at end of file diff --git a/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql b/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql new file mode 100644 index 000000000..4af85373f --- /dev/null +++ b/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql @@ -0,0 +1,20 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Post" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "authorId" INTEGER NOT NULL, + + CONSTRAINT "Post_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/references/prisma-catalog/prisma/migrations/migration_lock.toml b/references/prisma-catalog/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..fbffa92c2 --- /dev/null +++ b/references/prisma-catalog/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/references/prisma-catalog/prisma/schema.prisma b/references/prisma-catalog/prisma/schema.prisma new file mode 100644 index 000000000..b05278b72 --- /dev/null +++ b/references/prisma-catalog/prisma/schema.prisma @@ -0,0 +1,26 @@ +generator client { + provider = "prisma-client-js" + previewFeatures = ["typedSql"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DIRECT_DATABASE_URL") +} + +// user.prisma +model User { + id Int @id @default(autoincrement()) + name String + posts Post[] +} + +// post.prisma +model Post { + id Int @id @default(autoincrement()) + title String + content String + authorId Int + author User @relation(fields: [authorId], references: [id]) +} diff --git a/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql b/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql new file mode 100644 index 000000000..8f0cb3576 --- /dev/null +++ b/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql @@ -0,0 +1,10 @@ +SELECT + u.id, + u.name, + COUNT(p.id) as "postCount" +FROM + "User" u + LEFT JOIN "Post" p ON u.id = p."authorId" +GROUP BY + u.id, + u.name; \ No newline at end of file diff --git a/references/prisma-catalog/src/db.ts b/references/prisma-catalog/src/db.ts new file mode 100644 index 000000000..5e029ca06 --- /dev/null +++ b/references/prisma-catalog/src/db.ts @@ -0,0 +1,6 @@ +import { PrismaClient } from "@prisma/client"; +import { getUsersWithPosts } from "@prisma/client/sql"; + +export const prisma = new PrismaClient(); + +export { getUsersWithPosts }; diff --git a/references/prisma-catalog/src/trigger/dbTasks.ts b/references/prisma-catalog/src/trigger/dbTasks.ts new file mode 100644 index 000000000..7edb46601 --- /dev/null +++ b/references/prisma-catalog/src/trigger/dbTasks.ts @@ -0,0 +1,21 @@ +import { getUsersWithPosts, prisma } from "../db.js"; +import { logger, task } from "@trigger.dev/sdk/v3"; + +export const prismaTask = task({ + id: "prisma-task", + run: async () => { + const users = await prisma.user.findMany(); + + await prisma.user.create({ + data: { + name: "Alice", + }, + }); + + const usersWithPosts = await prisma.$queryRawTyped(getUsersWithPosts()); + + logger.info("Users with posts", { usersWithPosts }); + + return users; + }, +}); diff --git a/references/prisma-catalog/trigger.config.ts b/references/prisma-catalog/trigger.config.ts new file mode 100644 index 000000000..1bbf0eb2c --- /dev/null +++ b/references/prisma-catalog/trigger.config.ts @@ -0,0 +1,26 @@ +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + runtime: "node", + project: "proj_mpzmrzygzbvmfjnnpcsk", + retries: { + enabledInDev: false, + default: { + maxAttempts: 3, + minTimeoutInMs: 5_000, + maxTimeoutInMs: 30_000, + factor: 2, + randomize: true, + }, + }, + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + directUrlEnvVarName: "DIRECT_DATABASE_URL", + typedSql: true, + }), + ], + }, +}); diff --git a/references/prisma-catalog/tsconfig.json b/references/prisma-catalog/tsconfig.json new file mode 100644 index 000000000..9a5ee0b9d --- /dev/null +++ b/references/prisma-catalog/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2023", + "module": "Node16", + "moduleResolution": "Node16", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "customConditions": ["@triggerdotdev/source"], + "jsx": "preserve", + "lib": ["DOM", "DOM.Iterable"], + "noEmit": true + }, + "include": ["./src/**/*.ts", "trigger.config.ts"] +} From c65d4822b4f54409e66ee492ae9e5159d6dd3aa6 Mon Sep 17 00:00:00 2001 From: Thibaut Cuchet Date: Thu, 19 Sep 2024 16:22:57 +0200 Subject: [PATCH 39/55] Feat: Extension puppeteer (#1323) * feat: add puppeteer extension * chore: update package and config * feat: add puppeteer task * Create little-donkeys-protect.md --------- Co-authored-by: Eric Allam --- .changeset/little-donkeys-protect.md | 5 + packages/build/package.json | 17 +- packages/build/src/extensions/puppeteer.ts | 34 ++ pnpm-lock.yaml | 326 +++++++++++++++++- references/v3-catalog/package.json | 5 +- .../v3-catalog/src/trigger/puppeteerTask.ts | 16 + references/v3-catalog/trigger.config.ts | 2 + 7 files changed, 394 insertions(+), 11 deletions(-) create mode 100644 .changeset/little-donkeys-protect.md create mode 100644 packages/build/src/extensions/puppeteer.ts create mode 100644 references/v3-catalog/src/trigger/puppeteerTask.ts diff --git a/.changeset/little-donkeys-protect.md b/.changeset/little-donkeys-protect.md new file mode 100644 index 000000000..479f7a0da --- /dev/null +++ b/.changeset/little-donkeys-protect.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Feat: puppeteer build extension diff --git a/packages/build/package.json b/packages/build/package.json index 0698fb1db..bef0f199f 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -27,7 +27,8 @@ "./extensions/core": "./src/extensions/core.ts", "./extensions/prisma": "./src/extensions/prisma.ts", "./extensions/audioWaveform": "./src/extensions/audioWaveform.ts", - "./extensions/typescript": "./src/extensions/typescript.ts" + "./extensions/typescript": "./src/extensions/typescript.ts", + "./extensions/puppeteer": "./src/extensions/puppeteer.ts" }, "sourceDialects": [ "@triggerdotdev/source" @@ -49,6 +50,9 @@ ], "extensions/typescript": [ "dist/commonjs/extensions/typescript.d.ts" + ], + "extensions/puppeteer": [ + "dist/commonjs/extensions/puppeteer.d.ts" ] } }, @@ -145,6 +149,17 @@ "types": "./dist/commonjs/extensions/typescript.d.ts", "default": "./dist/commonjs/extensions/typescript.js" } + }, + "./extensions/puppeteer": { + "import": { + "@triggerdotdev/source": "./src/extensions/puppeteer.ts", + "types": "./dist/esm/extensions/puppeteer.d.ts", + "default": "./dist/esm/extensions/puppeteer.js" + }, + "require": { + "types": "./dist/commonjs/extensions/puppeteer.d.ts", + "default": "./dist/commonjs/extensions/puppeteer.js" + } } }, "main": "./dist/commonjs/index.js", diff --git a/packages/build/src/extensions/puppeteer.ts b/packages/build/src/extensions/puppeteer.ts new file mode 100644 index 000000000..5a327424c --- /dev/null +++ b/packages/build/src/extensions/puppeteer.ts @@ -0,0 +1,34 @@ +import { BuildManifest } from "@trigger.dev/core/v3"; +import { BuildContext, BuildExtension } from "@trigger.dev/core/v3/build"; + +export function puppeteer() { + return new PuppeteerExtension(); +} + +class PuppeteerExtension implements BuildExtension { + public readonly name = "PuppeteerExtension"; + + async onBuildComplete(context: BuildContext, manifest: BuildManifest) { + if (context.target === "dev") { + return; + } + + context.logger.debug(`Adding ${this.name} to the build`); + + const instructions = [ + `RUN apt-get update && apt-get install curl gnupg -y \ + && curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ + && apt-get update \ + && apt-get install google-chrome-stable -y --no-install-recommends \ + && rm -rf /var/lib/apt/lists/*`, + ]; + + context.addLayer({ + id: "puppeteer", + image: { + instructions, + }, + }); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d4af21c3..ca0e051fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1447,6 +1447,9 @@ importers: pg: specifier: ^8.11.5 version: 8.11.5 + puppeteer: + specifier: ^23.4.0 + version: 23.4.0(typescript@5.5.4) react: specifier: 19.0.0-rc.0 version: 19.0.0-rc.0 @@ -6873,9 +6876,9 @@ packages: resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 lru-cache: 10.0.1 socks-proxy-agent: 8.0.4 transitivePeerDependencies: @@ -8074,6 +8077,23 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + /@puppeteer/browsers@2.4.0: + resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + debug: 4.3.6 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.4.0 + semver: 7.6.3 + tar-fs: 3.0.6 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + /@radix-ui/colors@1.0.1: resolution: {integrity: sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==} dev: false @@ -14812,6 +14832,14 @@ packages: '@types/node': 18.19.20 dev: true + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.19.20 + dev: false + optional: true + /@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6)(eslint@8.31.0)(typescript@5.2.2): resolution: {integrity: sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -16116,6 +16144,10 @@ packages: engines: {node: '>= 0.4'} dev: false + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + dev: false + /babel-loader@9.1.3(@babel/core@7.24.5)(webpack@5.88.2): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} @@ -16252,6 +16284,45 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + requiresBuild: true + dev: false + optional: true + + /bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + requiresBuild: true + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.3.0 + dev: false + optional: true + + /bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + requiresBuild: true + dev: false + optional: true + + /bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + requiresBuild: true + dependencies: + bare-os: 2.4.4 + dev: false + optional: true + + /bare-stream@2.3.0: + resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} + requiresBuild: true + dependencies: + b4a: 1.6.6 + streamx: 2.20.1 + dev: false + optional: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -16380,7 +16451,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -16755,6 +16825,17 @@ packages: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} + /chromium-bidi@0.6.5(devtools-protocol@0.0.1342118): + resolution: {integrity: sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1342118 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + dev: false + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} @@ -17178,6 +17259,22 @@ packages: typescript: 5.2.2 dev: true + /cosmiconfig@9.0.0(typescript@5.5.4): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.5.4 + dev: false + /cp-file@10.0.0: resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} engines: {node: '>=14.16'} @@ -17572,6 +17669,18 @@ packages: dependencies: ms: 2.1.2 + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -17766,6 +17875,10 @@ packages: minimist: 1.2.7 dev: false + /devtools-protocol@0.0.1342118: + resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} + dev: false + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -17959,7 +18072,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true /engine.io-client@6.5.3: resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} @@ -19376,6 +19488,20 @@ packages: tmp: 0.0.33 dev: false + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.6 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: false + /extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} @@ -19397,6 +19523,10 @@ packages: engines: {node: '>=6.0.0'} dev: false + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -19459,6 +19589,12 @@ packages: format: 0.2.2 dev: true + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + /fdir@6.2.0(picomatch@4.0.2): resolution: {integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==} peerDependencies: @@ -19904,7 +20040,6 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.0 - dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -20423,6 +20558,16 @@ packages: transitivePeerDependencies: - supports-color + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + dev: false + /http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -20460,7 +20605,16 @@ packages: debug: 4.3.6 transitivePeerDependencies: - supports-color - dev: true + + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + dev: false /https@1.0.0: resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} @@ -22426,6 +22580,10 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + /mixme@0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} engines: {node: '>= 8.0.0'} @@ -23421,6 +23579,22 @@ packages: - supports-color dev: false + /pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.6 + get-uri: 6.0.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /pac-resolver@7.0.0: resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} engines: {node: '>= 14'} @@ -23430,6 +23604,14 @@ packages: netmask: 2.0.2 dev: false + /pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + dev: false + /package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} dev: true @@ -23489,7 +23671,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -23624,6 +23806,10 @@ packages: through2: 2.0.5 dev: true + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: false @@ -24540,6 +24726,22 @@ packages: - supports-color dev: false + /proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.2 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -24563,7 +24765,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -24581,6 +24782,41 @@ packages: resolution: {integrity: sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==} engines: {node: '>=6'} + /puppeteer-core@23.4.0: + resolution: {integrity: sha512-fqkIP5FOcb38jfBj/OcBz1wFaI9nk40uQKSORvnXws6wCbep2dg8yxZ3ddJxBIfQsxoiEOvnrykFinUScrB/ew==} + engines: {node: '>=18'} + dependencies: + '@puppeteer/browsers': 2.4.0 + chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) + debug: 4.3.7 + devtools-protocol: 0.0.1342118 + typed-query-selector: 2.12.0 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /puppeteer@23.4.0(typescript@5.5.4): + resolution: {integrity: sha512-FxgFFJI7NAsX8uebiEDSjS86vufz9TaqERQHShQT0lCbSRI3jUPEcz/0HdwLiYvfYNsc1zGjqY3NsGZya4PvUA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + dependencies: + '@puppeteer/browsers': 2.4.0 + chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) + cosmiconfig: 9.0.0(typescript@5.5.4) + devtools-protocol: 0.0.1342118 + puppeteer-core: 23.4.0 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + dev: false + /purgecss@2.3.0: resolution: {integrity: sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==} hasBin: true @@ -24609,6 +24845,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -26009,6 +26249,12 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -26577,6 +26823,16 @@ packages: engines: {node: '>=10.0.0'} dev: false + /streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.0 + optionalDependencies: + bare-events: 2.4.2 + dev: false + /strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} dev: false @@ -27070,6 +27326,16 @@ packages: tar-stream: 2.2.0 dev: true + /tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.5 + bare-path: 2.1.3 + dev: false + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -27081,6 +27347,14 @@ packages: readable-stream: 3.6.0 dev: true + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.20.1 + dev: false + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} @@ -27209,6 +27483,12 @@ packages: commander: 2.20.3 source-map-support: 0.5.21 + /text-decoder@1.2.0: + resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} + dependencies: + b4a: 1.6.6 + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -27235,6 +27515,10 @@ packages: xtend: 4.0.2 dev: true + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -27838,6 +28122,10 @@ packages: rxjs: 7.8.1 dev: true + /typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + dev: false + /typeorm@0.3.20(pg@8.11.5)(ts-node@10.9.2): resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} engines: {node: '>=16.13.0'} @@ -27972,6 +28260,13 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: false + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -28178,6 +28473,10 @@ packages: requires-port: 1.0.0 dev: false + /urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + dev: false + /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} dev: false @@ -29508,6 +29807,13 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -29567,6 +29873,10 @@ packages: /zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + dev: false + /zustand@4.5.5(@types/react@18.2.69)(react@18.2.0): resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==} engines: {node: '>=12.7.0'} diff --git a/references/v3-catalog/package.json b/references/v3-catalog/package.json index 26f987282..fdbf5c09d 100644 --- a/references/v3-catalog/package.json +++ b/references/v3-catalog/package.json @@ -16,7 +16,6 @@ "generate:prisma": "prisma generate --sql" }, "dependencies": { - "fluent-ffmpeg": "^2.1.3", "@infisical/sdk": "^2.1.9", "@opentelemetry/api": "1.4.1", "@prisma/client": "5.19.0", @@ -32,11 +31,13 @@ "dotenv": "^16.4.5", "email-reply-parser": "^1.8.0", "execa": "^8.0.1", + "fluent-ffmpeg": "^2.1.3", "header-generator": "^2.1.55", "kysely": "^0.27.4", "msw": "^2.2.1", "openai": "^4.47.0", "pg": "^8.11.5", + "puppeteer": "^23.4.0", "react": "19.0.0-rc.0", "react-email": "^3.0.1", "reflect-metadata": "^0.1.13", @@ -65,9 +66,9 @@ "@opentelemetry/semantic-conventions": "^1.22.0", "@trigger.dev/build": "workspace:*", "@types/email-reply-parser": "^1.4.2", + "@types/fluent-ffmpeg": "^2.1.26", "@types/node": "20.4.2", "@types/react": "^18.3.1", - "@types/fluent-ffmpeg": "^2.1.26", "esbuild": "^0.19.11", "prisma": "5.19.0", "prisma-kysely": "^1.8.0", diff --git a/references/v3-catalog/src/trigger/puppeteerTask.ts b/references/v3-catalog/src/trigger/puppeteerTask.ts new file mode 100644 index 000000000..362179898 --- /dev/null +++ b/references/v3-catalog/src/trigger/puppeteerTask.ts @@ -0,0 +1,16 @@ +import { task } from "@trigger.dev/sdk/v3"; +import puppeteer from "puppeteer"; + +export const puppeteerTask = task({ + id: "puppeteer-task", + machine: { + preset: "large-1x" + }, + run: async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + await page.goto("https://google.com"); + await page.screenshot({ path: "screenshot.png" }); + await browser.close(); + }, +}); diff --git a/references/v3-catalog/trigger.config.ts b/references/v3-catalog/trigger.config.ts index 9f9b3554c..36d5f7bab 100644 --- a/references/v3-catalog/trigger.config.ts +++ b/references/v3-catalog/trigger.config.ts @@ -4,6 +4,7 @@ import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; import { esbuildPlugin } from "@trigger.dev/build"; import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; import { ffmpeg, syncEnvVars } from "@trigger.dev/build/extensions/core"; +import { puppeteer } from "@trigger.dev/build/extensions/puppeteer"; import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; import { defineConfig } from "@trigger.dev/sdk/v3"; @@ -79,6 +80,7 @@ export default defineConfig({ value: secret.secretValue, })); }), + puppeteer(), ], external: ["re2"], }, From 64862db846a9fe6e233518b885816a67f95c8604 Mon Sep 17 00:00:00 2001 From: Niels Date: Thu, 19 Sep 2024 16:25:17 +0200 Subject: [PATCH 40/55] Update dotEnv.ts to ignore OTEL_EXPORTER_OTLP_ENDPOINT as well (#1307) * Update dotEnv.ts * Create four-buttons-run.md --------- Co-authored-by: Eric Allam --- .changeset/four-buttons-run.md | 5 +++++ packages/cli-v3/src/utilities/dotEnv.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/four-buttons-run.md diff --git a/.changeset/four-buttons-run.md b/.changeset/four-buttons-run.md new file mode 100644 index 000000000..e89c4f7d8 --- /dev/null +++ b/.changeset/four-buttons-run.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Ignore OTEL_EXPORTER_OTLP_ENDPOINT environment variable from `.env` files, to prevent the internal OTEL_EXPORTER_OTLP_ENDPOINT being overwritten with a user-supplied value. diff --git a/packages/cli-v3/src/utilities/dotEnv.ts b/packages/cli-v3/src/utilities/dotEnv.ts index 717aa88c5..7b5bfbcf6 100644 --- a/packages/cli-v3/src/utilities/dotEnv.ts +++ b/packages/cli-v3/src/utilities/dotEnv.ts @@ -21,6 +21,7 @@ export function resolveDotEnvVars(cwd?: string, envFile?: string) { // remove TRIGGER_API_URL and TRIGGER_SECRET_KEY, since those should be coming from the worker delete result.TRIGGER_API_URL; delete result.TRIGGER_SECRET_KEY; + delete result.OTEL_EXPORTER_OTLP_ENDPOINT; return result; } From 1679a184ad3d59dd36a49c9f6f15697e2705e6ca Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 17:09:50 +0100 Subject: [PATCH 41/55] Docs/pdf to image (#1330) * Added pdf-to-image example * Copy tweak * Squashed commit of the following: commit 64862db846a9fe6e233518b885816a67f95c8604 Author: Niels Date: Thu Sep 19 16:25:17 2024 +0200 Update dotEnv.ts to ignore OTEL_EXPORTER_OTLP_ENDPOINT as well (#1307) * Update dotEnv.ts * Create four-buttons-run.md --------- Co-authored-by: Eric Allam commit c65d4822b4f54409e66ee492ae9e5159d6dd3aa6 Author: Thibaut Cuchet Date: Thu Sep 19 16:22:57 2024 +0200 Feat: Extension puppeteer (#1323) * feat: add puppeteer extension * chore: update package and config * feat: add puppeteer task * Create little-donkeys-protect.md --------- Co-authored-by: Eric Allam commit b4be7365551629e04732c6ecaa49aa82a5f1874c Author: Eric Allam Date: Thu Sep 19 15:21:03 2024 +0100 prismaExtension fixes for #1325 and #1327 * Copy tweak --- docs/examples/intro.mdx | 1 + docs/examples/pdf-to-image.mdx | 84 ++++++++++++++++++++++++++++++++++ docs/mint.json | 1 + 3 files changed, 86 insertions(+) create mode 100644 docs/examples/pdf-to-image.mdx diff --git a/docs/examples/intro.mdx b/docs/examples/intro.mdx index e9881ebdf..7de0967a2 100644 --- a/docs/examples/intro.mdx +++ b/docs/examples/intro.mdx @@ -9,6 +9,7 @@ description: "Learn how to use Trigger.dev with these practical task examples." | [DALL·E 3 image generation](/examples/dall-e3-generate-image) | Use OpenAI's GPT-4o and DALL·E 3 to generate an image and text. | | [FFmpeg video processing](/examples/ffmpeg-video-processing) | Use FFmpeg to process a video in various ways and save it to Cloudflare R2. | | [OpenAI with retrying](/examples/open-ai-with-retrying) | Create a reusable OpenAI task with custom retry options. | +| [PDF to image](/examples/pdf-to-image) | Use `MuPDF` to turn a PDF into images and save them to Cloudflare R2. | | [React to PDF](/examples/react-pdf) | Use `react-pdf` to generate a PDF and save it to Cloudflare R2. | | [Resend email sequence](/examples/resend-email-sequence) | Send a sequence of emails over several days using Resend with Trigger.dev. | | [Sharp image processing](/examples/sharp-image-processing) | Use Sharp to process an image and save it to Cloudflare R2. | diff --git a/docs/examples/pdf-to-image.mdx b/docs/examples/pdf-to-image.mdx new file mode 100644 index 000000000..62398c8d4 --- /dev/null +++ b/docs/examples/pdf-to-image.mdx @@ -0,0 +1,84 @@ +--- +title: "Turn a PDF into an image using MuPDF" +sidebarTitle: "PDF to image" +description: "This example will show you how to turn a PDF into an image using MuPDF and Trigger.dev." +--- + +## Overview + +This example demonstrates how to use Trigger.dev to turn a PDF into a series of images using MuPDF and upload them to Cloudflare R2. + +## Task code + +```ts trigger/pdfToImage.ts +import { logger, task } from "@trigger.dev/sdk/v3"; +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { execSync } from "child_process"; +import fs from "fs"; +import path from "path"; + +// Initialize S3 client +const s3Client = new S3Client({ + region: "auto", + endpoint: process.env.S3_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const pdfToImage = task({ + id: "pdf-to-image", + run: async (payload: { pdfUrl: string; documentId: string }) => { + logger.log("Converting PDF to images", payload); + + const pdfPath = `/tmp/${payload.documentId}.pdf`; + const outputDir = `/tmp/${payload.documentId}`; + + // Download PDF and convert to images using MuPDF + execSync(`curl -s -o ${pdfPath} ${payload.pdfUrl}`); + fs.mkdirSync(outputDir, { recursive: true }); + execSync(`mutool convert -o ${outputDir}/page-%d.png ${pdfPath}`); + + // Upload images to R2 + const uploadedUrls = []; + for (const file of fs.readdirSync(outputDir)) { + const s3Key = `images/${payload.documentId}/${file}`; + const uploadParams = { + Bucket: process.env.S3_BUCKET, + Key: s3Key, + Body: fs.readFileSync(path.join(outputDir, file)), + ContentType: "image/png", + }; + + logger.log("Uploading to R2", uploadParams); + + await s3Client.send(new PutObjectCommand(uploadParams)); + const s3Url = `https://${process.env.S3_BUCKET}.r2.cloudflarestorage.com/${s3Key}`; + uploadedUrls.push(s3Url); + logger.log("Image uploaded to R2", { url: s3Url }); + } + + // Clean up + fs.rmSync(outputDir, { recursive: true, force: true }); + fs.unlinkSync(pdfPath); + + logger.log("All images uploaded to R2", { urls: uploadedUrls }); + + return { + imageUrls: uploadedUrls, + }; + }, +}); +``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "pdfUrl": "https://pdfobject.com/pdf/sample.pdf", + "documentId": "unique-document-id" +} +``` diff --git a/docs/mint.json b/docs/mint.json index 2521f8ec9..1c7c35cb5 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -277,6 +277,7 @@ "examples/dall-e3-generate-image", "examples/ffmpeg-video-processing", "examples/open-ai-with-retrying", + "examples/pdf-to-image", "examples/sharp-image-processing", "examples/react-pdf", "examples/resend-email-sequence", From 3dd303bd5b3d90e8cdddaaf6ef399b5c66403c99 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 17:29:09 +0100 Subject: [PATCH 42/55] Added build config section to pdf-to-image doc example --- docs/examples/pdf-to-image.mdx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/examples/pdf-to-image.mdx b/docs/examples/pdf-to-image.mdx index 62398c8d4..f48fe1156 100644 --- a/docs/examples/pdf-to-image.mdx +++ b/docs/examples/pdf-to-image.mdx @@ -8,6 +8,20 @@ description: "This example will show you how to turn a PDF into an image using M This example demonstrates how to use Trigger.dev to turn a PDF into a series of images using MuPDF and upload them to Cloudflare R2. +## Update your build configuration + +To use this example, add these build settings to your `trigger.config.ts` file: + +```ts trigger.config.ts +export default defineConfig({ + project: "", + // Your other config settings... + build: { + extensions: [aptGet({ packages: ["mupdf-tools", "curl"] })], + }, +}); +``` + ## Task code ```ts trigger/pdfToImage.ts From 6976311e18d6993738f2043a2441ba21c6ff3ecd Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Fri, 20 Sep 2024 08:57:09 +0100 Subject: [PATCH 43/55] Improved the copy to link to aptGet and explain adding deployed packages --- docs/examples/pdf-to-image.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/pdf-to-image.mdx b/docs/examples/pdf-to-image.mdx index f48fe1156..13742667c 100644 --- a/docs/examples/pdf-to-image.mdx +++ b/docs/examples/pdf-to-image.mdx @@ -10,7 +10,7 @@ This example demonstrates how to use Trigger.dev to turn a PDF into a series of ## Update your build configuration -To use this example, add these build settings to your `trigger.config.ts` file: +To use this example, add these build settings below to your `trigger.config.ts` file. They ensure that the `mutool` and `curl` packages are installed when you deploy your task. You can learn more about this and see more build settings [here](/config/config-file#aptget). ```ts trigger.config.ts export default defineConfig({ From ba3c5bdf33b2396bb9e511e567d5805d0d880e64 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 20 Sep 2024 11:09:00 +0100 Subject: [PATCH 44/55] Adding missing task run hierarchy to TaskRun table (#1332) * Add task run hierarchical relationships to the database * Add depth and related runs to the retrieve run API response * Remove prisma optimize * restructure the migrations to create the index concurrently * Delete these tsbuildinfo files * Fix type error by adding depth to the run list presenter * Cleanup the task hierarchy, share more code * Remove some fields from the list run response --- .../app/components/runs/v3/RunInspector.tsx | 4 + apps/webapp/app/db.server.ts | 42 ++-- .../v3/ApiRetrieveRunPresenter.server.ts | 131 ++++++++++-- .../v3/ApiRunListPresenter.server.ts | 1 + .../presenters/v3/RunListPresenter.server.ts | 3 + .../app/presenters/v3/SpanPresenter.server.ts | 1 + .../route.tsx | 8 + .../v3/services/batchTriggerTask.server.ts | 1 + .../app/v3/services/triggerTask.server.ts | 67 ++++++ apps/webapp/package.json | 2 +- docs/v3-openapi.yaml | 197 +++++++++++------- packages/build/tsconfig.src.tsbuildinfo | 1 - packages/cli-v3/tsconfig.src.tsbuildinfo | 1 - packages/core/src/v3/schemas/api.ts | 23 ++ packages/core/tsconfig.src.tsbuildinfo | 1 - .../migration.sql | 19 ++ .../migration.sql | 2 + packages/database/prisma/schema.prisma | 36 +++- packages/trigger-sdk/src/v3/shared.ts | 2 + pnpm-lock.yaml | 7 +- .../v3-catalog/src/trigger/taskHierarchy.ts | 101 +++++++++ 21 files changed, 518 insertions(+), 132 deletions(-) delete mode 100644 packages/build/tsconfig.src.tsbuildinfo delete mode 100644 packages/cli-v3/tsconfig.src.tsbuildinfo delete mode 100644 packages/core/tsconfig.src.tsbuildinfo create mode 100644 packages/database/prisma/migrations/20240920085046_add_task_hierarchy_columns_without_parent_task_run_id_index/migration.sql create mode 100644 packages/database/prisma/migrations/20240920085226_add_parent_task_run_id_index_concurrently/migration.sql create mode 100644 references/v3-catalog/src/trigger/taskHierarchy.ts diff --git a/apps/webapp/app/components/runs/v3/RunInspector.tsx b/apps/webapp/app/components/runs/v3/RunInspector.tsx index 62508edaf..e057b9426 100644 --- a/apps/webapp/app/components/runs/v3/RunInspector.tsx +++ b/apps/webapp/app/components/runs/v3/RunInspector.tsx @@ -354,6 +354,10 @@ export function RunInspector({ : "–"} + + Run ID + {run.id} +
) : tab === "context" ? ( diff --git a/apps/webapp/app/db.server.ts b/apps/webapp/app/db.server.ts index 5aa24b3a0..8af02c789 100644 --- a/apps/webapp/app/db.server.ts +++ b/apps/webapp/app/db.server.ts @@ -1,10 +1,10 @@ -import { PrismaClient, Prisma } from "@trigger.dev/database"; +import { Prisma, PrismaClient } from "@trigger.dev/database"; import invariant from "tiny-invariant"; import { z } from "zod"; -import { logger } from "./services/logger.server"; import { env } from "./env.server"; -import { singleton } from "./utils/singleton"; +import { logger } from "./services/logger.server"; import { isValidDatabaseUrl } from "./utils/db"; +import { singleton } from "./utils/singleton"; export type PrismaTransactionClient = Omit< PrismaClient, @@ -94,6 +94,7 @@ function getClient() { url: databaseUrl.href, }, }, + // @ts-expect-error log: [ { emit: "stdout", @@ -107,25 +108,16 @@ function getClient() { emit: "stdout", level: "warn", }, - // { - // emit: "stdout", - // level: "query", - // }, - // { - // emit: "event", - // level: "query", - // }, - ], + ].concat( + process.env.VERBOSE_PRISMA_LOGS === "1" + ? [ + { emit: "event", level: "query" }, + { emit: "stdout", level: "query" }, + ] + : [] + ), }); - // client.$on("query", (e) => { - // console.log(`Query tooks ${e.duration}ms`, { - // query: e.query, - // params: e.params, - // duration: e.duration, - // }); - // }); - // connect eagerly client.$connect(); @@ -153,6 +145,7 @@ function getReplicaClient() { url: replicaUrl.href, }, }, + // @ts-expect-error log: [ { emit: "stdout", @@ -166,7 +159,14 @@ function getReplicaClient() { emit: "stdout", level: "warn", }, - ], + ].concat( + process.env.VERBOSE_PRISMA_LOGS === "1" + ? [ + { emit: "event", level: "query" }, + { emit: "stdout", level: "query" }, + ] + : [] + ), }); // connect eagerly diff --git a/apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts b/apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts index e97ceb949..24ea519b1 100644 --- a/apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts @@ -4,6 +4,7 @@ import { RunStatus, SerializedError, TaskRunError, + TriggerFunction, conditionallyImportPacket, createJsonErrorObject, logger, @@ -14,6 +15,47 @@ import assertNever from "assert-never"; import { AuthenticatedEnvironment } from "~/services/apiAuth.server"; import { generatePresignedUrl } from "~/v3/r2.server"; import { BasePresenter } from "./basePresenter.server"; +import { prisma } from "~/db.server"; + +// Build 'select' object +const commonRunSelect = { + id: true, + friendlyId: true, + status: true, + taskIdentifier: true, + createdAt: true, + startedAt: true, + updatedAt: true, + completedAt: true, + expiredAt: true, + delayUntil: true, + ttl: true, + tags: true, + costInCents: true, + baseCostInCents: true, + usageDurationMs: true, + idempotencyKey: true, + isTest: true, + depth: true, + lockedToVersion: { + select: { + version: true, + }, + }, + resumeParentOnCompletion: true, + batch: { + select: { + id: true, + friendlyId: true, + }, + }, +} satisfies Prisma.TaskRunSelect; + +type CommonRelatedRun = Prisma.Result< + typeof prisma.taskRun, + { select: typeof commonRunSelect }, + "findFirstOrThrow" +>; export class ApiRetrieveRunPresenter extends BasePresenter { public async call( @@ -22,7 +64,7 @@ export class ApiRetrieveRunPresenter extends BasePresenter { showSecretDetails: boolean ): Promise { return this.traceWithEnv("call", env, async (span) => { - const taskRun = await this._prisma.taskRun.findUnique({ + const taskRun = await this._replica.taskRun.findFirst({ where: { friendlyId, runtimeEnvironmentId: env.id, @@ -36,6 +78,23 @@ export class ApiRetrieveRunPresenter extends BasePresenter { lockedToVersion: true, schedule: true, tags: true, + batch: { + select: { + id: true, + friendlyId: true, + }, + }, + parentTaskRun: { + select: commonRunSelect, + }, + rootTaskRun: { + select: commonRunSelect, + }, + childRuns: { + select: { + ...commonRunSelect, + }, + }, }, }); @@ -101,29 +160,11 @@ export class ApiRetrieveRunPresenter extends BasePresenter { const apiStatus = ApiRetrieveRunPresenter.apiStatusFromRunStatus(taskRun.status); return { - id: taskRun.friendlyId, - status: apiStatus, - taskIdentifier: taskRun.taskIdentifier, - idempotencyKey: taskRun.idempotencyKey ?? undefined, - version: taskRun.lockedToVersion ? taskRun.lockedToVersion.version : undefined, - createdAt: taskRun.createdAt ?? undefined, - updatedAt: taskRun.updatedAt ?? undefined, - startedAt: taskRun.startedAt ?? taskRun.lockedAt ?? undefined, - finishedAt: ApiRetrieveRunPresenter.isStatusFinished(apiStatus) - ? taskRun.updatedAt - : undefined, - delayedUntil: taskRun.delayUntil ?? undefined, + ...createCommonRunStructure(taskRun), payload: $payload, payloadPresignedUrl: $payloadPresignedUrl, output: $output, outputPresignedUrl: $outputPresignedUrl, - isTest: taskRun.isTest, - ttl: taskRun.ttl ?? undefined, - expiredAt: taskRun.expiredAt ?? undefined, - tags: taskRun.tags.map((t) => t.name).sort((a, b) => a.localeCompare(b)), - costInCents: taskRun.costInCents, - baseCostInCents: taskRun.baseCostInCents, - durationMs: taskRun.usageDurationMs, schedule: taskRun.schedule ? { id: taskRun.schedule.friendlyId, @@ -138,7 +179,6 @@ export class ApiRetrieveRunPresenter extends BasePresenter { }, } : undefined, - ...ApiRetrieveRunPresenter.apiBooleanHelpersFromRunStatus(apiStatus), attempts: !showSecretDetails ? [] : taskRun.attempts.map((a) => ({ @@ -150,6 +190,13 @@ export class ApiRetrieveRunPresenter extends BasePresenter { completedAt: a.completedAt ?? undefined, error: ApiRetrieveRunPresenter.apiErrorFromError(a.error), })), + relatedRuns: { + root: taskRun.rootTaskRun ? createCommonRunStructure(taskRun.rootTaskRun) : undefined, + parent: taskRun.parentTaskRun + ? createCommonRunStructure(taskRun.parentTaskRun) + : undefined, + children: taskRun.childRuns.map((r) => createCommonRunStructure(r)), + }, }; }); } @@ -225,6 +272,12 @@ export class ApiRetrieveRunPresenter extends BasePresenter { } } + static apiBooleanHelpersFromTaskRunStatus(status: TaskRunStatus) { + return ApiRetrieveRunPresenter.apiBooleanHelpersFromRunStatus( + ApiRetrieveRunPresenter.apiStatusFromRunStatus(status) + ); + } + static apiBooleanHelpersFromRunStatus(status: RunStatus) { const isQueued = status === "QUEUED" || status === "WAITING_FOR_DEPLOY" || status === "DELAYED"; const isExecuting = status === "EXECUTING" || status === "REATTEMPTING" || status === "FROZEN"; @@ -275,3 +328,39 @@ export class ApiRetrieveRunPresenter extends BasePresenter { } } } + +function createCommonRunStructure(run: CommonRelatedRun) { + return { + id: run.friendlyId, + taskIdentifier: run.taskIdentifier, + idempotencyKey: run.idempotencyKey ?? undefined, + version: run.lockedToVersion?.version, + status: ApiRetrieveRunPresenter.apiStatusFromRunStatus(run.status), + createdAt: run.createdAt, + startedAt: run.startedAt ?? undefined, + updatedAt: run.updatedAt, + finishedAt: run.completedAt ?? undefined, + expiredAt: run.expiredAt ?? undefined, + delayedUntil: run.delayUntil ?? undefined, + ttl: run.ttl ?? undefined, + costInCents: run.costInCents, + baseCostInCents: run.baseCostInCents, + durationMs: run.usageDurationMs, + isTest: run.isTest, + depth: run.depth, + tags: run.tags + .map((t: { name: string }) => t.name) + .sort((a: string, b: string) => a.localeCompare(b)), + ...ApiRetrieveRunPresenter.apiBooleanHelpersFromTaskRunStatus(run.status), + triggerFunction: resolveTriggerFunction(run), + batchId: run.batch?.friendlyId, + }; +} + +function resolveTriggerFunction(run: CommonRelatedRun): TriggerFunction { + if (run.batch) { + return run.resumeParentOnCompletion ? "batchTriggerAndWait" : "batchTrigger"; + } else { + return run.resumeParentOnCompletion ? "triggerAndWait" : "trigger"; + } +} diff --git a/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts b/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts index ac504c653..9d87918ba 100644 --- a/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ApiRunListPresenter.server.ts @@ -253,6 +253,7 @@ export class ApiRunListPresenter extends BasePresenter { costInCents: run.costInCents, baseCostInCents: run.baseCostInCents, durationMs: run.usageDurationMs, + depth: run.depth, ...ApiRetrieveRunPresenter.apiBooleanHelpersFromRunStatus( ApiRetrieveRunPresenter.apiStatusFromRunStatus(run.status) ), diff --git a/apps/webapp/app/presenters/v3/RunListPresenter.server.ts b/apps/webapp/app/presenters/v3/RunListPresenter.server.ts index 9ce94f9d0..cea8ca623 100644 --- a/apps/webapp/app/presenters/v3/RunListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/RunListPresenter.server.ts @@ -167,6 +167,7 @@ export class RunListPresenter extends BasePresenter { baseCostInCents: number; usageDurationMs: BigInt; tags: string[]; + depth: number; }[] >` SELECT @@ -190,6 +191,7 @@ export class RunListPresenter extends BasePresenter { tr."baseCostInCents" AS "baseCostInCents", tr."costInCents" AS "costInCents", tr."usageDurationMs" AS "usageDurationMs", + tr."depth" AS "depth", array_remove(array_agg(tag.name), NULL) AS "tags" FROM ${sqlDatabaseSchema}."TaskRun" tr @@ -333,6 +335,7 @@ WHERE baseCostInCents: run.baseCostInCents, usageDurationMs: Number(run.usageDurationMs), tags: run.tags.sort((a, b) => a.localeCompare(b)), + depth: run.depth, }; }), pagination: { diff --git a/apps/webapp/app/presenters/v3/SpanPresenter.server.ts b/apps/webapp/app/presenters/v3/SpanPresenter.server.ts index 26400dce4..7fbcd7a7a 100644 --- a/apps/webapp/app/presenters/v3/SpanPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/SpanPresenter.server.ts @@ -229,6 +229,7 @@ export class SpanPresenter extends BasePresenter { }; return { + id: run.id, friendlyId: run.friendlyId, status: run.status, createdAt: run.createdAt, diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam.spans.$spanParam/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam.spans.$spanParam/route.tsx index 7c9ad1de3..5c2e51fc1 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam.spans.$spanParam/route.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam.spans.$spanParam/route.tsx @@ -593,6 +593,14 @@ function RunBody({ : "–"} + + Run ID + {run.friendlyId} + + + Internal ID + {run.id} +
) : tab === "context" ? ( diff --git a/apps/webapp/app/v3/services/batchTriggerTask.server.ts b/apps/webapp/app/v3/services/batchTriggerTask.server.ts index 440be5d8e..fc5874bd4 100644 --- a/apps/webapp/app/v3/services/batchTriggerTask.server.ts +++ b/apps/webapp/app/v3/services/batchTriggerTask.server.ts @@ -113,6 +113,7 @@ export class BatchTriggerTaskService extends BaseService { options: { ...item.options, dependentBatch: dependentAttempt?.id ? batch.friendlyId : undefined, // Only set dependentBatch if dependentAttempt is set which means batchTriggerAndWait was called + parentBatch: dependentAttempt?.id ? undefined : batch.friendlyId, // Only set parentBatch if dependentAttempt is NOT set which means batchTrigger was called }, }, { diff --git a/apps/webapp/app/v3/services/triggerTask.server.ts b/apps/webapp/app/v3/services/triggerTask.server.ts index 289eecca5..01cdbed3b 100644 --- a/apps/webapp/app/v3/services/triggerTask.server.ts +++ b/apps/webapp/app/v3/services/triggerTask.server.ts @@ -108,6 +108,8 @@ export class TriggerTaskService extends BaseService { id: true, status: true, taskIdentifier: true, + rootTaskRunId: true, + depth: true, }, }, }, @@ -134,6 +136,23 @@ export class TriggerTaskService extends BaseService { } } + const parentAttempt = body.options?.parentAttempt + ? await this._prisma.taskRunAttempt.findUnique({ + where: { friendlyId: body.options.parentAttempt }, + include: { + taskRun: { + select: { + id: true, + status: true, + taskIdentifier: true, + rootTaskRunId: true, + depth: true, + }, + }, + }, + }) + : undefined; + const dependentBatchRun = body.options?.dependentBatch ? await this._prisma.batchTaskRun.findUnique({ where: { friendlyId: body.options.dependentBatch }, @@ -145,6 +164,8 @@ export class TriggerTaskService extends BaseService { id: true, status: true, taskIdentifier: true, + rootTaskRunId: true, + depth: true, }, }, }, @@ -176,6 +197,26 @@ export class TriggerTaskService extends BaseService { } } + const parentBatchRun = body.options?.parentBatch + ? await this._prisma.batchTaskRun.findUnique({ + where: { friendlyId: body.options.parentBatch }, + include: { + dependentTaskAttempt: { + include: { + taskRun: { + select: { + id: true, + status: true, + taskIdentifier: true, + rootTaskRunId: true, + }, + }, + }, + }, + }, + }) + : undefined; + return await eventRepository.traceEvent( taskId, { @@ -243,6 +284,14 @@ export class TriggerTaskService extends BaseService { } } + const depth = dependentAttempt + ? dependentAttempt.taskRun.depth + 1 + : parentAttempt + ? parentAttempt.taskRun.depth + 1 + : dependentBatchRun?.dependentTaskAttempt + ? dependentBatchRun.dependentTaskAttempt.taskRun.depth + 1 + : 0; + const taskRun = await tx.taskRun.create({ data: { status: delayUntil ? "DELAYED" : "PENDING", @@ -272,6 +321,24 @@ export class TriggerTaskService extends BaseService { : { connect: tagIds.map((id) => ({ id })), }, + parentTaskRunId: + dependentAttempt?.taskRun.id ?? + parentAttempt?.taskRun.id ?? + dependentBatchRun?.dependentTaskAttempt?.taskRun.id, + parentTaskRunAttemptId: + dependentAttempt?.id ?? + parentAttempt?.id ?? + dependentBatchRun?.dependentTaskAttempt?.id, + rootTaskRunId: + dependentAttempt?.taskRun.rootTaskRunId ?? + dependentAttempt?.taskRun.id ?? + parentAttempt?.taskRun.rootTaskRunId ?? + parentAttempt?.taskRun.id ?? + dependentBatchRun?.dependentTaskAttempt?.taskRun.rootTaskRunId ?? + dependentBatchRun?.dependentTaskAttempt?.taskRun.id, + batchId: dependentBatchRun?.id ?? parentBatchRun?.id, + resumeParentOnCompletion: !!(dependentAttempt ?? dependentBatchRun), + depth, }, }); diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 7315e294b..553d12c73 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -247,4 +247,4 @@ "engines": { "node": ">=16.0.0" } -} +} \ No newline at end of file diff --git a/docs/v3-openapi.yaml b/docs/v3-openapi.yaml index 505a4afbc..2e141bb2d 100644 --- a/docs/v3-openapi.yaml +++ b/docs/v3-openapi.yaml @@ -1821,7 +1821,7 @@ components: format: date-time description: The Date to delay the run until, e.g. `new Date()` or `"2024-06-25T15:45:26Z"` example: 2024-06-25T15:45:26Z - RetrieveRunResponse: + CommonRunObject: type: object required: - id @@ -1829,7 +1829,6 @@ components: - taskIdentifier - createdAt - updatedAt - - attempts properties: id: type: string @@ -1859,22 +1858,6 @@ components: type: string example: 20240523.1 description: The version of the worker that executed the run - payload: - type: object - description: The payload that was sent to the task. Will be omitted if the request was made with a Public API key - example: { "foo": "bar" } - payloadPresignedUrl: - type: string - description: The presigned URL to download the payload. Will only be included if the payload is too large to be included in the response. Expires in 5 minutes. - example: "https://r2.cloudflarestorage.com/packets/yubjwjsfkxnylobaqvqz/dev/run_p4omhh45hgxxnq1re6ovy/payload.json?X-Amz-Expires=300&X-Amz-Date=20240625T154526Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=10b064e58a0680db5b5e077be2be3b2a%2F20240625%2Fauto%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=88604cb993ffc151b4d73f2439da431d9928488e4b3dcfa4a7c8f1819" - output: - type: object - description: The output of the run. Will be omitted if the request was made with a Public API key - example: { "foo": "bar" } - outputPresignedUrl: - type: string - description: The presigned URL to download the output. Will only be included if the output is too large to be included in the response. Expires in 5 minutes. - example: "https://r2.cloudflarestorage.com/packets/yubjwjsfkxnylobaqvqz/dev/run_p4omhh45hgxxnq1re6ovy/payload.json?X-Amz-Expires=300&X-Amz-Date=20240625T154526Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=10b064e58a0680db5b5e077be2be3b2a%2F20240625%2Fauto%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=88604cb993ffc151b4d73f2439da431d9928488e4b3dcfa4a7c8f1819" idempotencyKey: type: string description: The idempotency key used to prevent creating duplicate runs, if provided @@ -1926,77 +1909,131 @@ components: type: number example: 491 description: The duration of compute (so far) in milliseconds. This does not include waits. - schedule: - type: object - description: The schedule that triggered the run. Will be omitted if the run was not triggered by a schedule + depth: + type: integer + example: 0 + description: The depth of the run in the task run hierarchy. The root run has a depth of 0. + batchId: + type: string + description: The ID of the batch that this run belongs to + example: batch_1234 + triggerFunction: + type: string + description: The name of the function that triggered the run + enum: + - trigger + - triggerAndWait + - batchTrigger + - batchTriggerAndWait + + RetrieveRunResponse: + allOf: + - $ref: "#/components/schemas/CommonRunObject" + - type: object required: - - id - - generator + - attempts properties: - id: + payload: + type: object + description: The payload that was sent to the task. Will be omitted if the request was made with a Public API key + example: { "foo": "bar" } + payloadPresignedUrl: type: string - description: The unique ID of the schedule, prefixed with `sched_` - example: sched_1234 - externalId: + description: The presigned URL to download the payload. Will only be included if the payload is too large to be included in the response. Expires in 5 minutes. + example: "https://r2.cloudflarestorage.com/packets/yubjwjsfkxnylobaqvqz/dev/run_p4omhh45hgxxnq1re6ovy/payload.json?X-Amz-Expires=300&X-Amz-Date=20240625T154526Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=10b064e58a0680db5b5e077be2be3b2a%2F20240625%2Fauto%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=88604cb993ffc151b4d73f2439da431d9928488e4b3dcfa4a7c8f1819" + output: + type: object + description: The output of the run. Will be omitted if the request was made with a Public API key + example: { "foo": "bar" } + outputPresignedUrl: type: string - description: The external ID of the schedule. Can be anything that is useful to you (e.g., user ID, org ID, etc.) - example: user_1234 - deduplicationKey: - type: string - description: The deduplication key used to prevent creating duplicate schedules - example: dedup_key_1234 - generator: + description: The presigned URL to download the output. Will only be included if the output is too large to be included in the response. Expires in 5 minutes. + example: "https://r2.cloudflarestorage.com/packets/yubjwjsfkxnylobaqvqz/dev/run_p4omhh45hgxxnq1re6ovy/payload.json?X-Amz-Expires=300&X-Amz-Date=20240625T154526Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=10b064e58a0680db5b5e077be2be3b2a%2F20240625%2Fauto%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=88604cb993ffc151b4d73f2439da431d9928488e4b3dcfa4a7c8f1819" + relatedRuns: type: object properties: - type: + root: + $ref: "#/components/schemas/CommonRunObject" + description: The root run of the run hierarchy. Will be omitted if the run is the root run + parent: + $ref: "#/components/schemas/CommonRunObject" + description: The parent run of the run. Will be omitted if the run is the root run + children: + description: The immediate children of the run. Will be omitted if the run has no children + type: array + items: + $ref: "#/components/schemas/CommonRunObject" + schedule: + type: object + description: The schedule that triggered the run. Will be omitted if the run was not triggered by a schedule + required: + - id + - generator + properties: + id: type: string - enum: - - CRON - expression: + description: The unique ID of the schedule, prefixed with `sched_` + example: sched_1234 + externalId: type: string - description: The cron expression used to generate the schedule - example: 0 0 * * * - description: + description: The external ID of the schedule. Can be anything that is useful to you (e.g., user ID, org ID, etc.) + example: user_1234 + deduplicationKey: type: string - description: The description of the generator in plain english - example: Every day at midnight - attempts: - type: array - items: - type: object - required: - - id - - status - - createdAt - - updatedAt - properties: - id: - type: string - description: The unique ID of the attempt, prefixed with `attempt_` - example: attempt_1234 - status: - type: string - enum: - - PENDING - - EXECUTING - - PAUSED - - COMPLETED - - FAILED - - CANCELED - error: - $ref: "#/components/schemas/SerializedError" - createdAt: - type: string - format: date-time - updatedAt: - type: string - format: date-time - startedAt: - type: string - format: date-time - completedAt: - type: string - format: date-time + description: The deduplication key used to prevent creating duplicate schedules + example: dedup_key_1234 + generator: + type: object + properties: + type: + type: string + enum: + - CRON + expression: + type: string + description: The cron expression used to generate the schedule + example: 0 0 * * * + description: + type: string + description: The description of the generator in plain english + example: Every day at midnight + attempts: + type: array + items: + type: object + required: + - id + - status + - createdAt + - updatedAt + properties: + id: + type: string + description: The unique ID of the attempt, prefixed with `attempt_` + example: attempt_1234 + status: + type: string + enum: + - PENDING + - EXECUTING + - PAUSED + - COMPLETED + - FAILED + - CANCELED + error: + $ref: "#/components/schemas/SerializedError" + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + startedAt: + type: string + format: date-time + completedAt: + type: string + format: date-time CreateScheduleOptions: type: object properties: diff --git a/packages/build/tsconfig.src.tsbuildinfo b/packages/build/tsconfig.src.tsbuildinfo deleted file mode 100644 index 08439d82d..000000000 --- a/packages/build/tsconfig.src.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/index.ts","./src/version.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/exception.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consolelogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/observableresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/metric.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/noopmeter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/textmappropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_state.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/link.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spanoptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_options.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_provider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/samplingresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/typealiases.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/util.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/zoderror.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/locales/en.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/errors.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/parseutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/enumutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/errorutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/partialutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/types.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/external.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/index.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/index.d.ts","../core/src/v3/schemas/tokens.ts","../core/src/v3/types/utils.ts","../core/src/v3/types/index.ts","../core/src/v3/schemas/common.ts","../core/src/v3/schemas/schemas.ts","../core/src/v3/schemas/resources.ts","../core/src/v3/schemas/api.ts","../core/src/v3/schemas/config.ts","../core/src/v3/schemas/build.ts","../core/src/v3/schemas/messages.ts","../core/src/v3/schemas/style.ts","../core/src/v3/schemas/eventfilter.ts","../core/src/v3/schemas/fetch.ts","../core/src/v3/schemas/opentelemetry.ts","../core/src/v3/schemas/index.ts","../core/src/v3/apiclientmanager/types.ts","../core/src/v3/clock/clock.ts","../core/src/v3/runtime/manager.ts","../core/src/v3/task-catalog/catalog.ts","../core/src/v3/taskcontext/types.ts","../core/src/v3/usage/types.ts","../core/src/v3/utils/platform.ts","../core/src/v3/utils/globals.ts","../core/src/v3/semanticinternalattributes.ts","../core/src/v3/taskcontext/index.ts","../core/src/v3/task-context-api.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/validationerror.d.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/index.d.ts","../core/src/types.ts","../core/src/schemas/addmissingversionfield.ts","../core/src/schemas/errors.ts","../core/src/schemas/eventfilter.ts","../core/src/schemas/integrations.ts","../core/src/schemas/json.ts","../core/src/schemas/properties.ts","../core/src/schemas/schedules.ts","../core/src/schemas/tasks.ts","../core/src/schemas/triggers.ts","../core/src/schemas/statuses.ts","../core/src/schemas/runs.ts","../core/src/schemas/requestfilter.ts","../core/src/schemas/api.ts","../core/src/schemas/notifications.ts","../core/src/schemas/fetch.ts","../core/src/schemas/events.ts","../core/src/schemas/request.ts","../core/src/schemas/jobs.ts","../core/src/schemas/index.ts","../core/src/retry.ts","../core/src/v3/utils/retries.ts","../core/src/v3/apiclient/errors.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/anyvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggeroptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooplogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooploggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/index.d.ts","../../node_modules/.pnpm/@google-cloud+precise-date@4.0.0/node_modules/@google-cloud/precise-date/build/src/index.d.ts","../core/src/v3/clock/simpleclock.ts","../core/src/v3/clock/index.ts","../core/src/v3/clock-api.ts","../core/src/v3/usage/noopusagemanager.ts","../core/src/v3/usage/api.ts","../core/src/v3/usage-api.ts","../core/src/v3/tracer.ts","../core/src/v3/utils/flattenattributes.ts","../core/src/v3/utils/styleattributes.ts","../core/src/v3/apiclient/pagination.ts","../core/src/v3/apiclient/core.ts","../core/src/v3/apiclient/types.ts","../core/src/version.ts","../core/src/v3/apiclient/index.ts","../core/src/v3/errors.ts","../core/src/v3/limits.ts","../core/src/v3/icons.ts","../core/src/v3/logger/tasklogger.ts","../core/src/v3/logger/index.ts","../core/src/v3/logger-api.ts","../core/src/v3/runtime/noopruntimemanager.ts","../core/src/v3/runtime/index.ts","../core/src/v3/runtime-api.ts","../core/src/v3/utils/getenv.ts","../core/src/v3/apiclientmanager/index.ts","../core/src/v3/apiclientmanager-api.ts","../core/src/v3/task-catalog/nooptaskcatalog.ts","../core/src/v3/task-catalog/index.ts","../core/src/v3/task-catalog-api.ts","../../node_modules/.pnpm/@types+humanize-duration@3.27.1/node_modules/@types/humanize-duration/index.d.ts","../core/src/v3/utils/durations.ts","../core/src/eventfiltermatches.ts","../core/src/v3/utils/omit.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/transformer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/plainer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/types.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/class-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/custom-transformer-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/index.d.ts","../core/src/v3/utils/ioserialization.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types_internal.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/autoloader.d.ts","../../node_modules/.pnpm/@types+shimmer@1.0.2/node_modules/@types/shimmer/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/normalize.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemoduledefinition.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemodulefile.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/index.d.ts","../../node_modules/.pnpm/esbuild@0.23.0/node_modules/esbuild/lib/main.d.ts","../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-record.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-equal-considering-writability.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-fully-writable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-undefinable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-modify.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/unreachable-case-error/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/assert/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/create-factory-with-constraint/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/is-exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/noop/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/index.d.ts","../core/src/v3/build/resolvedconfig.ts","../core/src/v3/build/extensions.ts","../core/src/v3/config.ts","../core/src/v3/index.ts","../core/src/v3/build/runtime.ts","../core/src/v3/build/index.ts","./src/extensions/audiowaveform.ts","../../node_modules/.pnpm/tinyglobby@0.2.2/node_modules/tinyglobby/dist/index.d.mts","./src/extensions/core/additionalfiles.ts","../../node_modules/.pnpm/mlly@1.7.1/node_modules/mlly/dist/index.d.ts","../../node_modules/.pnpm/typescript@5.3.3/node_modules/typescript/lib/typescript.d.ts","../../node_modules/.pnpm/pkg-types@1.1.3/node_modules/pkg-types/dist/index.d.ts","./src/extensions/core/additionalpackages.ts","./src/extensions/core/syncenvvars.ts","./src/extensions/core.ts","./src/extensions/index.ts","./src/extensions/prisma.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/typescript.d.ts","./src/extensions/typescript.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.global.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9b81b5fe6648739c1669492b21a34740027fb58fd4baae9a8eaec71601106168","impliedFormat":99},{"version":"1af39e6ade8c28757c5bc04483f06ec60743edea296a75aac2bb14555f09308d","impliedFormat":99},{"version":"a4e9e0d92dcad2cb387a5f1bdffe621569052f2d80186e11973aa7080260d296","impliedFormat":1},{"version":"f6380cc36fc3efc70084d288d0a05d0a2e09da012ee3853f9d62431e7216f129","impliedFormat":1},{"version":"497c3e541b4acf6c5d5ba75b03569cfe5fe25c8a87e6c87f1af98da6a3e7b918","impliedFormat":1},{"version":"d9429b81edf2fb2abf1e81e9c2e92615f596ed3166673d9b69b84c369b15fdc0","impliedFormat":1},{"version":"7e22943ae4e474854ca0695ab750a8026f55bb94278331fda02a4fb42efce063","impliedFormat":1},{"version":"7da9ff3d9a7e62ddca6393a23e67296ab88f2fcb94ee5f7fb977fa8e478852ac","impliedFormat":1},{"version":"e1b45cc21ea200308cbc8abae2fb0cfd014cb5b0e1d1643bcc50afa5959b6d83","impliedFormat":1},{"version":"c9740b0ce7533ce6ba21a7d424e38d2736acdddeab2b1a814c00396e62cc2f10","impliedFormat":1},{"version":"b3c1f6a3fdbb04c6b244de6d5772ffdd9e962a2faea1440e410049c13e874b87","impliedFormat":1},{"version":"dcaa872d9b52b9409979170734bdfd38f846c32114d05b70640fd05140b171bb","impliedFormat":1},{"version":"6c434d20da381fcd2e8b924a3ec9b8653cf8bed8e0da648e91f4c984bd2a5a91","impliedFormat":1},{"version":"992419d044caf6b14946fa7b9463819ab2eeb7af7c04919cc2087ce354c92266","impliedFormat":1},{"version":"fa9815e9ce1330289a5c0192e2e91eb6178c0caa83c19fe0c6a9f67013fe795c","impliedFormat":1},{"version":"06384a1a73fcf4524952ecd0d6b63171c5d41dd23573907a91ef0a687ddb4a8c","impliedFormat":1},{"version":"34b1594ecf1c84bcc7a04d9f583afa6345a6fea27a52cf2685f802629219de45","impliedFormat":1},{"version":"d82c9ca830d7b94b7530a2c5819064d8255b93dfeddc5b2ebb8a09316f002c89","impliedFormat":1},{"version":"7e046b9634add57e512412a7881efbc14d44d1c65eadd35432412aa564537975","impliedFormat":1},{"version":"aac9079b9e2b5180036f27ab37cb3cf4fd19955be48ccc82eab3f092ee3d4026","impliedFormat":1},{"version":"3d9c38933bc69e0a885da20f019de441a3b5433ce041ba5b9d3a541db4b568cb","impliedFormat":1},{"version":"606aa2b74372221b0f79ca8ae3568629f444cc454aa59b032e4cb602308dec94","impliedFormat":1},{"version":"50474eaea72bfda85cc37ae6cd29f0556965c0849495d96c8c04c940ef3d2f44","impliedFormat":1},{"version":"b4874382f863cf7dc82b3d15aed1e1372ac3fede462065d5bfc8510c0d8f7b19","impliedFormat":1},{"version":"df10b4f781871afb72b2d648d497671190b16b679bf7533b744cc10b3c6bf7ea","impliedFormat":1},{"version":"1fdc28754c77e852c92087c789a1461aa6eed19c335dc92ce6b16a188e7ba305","impliedFormat":1},{"version":"a656dab1d502d4ddc845b66d8735c484bfebbf0b1eda5fb29729222675759884","impliedFormat":1},{"version":"465a79505258d251068dc0047a67a3605dd26e6b15e9ad2cec297442cbb58820","impliedFormat":1},{"version":"ddae22d9329db28ce3d80a2a53f99eaed66959c1c9cd719c9b744e5470579d2f","impliedFormat":1},{"version":"d0e25feadef054c6fc6a7f55ccc3b27b7216142106b9ff50f5e7b19d85c62ca7","impliedFormat":1},{"version":"111214009193320cacbae104e8281f6cb37788b52a6a84d259f9822c8c71f6ca","impliedFormat":1},{"version":"01c8e2c8984c96b9b48be20ee396bd3689a3a3e6add8d50fe8229a7d4e62ff45","impliedFormat":1},{"version":"a4a0800b592e533897b4967b00fb00f7cd48af9714d300767cc231271aa100af","impliedFormat":1},{"version":"20aa818c3e16e40586f2fa26327ea17242c8873fe3412a69ec68846017219314","impliedFormat":1},{"version":"f498532f53d54f831851990cb4bcd96063d73e302906fa07e2df24aa5935c7d1","impliedFormat":1},{"version":"5fd19dfde8de7a0b91df6a9bbdc44b648fd1f245cae9e8b8cf210d83ee06f106","impliedFormat":1},{"version":"3b8d6638c32e63ea0679eb26d1eb78534f4cc02c27b80f1c0a19f348774f5571","impliedFormat":1},{"version":"ce0da52e69bc3d82a7b5bc40da6baad08d3790de13ad35e89148a88055b46809","impliedFormat":1},{"version":"9e01233da81bfed887f8d9a70d1a26bf11b8ddff165806cc586c84980bf8fc24","impliedFormat":1},{"version":"214a6afbab8b285fc97eb3cece36cae65ea2fca3cbd0c017a96159b14050d202","impliedFormat":1},{"version":"14beeca2944b75b229c0549e0996dc4b7863e07257e0d359d63a7be49a6b86a4","impliedFormat":1},{"version":"f7bb9adb1daa749208b47d1313a46837e4d27687f85a3af7777fc1c9b3dc06b1","impliedFormat":1},{"version":"c549fe2f52101ffe47f58107c702af7cdcd42da8c80afd79f707d1c5d77d4b6e","impliedFormat":1},{"version":"3966ea9e1c1a5f6e636606785999734988e135541b79adc6b5d00abdc0f4bf05","impliedFormat":1},{"version":"0b60b69c957adb27f990fbc27ea4ac1064249400262d7c4c1b0a1687506b3406","impliedFormat":1},{"version":"12c26e5d1befc0ded725cee4c2316f276013e6f2eb545966562ae9a0c1931357","impliedFormat":1},{"version":"27b247363f1376c12310f73ebac6debcde009c0b95b65a8207e4fa90e132b30a","impliedFormat":1},{"version":"05bd302e2249da923048c09dc684d1d74cb205551a87f22fb8badc09ec532a08","impliedFormat":1},{"version":"fe930ec064571ab3b698b13bddf60a29abf9d2f36d51ab1ca0083b087b061f3a","impliedFormat":1},{"version":"6b85c4198e4b62b0056d55135ad95909adf1b95c9a86cdbed2c0f4cc1a902d53","impliedFormat":1},{"version":"5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","impliedFormat":1},{"version":"7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","impliedFormat":1},{"version":"fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","impliedFormat":1},{"version":"8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","impliedFormat":1},{"version":"ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","impliedFormat":1},{"version":"c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","impliedFormat":1},{"version":"c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","impliedFormat":1},{"version":"d6a6e6fcd382a05f787a81a157e66f54f360f81a405015bf07f77a622139ed90","impliedFormat":1},{"version":"f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","impliedFormat":1},{"version":"b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","impliedFormat":1},{"version":"5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","impliedFormat":1},{"version":"a2cbd7619074b44363cf8df182d5e951db89cae34d5a5676426782d31098ef31","impliedFormat":99},{"version":"e47a8bcff0cb89ef43aa0d4290138a5cb260101d079f69d330410b366a013bb7","impliedFormat":99},{"version":"a52f42e9038ea2d24040696fde6658210ad92688fb1404eb9d2f7e1f6b89b5a5","impliedFormat":99},{"version":"e1e7501e34ba58af8a00fad1455a893fd768d3fbba698fa53a8d61e72f0885a2","impliedFormat":99},{"version":"28296a5ea8028263072c1e0528c9a5557aacd1c89092c2b7440d15451aaf445b","impliedFormat":99},{"version":"b5465d10cc2d064b3f31578182fc41b42e1e84601809d96735885a3b36c68036","impliedFormat":99},{"version":"182a1bad4717a1e96f26aea5c8ce87a5a819ca996f237db611023b9d89f4b5ca","impliedFormat":99},{"version":"af6ace4911b15244a6fb0cf1dcc22e1a89b1486f0e0fb3be7fbb9cb6caa550fa","impliedFormat":99},{"version":"a71d2efbe78d1d5f39b4ef54617b045218d8793fea1e245eb1348286ef8ca483","impliedFormat":99},{"version":"8c57c4f44dc21308fd959f792ff283be24a430d975b922b2feda8f13f0f52771","impliedFormat":99},{"version":"f16d398c7bd6a438497bffb3beefebda5f83f0241ce2cc832787d94d40a2843d","impliedFormat":99},{"version":"a4be2828c686a8a5801c12d8aea0890204963437bec5730f8740099cd1fe8f47","impliedFormat":99},{"version":"7661dacdd52d2448b18ef61fcacc25c721f43186304f7888b3f9f472321725e1","impliedFormat":99},{"version":"e2f39969c89cff97eee3a27dbda04b702b01433c86f1cdc0104db6ccfbfc6355","impliedFormat":99},{"version":"31a8c8c3dd9e43299c50e36674ff70c0234ca712c2492a687cd0bdf09a22fb0b","impliedFormat":99},{"version":"01dd6137942cc1fb6511376d1db1c49e8c07bea46715ffa3af815f2d20462d39","impliedFormat":99},{"version":"2ae9392a6221474bb135eddc8adb531946aa29c67598eb0f5c1ac7e21707a359","impliedFormat":99},{"version":"107244721ecbbcb9d015158adce0979ad8889c6fabb84e407c01e9bc231c88fe","impliedFormat":99},{"version":"f3d0fed520919e8ac1d033aeeae5608da2dacbbd63f5c717d5edd2a6dc91e0c5","impliedFormat":99},{"version":"8e3976e9d3bdb95eaf82a8f53fac9e6823be083a53d3f3939701470c254a1f04","impliedFormat":99},{"version":"eb0d8e96b801b59d5b87c834300a251a5aa6074139b8ad79585e3c01fa1691ce","impliedFormat":99},{"version":"be56e82a3782f2118d7b0c56c770103b259979004a1b92340c6caf150fbee3a9","impliedFormat":99},{"version":"cc8586e3cd56847bacddedf5f924f9ce92c11ae71828ca151f8afd216abe693e","impliedFormat":99},{"version":"805a0e7d0f47e5332285ba8145b9e81b94993461fbb1cfae6b15ffd545ae9a48","impliedFormat":99},{"version":"5b2773644d27ac8dadba762e14e837ebc06b000a725117240f96a159dfc42c78","impliedFormat":99},{"version":"26dcb4bb8795f758a8c2778c68bf6fdb08751e4b4c041b3bbff207aa41d3af5a","impliedFormat":99},{"version":"5f1b7ae9dae3bc04a2b44fd10721d58a9a4aee0633d99f8b3ac351702f47efbb","impliedFormat":1},{"version":"d4c55922007526e6c361c46722351f51dccb6d767496aab702e14eb6ca2bfdab","impliedFormat":1},{"version":"d7a574f5557f3a399c1556410ad2504bfd569a45167476c8be4839887797edd0","impliedFormat":99},{"version":"1bce7c5ce91267ed5114c93fa0725157bd9a20f03911235ee9105e87674ecc82","impliedFormat":99},{"version":"d3a77124d6c2c29c0de8857534c5dc3abc57ade3d6ffbf3707ae1d87c10ed575","impliedFormat":99},{"version":"34b606235de411ef251b68786497592f386e5351818802d4f8e04a64141d3b12","impliedFormat":99},{"version":"91f8d7c73837bafc4914567efd6777307551558989491876034e6f98b62d99a6","impliedFormat":99},{"version":"5b51b59938bd0ca81b50e79de5b2205cfdc49e76dda117636a1d6d61205db8ba","impliedFormat":99},{"version":"166ab5d596e8e097bba5f9d85f574a19f1fe98fb5a36b655ea81db4d024bd0de","impliedFormat":99},{"version":"34addbb9746e63b4f757a396ef174d267c59c9673107192e56fc9fa44355f772","impliedFormat":99},{"version":"0a6b68700031a7b966eba71a17e7efef15a008727959903abd131bb4f5c57e60","impliedFormat":99},{"version":"f54ed46100666f8850e1a0393d71e2057c6dc411895bf3ea1c35c950e5045929","impliedFormat":99},{"version":"9f6bc77840cb01219d0233973552d7fae3a0ccef6e7e6179c014de5ccc044c3e","impliedFormat":99},{"version":"73c7279d2eed2d40a82d9877e25b316ce61f20f3720e038c0288965a70ed5ae6","impliedFormat":99},{"version":"849c701def1fcfd8720d8850d5ea984a3cd4d08204a29c28b0f5ff07062f8647","impliedFormat":99},{"version":"6c4188b9f3998b804c4df6d637ff7d328eaac77ba6b33f4616bd7acc3f04e01f","impliedFormat":99},{"version":"7d263568916984bafa308be74e7400f4010e0e97ea248f66d630929844a4ce6d","impliedFormat":99},{"version":"301c4337a07ab3be97c34bee7eb15a5caaba815a02bbc376f0f2a00c47040763","impliedFormat":99},{"version":"a928314cdafb6ce7d2e420bff316b2ebe6edd9ae470f82c332cc2ac64becdb53","impliedFormat":99},{"version":"78acc3ece111ed7f9dcc461aea6b942d71e10122a5fe0b0730edfb4746eb1567","impliedFormat":99},{"version":"7b356a77218948b0f659aa3a622f0178e9e8cc8c4968b6e509296013980ce5bf","impliedFormat":99},{"version":"60bbddcefe92ddcc0f72a4324ba8d3f40f0242e60b6aa97bc6c5bf1243e6da46","impliedFormat":99},{"version":"9c364f17038ca4191ecbe46e929cc1e7c026ad6c957153438776ffe9998aa78e","impliedFormat":99},{"version":"4b2521490f9183a2bc04d30797fe550404184a581fdd0095675c28f8c80e4097","impliedFormat":99},{"version":"43b5f14a414da28b973b32ce136c260bb92019c8ff4a24a8445630a2bf435cbd","impliedFormat":99},{"version":"82edb64fbe335cd21f16bcf50248e107f201e3e09ebc73b28640c28c958067c9","impliedFormat":1},{"version":"9593de9c14310da95e677e83110b37f1407878352f9ebe1345f97fc69e4b627c","impliedFormat":1},{"version":"e009f9f511db1a215577f241b2dc6d3f9418f9bc1686b6950a1d3f1b433a37ff","impliedFormat":1},{"version":"caa48f3b98f9737d51fabce5ce2d126de47d8f9dffeb7ad17cd500f7fd5112e0","impliedFormat":1},{"version":"64d15723ce818bb7074679f5e8d4d19a6e753223f5965fd9f1a9a1f029f802f7","impliedFormat":1},{"version":"2900496cc3034767cd31dd8e628e046bc3e1e5f199afe7323ece090e8872cfa7","impliedFormat":1},{"version":"ba74ef369486b613146fa4a3bccb959f3e64cdc6a43f05cc7010338ba0eab9f7","impliedFormat":1},{"version":"a22bbe0aeceec1dc02236a03eee7736760ecd39de9c8789229ce9a70777629bb","impliedFormat":1},{"version":"a9afefcb7d0c9a89ec666cc7cccc7275f6a06b5114dd15aa2654e9e19c43b7c1","impliedFormat":1},{"version":"09bc11b53ad8cdeafbc9e689036dca972a188e3ed91ce45385f74bd6d70a2d01","impliedFormat":1},{"version":"e24094fa069365f5b61524e962f8f008e2707fe05e2b170755b14b6ca84ff4f1","impliedFormat":99},{"version":"0030cd149098b3a72487ef56785c99794291d839cf9178c18c3b9a817e57a49b","impliedFormat":99},{"version":"c69cc3387606e9c35150c95c4f1ab3924d85f1c75ba1dc9aa195ae0f333680aa","impliedFormat":99},{"version":"efd57dbf66d763611ad0faa3eba059e11b8bb58044c0711aa1728fea0d4b2ca6","impliedFormat":99},{"version":"fd099c27713fa92cf7aa697b6f7f2b95ee1a98b0802174d766cacc3daeafdefa","impliedFormat":99},{"version":"c6b51dc1de8c2ccab35dae3c92076517b614992d98b40670020d46939bb36eaf","impliedFormat":99},{"version":"bda2186a5f2f0a07e50a3cfd8d85a0744778a5152a3f96d229ed2119f1e28115","impliedFormat":99},{"version":"6905b88a7875372f067a93f89cbdd3ae9d3f2f42fa7366bc4214017b9e6534ad","impliedFormat":99},{"version":"7d03be938e7a53f8b4f732d184fb3eb275e5dbec3a28c75b39960065e77b8496","impliedFormat":99},{"version":"4a353ae985a9d09dfbe3dc356aac32bacc84f4e8d39c271cf5e4fd6797f16baf","impliedFormat":99},{"version":"ed3926abfe677cdef1d9d01090cb9e31883fbbab874c2400387e52f43bc0130f","impliedFormat":99},{"version":"a4446aeada97e090c1134a4d5d12e20a66b424ed6784b175d458701e8a95e6fc","impliedFormat":99},{"version":"1af39e6ade8c28757c5bc04483f06ec60743edea296a75aac2bb14555f09308d","impliedFormat":99},{"version":"31ad037cc2f708a504ae5f00342753a2df3dd49176e8f7af624585afaf711b12","impliedFormat":99},{"version":"4db4b196d99b42ae4f4475b9fef7a4bd9686b3e37d8734e62f650d59e26bc92a","impliedFormat":99},{"version":"aa6346beca6368ed81b40b9a402db2464b9dba5ec3f24e2ea264ca38cd96c090","impliedFormat":99},{"version":"a04890f0d84d22fd5a654ee02c42fe94db43479d9abdfbd46dd88b347cf3b6d4","impliedFormat":99},{"version":"c014a1f6b96a0c6e476294372b6a9210989e4b2a9ea9b052d64b9b374152f016","impliedFormat":99},{"version":"a994a84831fceacefd7a7b09090c9d9398bcd2422ac36e91488a9e03f2b38b8d","impliedFormat":99},{"version":"291a98aa35cca99a5ef42a97344865e5d8d5dd9d7337b612283a87d272b2bb95","impliedFormat":99},{"version":"36c7d6a9249dc96c1345e54ba4335b63af955b817fb0baa4d561caa0c1876b15","impliedFormat":99},{"version":"53eb32877c5b646c0682c14d402bf9742e1bee8d86d57f9f7c75009a09cf9215","impliedFormat":99},{"version":"2cb16816c42c3055a0bb9d8b3c0fbcec61f1d3dd5655eaaa8e6a12d779e75206","impliedFormat":99},{"version":"a27cb995d5c85e8ab069508a9b37bb37436c403ca34798a540338a0dd2f318a2","impliedFormat":99},{"version":"1eee0e089cbf1917413a357d3d8bd2a1b598b9fcd19cc8517812b0f42690e590","impliedFormat":99},{"version":"7220a4508d88a7b3dfe58143dbfc2c368abd0543d4e5d2728afcbcc9c2b96c7d","impliedFormat":99},{"version":"bd008d0bf7917dcbbcdbcb594ddb921561ec69967de8e311d911a0727ce2f248","impliedFormat":99},{"version":"34eaa37b4a48c4e7b45b82a829aa9122ce7f925262b3dd6a278c0a89bc84d5c8","impliedFormat":99},{"version":"967be370f39d7ae0fa1f28707bf3167ce4893aa9bf81dbcece3ce3d2f43deefb","impliedFormat":99},{"version":"2fcabfb093d918876210e80f037ec2c768d0af5501b5be4858c283c28e8d6f93","impliedFormat":1},{"version":"c5d3fd81de19d95a1808ebb9bd7808dd10dd52418b1a1c529f6f4418b8d3352a","impliedFormat":99},{"version":"3713219a0562f0fb3689b10723006d094f3d79633e373f4ab8b441a5401b8584","impliedFormat":99},{"version":"fac0bd8fb7a95cb36206f3dd4c272e343ecd759ab5f2fa30029e22635cb9de9d","impliedFormat":99},{"version":"fcea37d4da54ce2003ef3d287593743d797de193b4069b595e982144ff22b12d","impliedFormat":99},{"version":"1974d9cd45125039b651dfa8bcb9689e8c1d4d8a7dc20db710a27fe0d497fe6f","impliedFormat":99},{"version":"3b29f7d21bd6a07aea9adc06ee9612d3d86fa03663e3364b4d2c067c7f547e5e","impliedFormat":99},{"version":"01545f0274a774e191f06380ddedaec2b2dfbd021ca2e8775f7819959beb2cb4","impliedFormat":99},{"version":"6c557db1095e0588b7d82d9bdd9e4328872d436a94f2025da271d5ef57845309","impliedFormat":99},{"version":"2827790fc4a5c48d032a79a8d547eca0620d7fc7c997b830417f6de5b04c7c3d","impliedFormat":99},{"version":"7bba3bab37aa81a0b9628c26b43c38bfae8316e3e54a9a0572c2eaa7b20518c7","impliedFormat":99},{"version":"cbeb4c46612813c72b39dc7e0d5b897f0e9951cf81252d239ba3d20ce5758643","impliedFormat":99},{"version":"8fa21591f8689152157c9e3449ac95391fe5f31a9770a58bf9c0e4f5ee0d4af3","impliedFormat":1},{"version":"ac8582e453158a1e4cccfb683af8850b9d2a0420e7f6f9a260ab268fc715ab0d","impliedFormat":1},{"version":"c80aa3ff0661e065d700a72d8924dcec32bf30eb8f184c962da43f01a5edeb6f","impliedFormat":1},{"version":"bcf1245c84b2237aa397c74273b6a5e7de8464a07f8403c549f9bac7ae4daacd","affectsGlobalScope":true,"impliedFormat":1},{"version":"617490cbb06af111a8aa439594dc4df493b20bbf72acc43a63ceade3d0d71e2a","impliedFormat":1},{"version":"eb34b5818c9f5a31e020a8a5a7ca3300249644466ef71adf74e9e96022b8b810","impliedFormat":1},{"version":"cdec09a633b816046d9496a59345ad81f5f97c642baf4fe1611554aa3fbf4a41","impliedFormat":1},{"version":"5b933c1b71bff2aa417038dabb527b8318d9ef6136f7bd612046e66a062f5dbf","impliedFormat":1},{"version":"b94a350c0e4d7d40b81c5873b42ae0e3629b0c45abf2a1eeb1a3c88f60a26e9a","impliedFormat":1},{"version":"231f407c0f697534facae9ca5d976f3432da43d5b68f0948b55063ca53831e7c","impliedFormat":1},{"version":"188857be1eebad5f4021f5f771f248cf04495e27ad467aa1cf9624e35346e647","impliedFormat":1},{"version":"d0a20f432f1f10dc5dbb04ae3bee7253f5c7cee5865a262f9aac007b84902276","impliedFormat":1},{"version":"40a2c0b501a4900e65a2e59f7f8ae782d74b6458c39a5dd512fafc4afea4b227","impliedFormat":1},{"version":"4536edc937015c38172e7ff9d022a16110d2c1890529132c20a7c4f6005ee2c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"b750081497a8731c793cedf735f61007bb3a70efbfc12e4cdae90f906f1c5755","impliedFormat":1},{"version":"a3f10b207ac34092603a802aa6d932d22372d571d4649c1d48a074b71da95eac","impliedFormat":1},{"version":"f42365baa04389b983f87a8e14c130ea0ab4a913fada35e8e8e8825a450d4840","impliedFormat":1},{"version":"98ad7367a33f8b7cebad1f8b92e56287b28eda1bfd11f8fef8673980b1090a91","impliedFormat":1},{"version":"be43be05fe9cfd2eb3ce785ef8cbc48737843aac7baf8345c0d8857d7703c996","impliedFormat":1},{"version":"2622d23b82f46eecadc419a286395ddfaaee2f5d533b35127235815ed8807b76","impliedFormat":1},{"version":"406820d111d981e35608f3b6525b8b8a818f2ef83083e8b381f3336d7067a593","impliedFormat":1},{"version":"3bc9a5fc50e1b5678284bf0c8f6319e0cc4910e4ecc1bdb3d490850c9a0859b8","impliedFormat":1},{"version":"e480120d79410e40d95f27fd46da84e12e16b8ff57dda7206a97cb165a2c2213","impliedFormat":1},{"version":"54e4b2a4cfdae8bd4fa66c3baa19af1df604959c81f921252dfc2777e6eebd25","impliedFormat":1},{"version":"f00d9f3635a0f2b6427437b01543ecba1dbf4a5db9adb7d045beb90f8497a87e","impliedFormat":1},{"version":"1611551020c708492c66ffcda9e2b593c3ff91ee8875365c057213a8564ee60b","impliedFormat":1},{"version":"d8158d02e93f868ef402ed06e2a33e419585fe069193905c29e80554e87ac15c","impliedFormat":1},{"version":"ee994010f671930976c04e4ed48f1f3380c51dc009d7846a2ca1e86468c37257","impliedFormat":1},{"version":"8dcf156fc7436c5a104f0ecd75c2f0069061502ce9900607c1667aaca3a6851e","impliedFormat":1},{"version":"afeaa3163ca96eba18a94a8310ea952164ef767d7ae1e3f21b19bad1e204d087","impliedFormat":1},{"version":"9061663f4f28b12ca29ef8940a44ec53d5f9f386e5edee569fdcdfc7e4ca14eb","impliedFormat":1},{"version":"453ea807ecb71949a1ef40b09b2368f3a6a487705f5a2116af925efa2f7e6d92","impliedFormat":1},{"version":"a07ed03a026bf50005a267f7dd20db3797e1662da44ea635d4770420096f02e3","impliedFormat":1},{"version":"a9d62506c38c63df06c007381a4adf5459355ee31a292b86ebea9c836bb7e841","impliedFormat":1},{"version":"7641368980134052046a56141286a4ca7ab30d40fe1ba209cbffce7ddf811456","impliedFormat":1},{"version":"26020fd840eba5d9209e6b07df23d7a9ceb7571fde0c3ae9f443c84619de6a41","impliedFormat":1},{"version":"44357c6a5dab66018d8262a99a67334a0e83037da789bf5495f12d72c18ed46c","impliedFormat":1},{"version":"782ede6abab3148ba43fa5c41c3ac045b81299d306ce06bc27c045c99e375aaa","impliedFormat":1},{"version":"87a4142f849a63088dfbb3a2b67320e497e1ac1a008051e75f32ca0cc75d8da1","impliedFormat":1},{"version":"93bd377447dcc0ddb93afe519b7ca4f0400eb8d1fd11fa49848f7522789bbc38","impliedFormat":1},{"version":"87f7c14cf79d5c5409e1260dfc1dda3bc9b0d13b81f2ff39b820dde587c569ee","impliedFormat":1},{"version":"b9dd0d484906d4444d32a4c70451eaed8d54dfd618cc6f9912f0e20a6b54d7e6","impliedFormat":1},{"version":"353eca851a8aace8404c346d91e350c8ed959759f8fb2a33060ab0d850eed9c4","impliedFormat":1},{"version":"b00498e0f7de6d0b2eaabf6bc6c27d54e224dbde9b8710c37a0c5f9cabff9013","impliedFormat":1},{"version":"993200dc344eac5de024608fe26fbb1cf4764c254229f481ed8aae084f2fe0e4","impliedFormat":1},{"version":"fc23536cabc16a53018f4dbe8be39db84a73cf1c69b85f238b9ae7e09edaa199","impliedFormat":1},{"version":"89163956c437b564e0073e53141646df002e1d57d2e0bc2dbc3b0a4691776c5f","impliedFormat":1},{"version":"4970c3f3f4b6902144173902c3a969517d708ecbd8c50cc6465d4f2c488fad9e","impliedFormat":1},{"version":"9fd0da3a46448bcc367f52f9f57ba10b8eaf06bc9d4f34698298ec2aab991807","impliedFormat":1},{"version":"f3f337ffc81aab30ec297669919e1d606028f7864f6d14fee0b93547b882d2bb","impliedFormat":1},{"version":"c2649fb23b8767464051cf1f92ed0fed53ea7d5cbd6f807a348402e0be37500c","impliedFormat":1},{"version":"0d3646c780151c55b6bcf7c15f66b6769ac554eac2aedf3294edff04a0045cfe","impliedFormat":1},{"version":"8778eb90e3cd6d0e4b36aeca250abb807e009ceed8fde90866afc7568f185646","impliedFormat":1},{"version":"304ec145044d3fd83921ee3bc57f3f9bba7ac84e866aec6bab17820a581f171e","impliedFormat":1},{"version":"e15cc57b8f017cef8e32c06f04b6c724f8681f9442efc2aa4c757464483f32bc","impliedFormat":1},{"version":"bb539d13f42ca588fc5083b94e537ed67fe47449da84d414b14f3d17c7b5c49e","impliedFormat":1},{"version":"592f9ad00e8c3734ecaad7203b05fd72a028aa9fb11e64db927f00d8715476d6","impliedFormat":1},{"version":"0b4046e2e44fbcc8ad9f4e56859ab9874c669249a51217e21d6c2402ff26e615","impliedFormat":1},{"version":"da332d91f1da53266c5eb9af28f0235ab248ad81f68890df1de8b88074b24a4a","impliedFormat":1},{"version":"0764641d314681c58c751f42b47a572115dc842a72072fa868a259a1cc70f6ff","impliedFormat":1},{"version":"3720043192743812e92ee320868617e7f7e55115ea58ad9e5a512c763716a381","impliedFormat":1},{"version":"fa106dbcb508da05acda26c2deb5ecd307fd323f2d491056b980c25d7d9d3d19","impliedFormat":1},{"version":"686c74caa6c90f835616624627be07c4c977c217e400db2d6cab99b3b19681d0","impliedFormat":1},{"version":"33598ffcfddac61cb35af961c6794b6dc03a89fd2e92089113b34dbb42bd2e27","impliedFormat":1},{"version":"1f1852185404db45d03465a19f7c65bb8f2540bfccb6b967cc32779fdf844f72","impliedFormat":1},{"version":"ae51b52a71c70aa77fac061acf81c4da5770ea10a9a1ff5df252eb79d4d93f26","impliedFormat":1},{"version":"55949c519449e0e0c1eb61d34aa42d5297c2e29883b45fd009629e914e856b30","impliedFormat":1},{"version":"0cbc69cf27e58df8b07063583fb2740d9dc664afc058491af2456a2e270b43bb","impliedFormat":1},{"version":"fdcc8e65fff640091ae5db35056ef87a343c373b5b78369ae509be0cda7df5d2","impliedFormat":1},{"version":"9b24babb0bd8d8cdd5e770250f0bdab0b97ad97056b2b59e6104eda349872b89","impliedFormat":1},{"version":"ca3c62ca26416a83e1090706d6df86a089a86b76b5bf561298b1fc5afa65b0a3","impliedFormat":1},{"version":"fde60d698983b343d3ace0742f852622230902ebe5917b1a5aabf7db7f34e3d9","impliedFormat":1},{"version":"9e8147e322367517e09022bf0f00886919b922de4fb4f9b856976a3c0c5597f1","impliedFormat":1},{"version":"430aae2003d27d257031cccff62b7c05468ca2201033f01b712959b47d458049","impliedFormat":1},{"version":"fd8b21234303f04f3357ba644ffd76844f02e70a7f07a290142f11ba71ceab92","impliedFormat":1},{"version":"d10535292b8a83db27138475488a427572a558559bf3be5cad89568c66deb5e2","impliedFormat":1},{"version":"54e98342907a1a0170d8d5dc81e4f05c5f6c526421e930aadd3e30c682498a29","impliedFormat":1},{"version":"1539b21903f2f9049f1f637bfd736d593205100dd3b3d2f7cabf23e6c004edbc","impliedFormat":1},{"version":"b04f4d4736305a8fd1910b01ae9c40d0738d952744d1ec904610d1764efa91af","impliedFormat":1},{"version":"1ad05fc69812ce854a3db895e6f9a72877151ff1e5d8af0ec78d5736afaa1fcf","impliedFormat":1},{"version":"0c11d5e2e654790dfa45f9bc2d3b653fe13c4f7a0c8a1d639a5a924b6e09be8c","impliedFormat":1},{"version":"324a44990de071515cb273632ace64d4f32b72f2d9391e003a63ea69aabd3364","impliedFormat":1},{"version":"31333fe58620f76321cc0153a0aa7ae0408e1b7ca3d1c26d2569ec44b6ee3805","impliedFormat":1},{"version":"6fc89c781ebd4d280c684ce1042c9ebbc4a59cf1ecf5983cfa2eefdd3cd449a0","impliedFormat":1},{"version":"593cc5d6276e32b36088a73756514161b750c2957a84ddf5153935eee3f95e3a","impliedFormat":1},{"version":"276b8af5ab99167e0a217186a39ffa44473beecd9a937057bcad2eb3e21c53b4","impliedFormat":1},{"version":"b760d358d0b42de531509e3bff8a9cffb934e3a2ff0d53fa244b3ebfaaef9f91","impliedFormat":1},{"version":"caac24397bd88bf85b02e42ec561181acab9384d9e2429e1ff3d65abe1567407","impliedFormat":1},{"version":"9efa716140d3e52b0dda513aa7b45252af15617d6b9a6b9a5be786a4f60042a8","impliedFormat":1},{"version":"4558f132688cff22a2acc65f44d277546b55435083141779beb11e993dcdbe13","impliedFormat":1},{"version":"2e4cbb24e294d25e6bd050f1a5d6b86422475c049afc65c3cd777b16c7af88b9","impliedFormat":1},{"version":"3e162b63e35c2007cb0eb3db0ba0fdb45e4185e5417440d79d56fc989aaea13e","impliedFormat":1},{"version":"d4c3c88d6c5bbff05051f52bc7ed0eb391915ca08e049f04a07bd663f4545232","impliedFormat":99},{"version":"6baefc27658b84f6565ecab2259a518671acd9cffef43f58e60c8366ceb9af6c","impliedFormat":99},{"version":"30f228380cf6be920ac3020de1f1ba9357cf74abd9a7ddb4f552b53793422f6f","impliedFormat":99},{"version":"70474b89479c9af715d34af4a47fcfed0a2b2d849c0c3d4206af8c7aa8cd3ea4","impliedFormat":99},{"version":"3372bad780414017ef08dc46d910eae7989b6f79431187bd4b5ca7906e3c189d","impliedFormat":99},{"version":"49a4a3aa4f4b6aab006edba6b1bb0f9b27002ab63fc8334774a231d42caf1f58","impliedFormat":99},{"version":"9f156f8ed124228a7f097cd6d5e0339455331ebaedcbe1924e10a43ae5ca4394","impliedFormat":99},{"version":"f4dac5c38306d19b474071753b9ee9b4c5596804fd988b8899630eb475a0c879","impliedFormat":99},{"version":"e38b35222fe9af491e30ea41227da33c391c89aa5c04738451d99f749b8f63a1","impliedFormat":99},{"version":"8697faa527dd799c5bbe64723aa2593fdd47c609864aa4c49689997cd06cebac","impliedFormat":99},{"version":"b426147fec725961d1305b25b26dbf99e5c419de98b5728974a8a44fc5959181","impliedFormat":1},{"version":"1ee93511c5e298aab9478eafb3491934bad64569c28be6458d949eaf259ec5bf","impliedFormat":1},{"version":"fa7158f52e83042da94983a5e2cebb0b7c025b0acafd71191e57698f8d9c8b09","impliedFormat":99},{"version":"bab1b5cc2da189d30f00912f4c9da4708f39237e8ed6e135ccc4b64f125afd85","impliedFormat":99},{"version":"a0d6628210c65b46188ad07eabc4991e5a2874a7ecfe5ab612c1d6647cdfab4c","impliedFormat":99},{"version":"c480d0ea30cd77aab28530ae89228dd4b9e08bc3579da7d945e6f3b7b695e8c2","impliedFormat":99},{"version":"7eafe304e3269e8120e91a8e76c60f8631381b73de18974b73a5326639882a9a","impliedFormat":99},{"version":"8eb142d9d0e29220c562296bdbed6b2c228df84589ce5d0c74ed7c333c1ba6cd","impliedFormat":1},{"version":"900a515d24dc7181b037d5f8b8292de7416751dfe92476ab26f2b5bf5d1b3797","impliedFormat":99},{"version":"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"dd78bfe9dfcadb2c4cd3a3a36df38fb3ef8ed2c601b57f6ad9a29e38a17ff39c","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","impliedFormat":1},{"version":"53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6","impliedFormat":1},{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f85c06e750743acf31f0cfd3be284a364d469761649e29547d0dd6be48875150","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","impliedFormat":1},{"version":"5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","impliedFormat":1},{"version":"d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a30b7fefd7f8abbca4828d481c61c18e40fe5ff107e113b1c1fcd2c8dcf2743","affectsGlobalScope":true,"impliedFormat":1},{"version":"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","impliedFormat":1},{"version":"304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","impliedFormat":1},{"version":"1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","impliedFormat":1},{"version":"98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","impliedFormat":1},{"version":"c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","impliedFormat":1},{"version":"2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b","impliedFormat":1},{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","impliedFormat":1},{"version":"a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","impliedFormat":1},{"version":"d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900","impliedFormat":1},{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true,"impliedFormat":1},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","impliedFormat":1},{"version":"6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","impliedFormat":1},{"version":"56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","impliedFormat":1},{"version":"139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","impliedFormat":1},{"version":"7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","impliedFormat":1},{"version":"2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927","impliedFormat":1},{"version":"257ff9424de2bf36ba29f928e268cf6075fb7a0c2acd339c9ad7ac64653081d2","affectsGlobalScope":true,"impliedFormat":1},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","impliedFormat":1},{"version":"9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","impliedFormat":1},{"version":"e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","impliedFormat":1},{"version":"b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0","impliedFormat":1},{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","impliedFormat":1},{"version":"4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc","impliedFormat":1}],"root":[61,62,324,326,[330,334],336],"options":{"alwaysStrict":true,"composite":true,"downlevelIteration":true,"emitDecoratorMetadata":false,"esModuleInterop":true,"experimentalDecorators":false,"isolatedDeclarations":false,"jsx":2,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":false,"noUnusedParameters":false,"removeComments":false,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":9,"verbatimModuleSyntax":false},"fileIdsList":[[177,178,179],[175,176,177,178,179,180,181,182],[176,177],[110],[176],[177,178],[110,175],[69],[72],[77,79],[65,69,81,82],[92,95,101,103],[64,69],[63],[64],[71],[74],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,104,105,106,107,108,109],[80],[76],[77],[68,69,75],[76,77],[83],[104],[68],[69,86,89],[85],[86],[84,86],[69,89,91,92,93],[92,93,95],[69,84,87,90,97],[84,85],[66,67,84,86,87,88],[86,89],[67,84,87,90],[69,89,91],[92,93],[227],[226,227,228,234,235,236,237],[110,183,226],[226],[233],[231,232],[226,229,230],[396],[110,183],[337],[373],[374,379,408],[375,380,386,387,394,405,416],[375,376,386,394],[377,417],[378,379,387,395],[379,405,413],[380,382,386,394],[373,381],[382,383],[386],[384,386],[373,386],[386,387,388,405,416],[386,387,388,401,405,408],[371,374,421],[382,386,389,394,405,416],[386,387,389,390,394,405,413,416],[389,391,405,413,416],[337,338,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423],[386,392],[393,416,421],[382,386,394,405],[395],[373,397],[394,395,398,415,421],[399],[400],[386,401,402],[401,403,417,419],[374,386,405,406,407,408],[374,405,407],[405,406],[408],[409],[405],[386,411,412],[411,412],[379,394,405,413],[414],[394,415],[374,389,400,416],[379,417],[405,418],[393,419],[420],[374,379,386,388,397,405,416,419,421],[405,422],[327,328],[220,221],[220],[220,221,222,223],[218,224],[224],[218,219],[243],[250],[281,282],[241],[307],[247,286],[242],[242,280],[242,247],[242,270,280],[242,246,270,280],[242,270],[247,261],[298],[246],[241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,275,276,277,278,279,280,281,282,283,284,285,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316],[249,273],[269],[249,275],[249,278],[254],[247],[242,246,261],[263],[309],[274],[295],[287,288],[287,290],[246,247],[241,246,267],[264,270],[348,352,416],[348,405,416],[343],[345,348,413,416],[394,413],[424],[343,424],[345,348,394,416],[340,341,344,347,374,386,405,416],[340,346],[344,348,374,408,416,424],[374,424],[364,374,424],[342,343,424],[348],[342,343,344,345,346,347,348,349,350,352,353,354,355,356,357,358,359,360,361,362,363,365,366,367,368,369,370],[348,355,356],[346,348,356,357],[347],[340,343,348],[348,352,356,357],[352],[346,348,351,416],[340,345,346,348,352,355],[374,405],[343,348,364,374,421,424],[150],[123],[122],[113,114],[111,112,113,115,116,120],[112,113],[121],[113],[111,112,113,116,117,118,119],[111,112,122],[321,323],[326,330,331],[323,325,388,396],[323,329,396],[323],[321,323,337,387,388,396],[239,323,329,335,388],[155],[171],[123,152,153,154,155,156,157,158,159,160,161,162,163,164],[123,163],[123,152,155,164,165],[153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170],[123,152,155],[123,152,154,160,162,165],[123,157,163],[123,157,158],[123,155,158,159],[110,123,138,147,151,173,174,191,193,194],[110,123,138,149,174,195,196,197],[138,194],[139,209],[139,146,198,208],[198],[132,239,318],[318,319,322],[126,132,240,317,320],[132,396,416],[186],[140,146,185],[140,184],[126,127,202,238,319,321],[123,127,130,132,133],[183],[126,138,147,149,173,174,187,190,191,192,193,194,195,196,197,198,199,200,202,204,207,210,213,215,216,217,225,320],[203],[110,146,202],[110,140,147,183,187,191,192,201],[206],[138,141,146,190,205],[138],[138,141],[123,127,128,129],[123,128,131],[123,126,128,135],[124,127,128,129,130,131,132,133,134,135,136,137],[123,127,128,129,132],[123,127,128],[123,126,127],[212],[126,138],[126,138,142,146,211],[126,138,142],[148],[110,138,143,146,147],[110,147,149,183,187,190],[125,138],[189],[144,146,188],[144],[214],[139,140,141,142,143,144,145],[110,147,191,192,200,210,224],[138,172],[110,138,147,192]],"referencedMap":[[182,1],[183,2],[180,3],[181,1],[175,4],[177,5],[178,4],[179,6],[176,7],[71,8],[74,9],[80,10],[83,11],[104,12],[82,13],[64,14],[65,15],[105,16],[70,8],[106,17],[73,9],[110,18],[107,19],[77,20],[79,21],[76,22],[78,23],[75,20],[108,24],[81,8],[109,25],[84,26],[103,27],[100,28],[102,29],[87,30],[94,31],[96,32],[98,33],[97,34],[89,35],[86,28],[101,36],[91,37],[92,38],[95,39],[228,40],[238,41],[230,42],[235,43],[236,43],[234,44],[233,45],[231,46],[232,47],[226,48],[227,42],[237,43],[337,49],[338,49],[373,50],[374,51],[375,52],[376,53],[377,54],[378,55],[379,56],[380,57],[381,58],[382,59],[383,59],[385,60],[384,61],[386,62],[387,63],[388,64],[372,65],[389,66],[390,67],[391,68],[424,69],[392,70],[393,71],[394,72],[395,73],[396,47],[397,74],[398,75],[399,76],[400,77],[401,78],[402,78],[403,79],[405,80],[407,81],[406,82],[408,83],[409,84],[410,85],[411,86],[412,87],[413,88],[414,89],[415,90],[416,91],[417,92],[418,93],[419,94],[420,95],[421,96],[422,97],[329,98],[222,99],[223,100],[224,101],[219,102],[218,103],[220,104],[247,105],[251,106],[283,107],[242,108],[308,109],[287,110],[284,111],[285,112],[288,113],[281,114],[290,113],[292,115],[293,112],[294,112],[282,116],[252,105],[298,117],[314,118],[302,119],[317,120],[274,121],[270,122],[276,123],[279,124],[255,125],[299,126],[262,127],[296,128],[310,129],[275,130],[297,131],[265,105],[289,132],[291,133],[248,134],[305,119],[268,135],[278,130],[271,136],[355,137],[362,138],[354,137],[369,139],[346,140],[345,141],[368,142],[363,143],[366,144],[348,145],[347,146],[343,147],[342,148],[365,149],[344,150],[349,151],[353,151],[371,152],[370,151],[357,153],[358,154],[360,155],[356,156],[359,157],[364,142],[351,158],[352,159],[361,160],[341,161],[367,162],[151,163],[150,164],[123,165],[115,166],[121,167],[116,168],[119,165],[122,169],[114,170],[120,171],[113,172],[324,173],[332,174],[326,175],[330,176],[331,177],[333,177],[334,178],[336,179],[216,180],[172,181],[165,182],[154,164],[155,164],[168,183],[167,184],[171,185],[156,164],[170,164],[157,164],[166,164],[158,164],[169,164],[164,186],[163,187],[159,164],[162,188],[160,189],[161,190],[195,191],[198,192],[196,193],[210,194],[209,195],[139,196],[319,197],[323,198],[318,199],[322,200],[187,201],[186,202],[185,203],[320,204],[199,205],[201,206],[321,207],[200,4],[204,208],[203,209],[202,210],[207,211],[206,212],[141,213],[205,214],[130,215],[132,216],[127,164],[131,164],[135,164],[136,217],[138,218],[133,219],[137,164],[129,220],[128,221],[134,164],[124,164],[213,222],[142,223],[212,224],[211,225],[149,226],[148,227],[143,213],[191,228],[126,229],[190,230],[189,231],[188,232],[215,233],[192,4],[146,234],[225,235],[173,236],[193,237]],"affectedFilesPendingEmit":[324,332,326,330,331,333,334,336,61,62],"emitSignatures":[61,62,324,326,330,331,332,333,334,336]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/cli-v3/tsconfig.src.tsbuildinfo b/packages/cli-v3/tsconfig.src.tsbuildinfo deleted file mode 100644 index 5bcaf5f38..000000000 --- a/packages/cli-v3/tsconfig.src.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/typealiases.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/util.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/zoderror.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/locales/en.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/errors.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/parseutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/enumutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/errorutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/partialutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/types.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/external.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/index.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/index.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/exception.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consolelogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/observableresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/metric.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/noopmeter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/textmappropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_state.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/link.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spanoptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_options.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_provider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/samplingresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.d.ts","../core/src/v3/schemas/tokens.ts","../core/src/v3/types/utils.ts","../core/src/v3/types/index.ts","../core/src/v3/schemas/common.ts","../core/src/v3/schemas/schemas.ts","../core/src/v3/schemas/resources.ts","../core/src/v3/schemas/api.ts","../core/src/v3/schemas/config.ts","../core/src/v3/schemas/build.ts","../core/src/v3/schemas/messages.ts","../core/src/v3/schemas/style.ts","../core/src/v3/schemas/eventfilter.ts","../core/src/v3/schemas/fetch.ts","../core/src/v3/schemas/opentelemetry.ts","../core/src/v3/schemas/index.ts","../core/src/v3/apiclientmanager/types.ts","../core/src/v3/clock/clock.ts","../core/src/v3/runtime/manager.ts","../core/src/v3/task-catalog/catalog.ts","../core/src/v3/taskcontext/types.ts","../core/src/v3/usage/types.ts","../core/src/v3/utils/platform.ts","../core/src/v3/utils/globals.ts","../core/src/v3/semanticinternalattributes.ts","../core/src/v3/taskcontext/index.ts","../core/src/v3/task-context-api.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/validationerror.d.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/index.d.ts","../core/src/types.ts","../core/src/schemas/addmissingversionfield.ts","../core/src/schemas/errors.ts","../core/src/schemas/eventfilter.ts","../core/src/schemas/integrations.ts","../core/src/schemas/json.ts","../core/src/schemas/properties.ts","../core/src/schemas/schedules.ts","../core/src/schemas/tasks.ts","../core/src/schemas/triggers.ts","../core/src/schemas/statuses.ts","../core/src/schemas/runs.ts","../core/src/schemas/requestfilter.ts","../core/src/schemas/api.ts","../core/src/schemas/notifications.ts","../core/src/schemas/fetch.ts","../core/src/schemas/events.ts","../core/src/schemas/request.ts","../core/src/schemas/jobs.ts","../core/src/schemas/index.ts","../core/src/retry.ts","../core/src/v3/utils/retries.ts","../core/src/v3/apiclient/errors.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/anyvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggeroptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooplogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooploggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/index.d.ts","../../node_modules/.pnpm/@google-cloud+precise-date@4.0.0/node_modules/@google-cloud/precise-date/build/src/index.d.ts","../core/src/v3/clock/simpleclock.ts","../core/src/v3/clock/index.ts","../core/src/v3/clock-api.ts","../core/src/v3/usage/noopusagemanager.ts","../core/src/v3/usage/api.ts","../core/src/v3/usage-api.ts","../core/src/v3/tracer.ts","../core/src/v3/utils/flattenattributes.ts","../core/src/v3/utils/styleattributes.ts","../core/src/v3/apiclient/pagination.ts","../core/src/v3/apiclient/core.ts","../core/src/v3/apiclient/types.ts","../core/src/version.ts","../core/src/v3/apiclient/index.ts","../core/src/v3/errors.ts","../core/src/v3/limits.ts","../core/src/v3/icons.ts","../core/src/v3/logger/tasklogger.ts","../core/src/v3/logger/index.ts","../core/src/v3/logger-api.ts","../core/src/v3/runtime/noopruntimemanager.ts","../core/src/v3/runtime/index.ts","../core/src/v3/runtime-api.ts","../core/src/v3/utils/getenv.ts","../core/src/v3/apiclientmanager/index.ts","../core/src/v3/apiclientmanager-api.ts","../core/src/v3/task-catalog/nooptaskcatalog.ts","../core/src/v3/task-catalog/index.ts","../core/src/v3/task-catalog-api.ts","../../node_modules/.pnpm/@types+humanize-duration@3.27.1/node_modules/@types/humanize-duration/index.d.ts","../core/src/v3/utils/durations.ts","../core/src/eventfiltermatches.ts","../core/src/v3/utils/omit.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/transformer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/plainer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/types.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/class-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/custom-transformer-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/index.d.ts","../core/src/v3/utils/ioserialization.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types_internal.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/autoloader.d.ts","../../node_modules/.pnpm/@types+shimmer@1.0.2/node_modules/@types/shimmer/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/normalize.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemoduledefinition.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemodulefile.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/index.d.ts","../../node_modules/.pnpm/esbuild@0.23.0/node_modules/esbuild/lib/main.d.ts","../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-record.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-equal-considering-writability.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-fully-writable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-undefinable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-modify.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/unreachable-case-error/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/assert/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/create-factory-with-constraint/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/is-exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/noop/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/index.d.ts","../core/src/v3/build/resolvedconfig.ts","../core/src/v3/build/extensions.ts","../core/src/v3/config.ts","../core/src/v3/index.ts","../core/src/v3/zodfetch.ts","./src/apiclient.ts","../core/src/v3/build/runtime.ts","../core/src/v3/build/index.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.global.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/jiti@1.21.6/node_modules/jiti/dist/types.d.ts","../../node_modules/.pnpm/jiti@1.21.6/node_modules/jiti/dist/jiti.d.ts","../../node_modules/.pnpm/giget@1.2.3/node_modules/giget/dist/index.d.mts","../../node_modules/.pnpm/anymatch@3.1.3/node_modules/anymatch/index.d.ts","../../node_modules/.pnpm/chokidar@3.6.0/node_modules/chokidar/types/index.d.ts","../../node_modules/.pnpm/ohash@1.1.3/node_modules/ohash/dist/index.d.ts","../../node_modules/.pnpm/c12@1.11.1_magicast@0.3.4/node_modules/c12/dist/index.d.mts","../../node_modules/.pnpm/mlly@1.7.1/node_modules/mlly/dist/index.d.ts","../../node_modules/.pnpm/typescript@5.3.3/node_modules/typescript/lib/typescript.d.ts","../../node_modules/.pnpm/pkg-types@1.1.3/node_modules/pkg-types/dist/index.d.ts","../../node_modules/.pnpm/@babel+types@7.24.7/node_modules/@babel/types/lib/index.d.ts","../../node_modules/.pnpm/magicast@0.3.4/node_modules/magicast/dist/shared/magicast.fe89c83b.d.ts","../../node_modules/.pnpm/magicast@0.3.4/node_modules/magicast/dist/index.d.ts","./src/imports/magicast.ts","../../node_modules/.pnpm/chalk@5.3.0/node_modules/chalk/source/vendor/ansi-styles/index.d.ts","../../node_modules/.pnpm/chalk@5.3.0/node_modules/chalk/source/vendor/supports-color/index.d.ts","../../node_modules/.pnpm/chalk@5.3.0/node_modules/chalk/source/index.d.ts","../../node_modules/.pnpm/cli-table3@0.6.3/node_modules/cli-table3/index.d.ts","../../node_modules/.pnpm/std-env@3.7.0/node_modules/std-env/dist/index.d.ts","./src/utilities/logger.ts","../../node_modules/.pnpm/tinyglobby@0.2.2/node_modules/tinyglobby/dist/index.d.mts","../build/src/extensions/core/additionalfiles.ts","../build/src/extensions/core/additionalpackages.ts","../build/src/extensions/core/syncenvvars.ts","../build/src/extensions/core.ts","../../node_modules/.pnpm/@clack+core@0.3.3/node_modules/@clack/core/dist/index.d.ts","../../node_modules/.pnpm/@clack+prompts@0.7.0/node_modules/@clack/prompts/dist/index.d.ts","../../node_modules/.pnpm/terminal-link@3.0.0/node_modules/terminal-link/index.d.ts","./src/utilities/clioutput.ts","./src/config.ts","./src/consts.ts","../../node_modules/.pnpm/commander@9.5.0/node_modules/commander/typings/index.d.ts","../core/src/v3/consoleinterceptor.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/iresource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/resource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/default-service-name.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/serviceinstanceiddetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detect-resources.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/propagation/w3cbaggagepropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/anchored-clock.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/types.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/hex-to-binary.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/exportresult.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/globalthis.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/hex-to-base64.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/performance.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/sdk-info.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/timer-util.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/w3ctracecontextpropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/tracestate.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/merge.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/sampling.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/timeout.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/url.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/wrap.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/callback.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/version.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/internal/exporter.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/readablelogrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/internal/loggerprovidersharedstate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/nooplogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/logrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/consolelogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/simplelogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/inmemorylogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/batchlogrecordprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/batchlogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/otlpexporterbase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/resource/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/metrics/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/trace/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/logs/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/timedevent.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/readablespan.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/spanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/basictracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/span.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/spanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/batchspanprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/batchspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/consolespanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/inmemoryspanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/simplespanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/noopspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/trace/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/attributesprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/predicate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/instrumentselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/meterselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationtemporality.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/drop.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/histogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/buckets.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/mapping/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponentialhistogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/lastvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/sum.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/aggregation.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/view.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/instrumentdescriptor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricdata.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricproducer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/periodicexportingmetricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/inmemorymetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/consolemetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/metrics/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/logs/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/i-serializer.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/protobuf/serializers.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/json/serializers.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/otlpexporternodebase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/otlpexporterbrowserbase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/node/otlplogexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/node/otlptraceexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/nodetracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/trace/semanticattributes.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/trace/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/resource/semanticresourceattributes.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/resource/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/index.d.ts","../core/src/v3/taskcontext/otelprocessors.ts","../core/src/v3/otel/tracingsdk.ts","../core/src/v3/otel/index.ts","../core/src/v3/workers/taskexecutor.ts","../core/src/v3/clock/precisewallclock.ts","../core/src/v3/task-catalog/standardtaskcatalog.ts","../core/src/v3/usage/devusagemanager.ts","../core/src/v3/usage/usageclient.ts","../core/src/v3/usage/produsagemanager.ts","../core/src/v3/workers/index.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/webtracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/stackcontextmanager.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/enums/performancetimingnames.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-web@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-web/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation-fetch@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation-fetch/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation-fetch@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation-fetch/build/src/fetch.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation-fetch@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation-fetch/build/src/index.d.ts","./src/version.ts","./src/telemetry/tracing.ts","./src/cli/common.ts","./src/utilities/filesystem.ts","./src/sourcedir.ts","./src/build/packagemodules.ts","./src/runtimes/bun.ts","./src/build/plugins.ts","./src/build/bundle.ts","./src/build/resolvemodule.ts","./src/build/extensions.ts","../../node_modules/.pnpm/minimatch@10.0.1/node_modules/minimatch/dist/esm/ast.d.ts","../../node_modules/.pnpm/minimatch@10.0.1/node_modules/minimatch/dist/esm/escape.d.ts","../../node_modules/.pnpm/minimatch@10.0.1/node_modules/minimatch/dist/esm/unescape.d.ts","../../node_modules/.pnpm/minimatch@10.0.1/node_modules/minimatch/dist/esm/index.d.ts","../../node_modules/.pnpm/@types+resolve@1.20.6/node_modules/@types/resolve/index.d.ts","./src/build/instrumentation.ts","./src/build/externals.ts","./src/build/manifests.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/operator.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/postable.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/statefulreadonlyevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/statefulpostable.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/statefulevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/asynciterableevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/nonpostableevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/evt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/ctx.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/evtlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/statefulreadonlyevtlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/statefulevtlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/index.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/handler.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/ctxlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/interfaces/nonpostableevtlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/unpackevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/swapevttype.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/factorizeevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/topostableevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/tononpostableevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/unpackctx.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/evtliketoevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/helper/index.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/lib.dom.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/eventtargetlike.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/evterror.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/index.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/genericoperators/throttletime.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/genericoperators/to.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/genericoperators/nonnullable.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/genericoperators/distinct.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/genericoperators/index.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/compose.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/util/index.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/ctx.d.ts","../../node_modules/.pnpm/minimal-polyfills@2.2.2/node_modules/minimal-polyfills/array.prototype.find.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.create.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.getctx.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.factorize.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.merge.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/types/observer.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.from.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.aspostable.d.ts","../../node_modules/.pnpm/tsafe@1.4.1/node_modules/tsafe/lab/promiseornot.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.asyncpipe.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.asnonpostable.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.newctx.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.loosentype.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/evt.d.ts","../../node_modules/.pnpm/minimal-polyfills@2.2.2/node_modules/minimal-polyfills/object.is.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/statefulevt.d.ts","../../node_modules/.pnpm/evt@2.4.13/node_modules/evt/lib/index.d.ts","../../node_modules/.pnpm/@socket.io+component-emitter@3.1.0/node_modules/@socket.io/component-emitter/index.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/commons.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/encodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/decodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/index.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transport.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/socket.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/polling.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/websocket.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/webtransport.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/index.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/util.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/websocket-constructor.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/index.d.ts","../../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/esm-debug/index.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/socket.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/manager.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/index.d.ts","../core/src/v3/utils/structuredlogger.ts","../core/src/v3/zodmessagehandler.ts","../core/src/v3/zodsocket.ts","../core/src/v3/zodipc.ts","./src/executions/taskrunprocess.ts","./src/indexing/indexworkermanifest.ts","./src/dev/backgroundworker.ts","./src/utilities/eventbus.ts","./src/utilities/sourcefiles.ts","../../node_modules/.pnpm/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/signals.d.ts","../../node_modules/.pnpm/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/index.d.ts","./src/utilities/tempdirectories.ts","./src/dev/devoutput.ts","../../node_modules/.pnpm/partysocket@1.0.2/node_modules/partysocket/ws.d.ts","../../node_modules/.pnpm/partysocket@1.0.2/node_modules/partysocket/index.d.ts","../../node_modules/.pnpm/@types+ws@8.5.4/node_modules/@types/ws/index.d.ts","../../node_modules/.pnpm/@types+ws@8.5.4/node_modules/@types/ws/index.d.mts","../../node_modules/.pnpm/dotenv@16.4.5/node_modules/dotenv/lib/main.d.ts","./src/utilities/dotenv.ts","./src/dev/workerruntime.ts","./src/dev/devsession.ts","../../node_modules/.pnpm/fast-npm-meta@0.2.2/node_modules/fast-npm-meta/dist/index.d.ts","./src/utilities/windows.ts","./src/utilities/initialbanner.ts","./src/utilities/runtimecheck.ts","../../node_modules/.pnpm/xdg-app-paths@8.3.0/node_modules/xdg-app-paths/dist/types/mod.d.ts","./src/imports/xdg-app-paths.ts","./src/utilities/configfiles.ts","./src/utilities/session.ts","../../node_modules/.pnpm/open@10.0.3/node_modules/open/index.d.ts","../../node_modules/.pnpm/@types+retry@0.12.2/node_modules/@types/retry/index.d.ts","../../node_modules/.pnpm/p-retry@6.1.0/node_modules/p-retry/index.d.ts","./src/commands/whoami.ts","./src/utilities/linux.ts","./src/commands/login.ts","../../node_modules/.pnpm/nypm@0.3.9/node_modules/nypm/dist/index.d.ts","./src/commands/update.ts","./src/commands/dev.ts","../../node_modules/.pnpm/jsonc-parser@3.2.1/node_modules/jsonc-parser/lib/umd/main.d.ts","./src/utilities/createfilefromtemplate.ts","./src/commands/init.ts","./src/commands/logout.ts","./src/commands/list-profiles.ts","../../node_modules/.pnpm/@depot+cli@0.0.1-cli.2.73.0/node_modules/@depot/cli/lib/main.d.ts","../../node_modules/.pnpm/tinyexec@0.2.0/node_modules/tinyexec/dist/main.d.ts","./src/deploy/buildimage.ts","./src/utilities/buildmanifest.ts","./src/build/buildworker.ts","./src/utilities/links.ts","./src/deploy/logs.ts","./src/commands/deploy.ts","./src/cli/index.ts","./src/index.ts","./src/types.ts","./src/entrypoints/deploy-index-controller.ts","../../node_modules/.pnpm/source-map@0.6.1/node_modules/source-map/source-map.d.ts","../../node_modules/.pnpm/@types+source-map-support@0.5.10/node_modules/@types/source-map-support/index.d.ts","./src/utilities/normalizeimportpath.ts","./src/indexing/registertasks.ts","./src/entrypoints/deploy-index-worker.ts","../core/src/v3/apps/backoff.ts","../core/src/v3/apps/logger.ts","../core/src/v3/apps/process.ts","../../node_modules/.pnpm/execa@8.0.1/node_modules/execa/index.d.ts","../core/src/v3/apps/isexecachildprocess.ts","../core/src/v3/apps/checkpoints.ts","../core/src/v3/apps/http.ts","../core/src/v3/apps/provider.ts","../core/src/v3/apps/index.ts","../core/src/v3/utils/timers.ts","./src/entrypoints/deploy-run-controller.ts","../core/src/v3/runtime/prodruntimemanager.ts","../core/src/v3/prod/index.ts","./src/entrypoints/deploy-run-worker.ts","./src/entrypoints/dev-index-worker.ts","../core/src/v3/runtime/devruntimemanager.ts","../core/src/v3/dev/index.ts","./src/entrypoints/dev-run-worker.ts","../../node_modules/.pnpm/import-in-the-middle@1.11.0/node_modules/import-in-the-middle/index.d.ts","./src/entrypoints/loader.ts","./src/shims/esm.ts","./src/utilities/assertexhaustive.ts","./src/utilities/deployerrors.ts","./src/utilities/getapikeytype.ts","./src/utilities/keyvalueby.ts","./src/utilities/obfuscateapikey.ts","./src/utilities/parsenameandpath.ts","./src/utilities/resolveinternalfilepath.ts","./src/utilities/safejsonparse.ts","./src/utilities/taskfiles.ts","../../node_modules/.pnpm/@types+tinycolor2@1.4.3/node_modules/@types/tinycolor2/index.d.ts","../../node_modules/.pnpm/@types+gradient-string@1.1.2/node_modules/@types/gradient-string/index.d.ts","../../node_modules/.pnpm/@types+object-hash@3.0.6/node_modules/@types/object-hash/index.d.ts","../../node_modules/.pnpm/@types+react@18.2.48/node_modules/@types/react/global.d.ts","../../node_modules/.pnpm/csstype@3.1.1/node_modules/csstype/index.d.ts","../../node_modules/.pnpm/@types+prop-types@15.7.5/node_modules/@types/prop-types/index.d.ts","../../node_modules/.pnpm/@types+scheduler@0.16.2/node_modules/@types/scheduler/tracing.d.ts","../../node_modules/.pnpm/@types+react@18.2.48/node_modules/@types/react/index.d.ts","../../node_modules/.pnpm/minipass@7.1.2/node_modules/minipass/dist/commonjs/index.d.ts","../../node_modules/.pnpm/lru-cache@10.0.1/node_modules/lru-cache/dist/cjs/index.d.ts","../../node_modules/.pnpm/path-scurry@1.10.1/node_modules/path-scurry/dist/cjs/index.d.ts","../../node_modules/.pnpm/minimatch@9.0.3/node_modules/minimatch/dist/cjs/ast.d.ts","../../node_modules/.pnpm/minimatch@9.0.3/node_modules/minimatch/dist/cjs/escape.d.ts","../../node_modules/.pnpm/minimatch@9.0.3/node_modules/minimatch/dist/cjs/unescape.d.ts","../../node_modules/.pnpm/minimatch@9.0.3/node_modules/minimatch/dist/cjs/index.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/pattern.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/processor.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/walker.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/ignore.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/glob.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/has-magic.d.ts","../../node_modules/.pnpm/glob@10.3.10/node_modules/glob/dist/commonjs/index.d.ts","../../node_modules/.pnpm/rimraf@5.0.7/node_modules/rimraf/dist/commonjs/opt-arg.d.ts","../../node_modules/.pnpm/rimraf@5.0.7/node_modules/rimraf/dist/commonjs/index.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/classes/semver.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/parse.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/clean.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/inc.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/diff.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/major.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/minor.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/patch.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/compare.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/sort.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/gt.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/lt.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/eq.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/neq.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/gte.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/lte.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/classes/range.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/.pnpm/@types+semver@7.5.1/node_modules/@types/semver/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","impliedFormat":1},{"version":"7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","impliedFormat":1},{"version":"fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","impliedFormat":1},{"version":"8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","impliedFormat":1},{"version":"ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","impliedFormat":1},{"version":"c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","impliedFormat":1},{"version":"c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","impliedFormat":1},{"version":"d6a6e6fcd382a05f787a81a157e66f54f360f81a405015bf07f77a622139ed90","impliedFormat":1},{"version":"f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","impliedFormat":1},{"version":"b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","impliedFormat":1},{"version":"5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","impliedFormat":1},{"version":"a4e9e0d92dcad2cb387a5f1bdffe621569052f2d80186e11973aa7080260d296","impliedFormat":1},{"version":"f6380cc36fc3efc70084d288d0a05d0a2e09da012ee3853f9d62431e7216f129","impliedFormat":1},{"version":"497c3e541b4acf6c5d5ba75b03569cfe5fe25c8a87e6c87f1af98da6a3e7b918","impliedFormat":1},{"version":"d9429b81edf2fb2abf1e81e9c2e92615f596ed3166673d9b69b84c369b15fdc0","impliedFormat":1},{"version":"7e22943ae4e474854ca0695ab750a8026f55bb94278331fda02a4fb42efce063","impliedFormat":1},{"version":"7da9ff3d9a7e62ddca6393a23e67296ab88f2fcb94ee5f7fb977fa8e478852ac","impliedFormat":1},{"version":"e1b45cc21ea200308cbc8abae2fb0cfd014cb5b0e1d1643bcc50afa5959b6d83","impliedFormat":1},{"version":"c9740b0ce7533ce6ba21a7d424e38d2736acdddeab2b1a814c00396e62cc2f10","impliedFormat":1},{"version":"b3c1f6a3fdbb04c6b244de6d5772ffdd9e962a2faea1440e410049c13e874b87","impliedFormat":1},{"version":"dcaa872d9b52b9409979170734bdfd38f846c32114d05b70640fd05140b171bb","impliedFormat":1},{"version":"6c434d20da381fcd2e8b924a3ec9b8653cf8bed8e0da648e91f4c984bd2a5a91","impliedFormat":1},{"version":"992419d044caf6b14946fa7b9463819ab2eeb7af7c04919cc2087ce354c92266","impliedFormat":1},{"version":"fa9815e9ce1330289a5c0192e2e91eb6178c0caa83c19fe0c6a9f67013fe795c","impliedFormat":1},{"version":"06384a1a73fcf4524952ecd0d6b63171c5d41dd23573907a91ef0a687ddb4a8c","impliedFormat":1},{"version":"34b1594ecf1c84bcc7a04d9f583afa6345a6fea27a52cf2685f802629219de45","impliedFormat":1},{"version":"d82c9ca830d7b94b7530a2c5819064d8255b93dfeddc5b2ebb8a09316f002c89","impliedFormat":1},{"version":"7e046b9634add57e512412a7881efbc14d44d1c65eadd35432412aa564537975","impliedFormat":1},{"version":"aac9079b9e2b5180036f27ab37cb3cf4fd19955be48ccc82eab3f092ee3d4026","impliedFormat":1},{"version":"3d9c38933bc69e0a885da20f019de441a3b5433ce041ba5b9d3a541db4b568cb","impliedFormat":1},{"version":"606aa2b74372221b0f79ca8ae3568629f444cc454aa59b032e4cb602308dec94","impliedFormat":1},{"version":"50474eaea72bfda85cc37ae6cd29f0556965c0849495d96c8c04c940ef3d2f44","impliedFormat":1},{"version":"b4874382f863cf7dc82b3d15aed1e1372ac3fede462065d5bfc8510c0d8f7b19","impliedFormat":1},{"version":"df10b4f781871afb72b2d648d497671190b16b679bf7533b744cc10b3c6bf7ea","impliedFormat":1},{"version":"1fdc28754c77e852c92087c789a1461aa6eed19c335dc92ce6b16a188e7ba305","impliedFormat":1},{"version":"a656dab1d502d4ddc845b66d8735c484bfebbf0b1eda5fb29729222675759884","impliedFormat":1},{"version":"465a79505258d251068dc0047a67a3605dd26e6b15e9ad2cec297442cbb58820","impliedFormat":1},{"version":"ddae22d9329db28ce3d80a2a53f99eaed66959c1c9cd719c9b744e5470579d2f","impliedFormat":1},{"version":"d0e25feadef054c6fc6a7f55ccc3b27b7216142106b9ff50f5e7b19d85c62ca7","impliedFormat":1},{"version":"111214009193320cacbae104e8281f6cb37788b52a6a84d259f9822c8c71f6ca","impliedFormat":1},{"version":"01c8e2c8984c96b9b48be20ee396bd3689a3a3e6add8d50fe8229a7d4e62ff45","impliedFormat":1},{"version":"a4a0800b592e533897b4967b00fb00f7cd48af9714d300767cc231271aa100af","impliedFormat":1},{"version":"20aa818c3e16e40586f2fa26327ea17242c8873fe3412a69ec68846017219314","impliedFormat":1},{"version":"f498532f53d54f831851990cb4bcd96063d73e302906fa07e2df24aa5935c7d1","impliedFormat":1},{"version":"5fd19dfde8de7a0b91df6a9bbdc44b648fd1f245cae9e8b8cf210d83ee06f106","impliedFormat":1},{"version":"3b8d6638c32e63ea0679eb26d1eb78534f4cc02c27b80f1c0a19f348774f5571","impliedFormat":1},{"version":"ce0da52e69bc3d82a7b5bc40da6baad08d3790de13ad35e89148a88055b46809","impliedFormat":1},{"version":"9e01233da81bfed887f8d9a70d1a26bf11b8ddff165806cc586c84980bf8fc24","impliedFormat":1},{"version":"214a6afbab8b285fc97eb3cece36cae65ea2fca3cbd0c017a96159b14050d202","impliedFormat":1},{"version":"14beeca2944b75b229c0549e0996dc4b7863e07257e0d359d63a7be49a6b86a4","impliedFormat":1},{"version":"f7bb9adb1daa749208b47d1313a46837e4d27687f85a3af7777fc1c9b3dc06b1","impliedFormat":1},{"version":"c549fe2f52101ffe47f58107c702af7cdcd42da8c80afd79f707d1c5d77d4b6e","impliedFormat":1},{"version":"3966ea9e1c1a5f6e636606785999734988e135541b79adc6b5d00abdc0f4bf05","impliedFormat":1},{"version":"0b60b69c957adb27f990fbc27ea4ac1064249400262d7c4c1b0a1687506b3406","impliedFormat":1},{"version":"12c26e5d1befc0ded725cee4c2316f276013e6f2eb545966562ae9a0c1931357","impliedFormat":1},{"version":"27b247363f1376c12310f73ebac6debcde009c0b95b65a8207e4fa90e132b30a","impliedFormat":1},{"version":"05bd302e2249da923048c09dc684d1d74cb205551a87f22fb8badc09ec532a08","impliedFormat":1},{"version":"fe930ec064571ab3b698b13bddf60a29abf9d2f36d51ab1ca0083b087b061f3a","impliedFormat":1},{"version":"6b85c4198e4b62b0056d55135ad95909adf1b95c9a86cdbed2c0f4cc1a902d53","impliedFormat":1},{"version":"a2cbd7619074b44363cf8df182d5e951db89cae34d5a5676426782d31098ef31","impliedFormat":99},{"version":"e47a8bcff0cb89ef43aa0d4290138a5cb260101d079f69d330410b366a013bb7","impliedFormat":99},{"version":"a52f42e9038ea2d24040696fde6658210ad92688fb1404eb9d2f7e1f6b89b5a5","impliedFormat":99},{"version":"e1e7501e34ba58af8a00fad1455a893fd768d3fbba698fa53a8d61e72f0885a2","impliedFormat":99},{"version":"28296a5ea8028263072c1e0528c9a5557aacd1c89092c2b7440d15451aaf445b","impliedFormat":99},{"version":"b5465d10cc2d064b3f31578182fc41b42e1e84601809d96735885a3b36c68036","impliedFormat":99},{"version":"182a1bad4717a1e96f26aea5c8ce87a5a819ca996f237db611023b9d89f4b5ca","impliedFormat":99},{"version":"af6ace4911b15244a6fb0cf1dcc22e1a89b1486f0e0fb3be7fbb9cb6caa550fa","impliedFormat":99},{"version":"a71d2efbe78d1d5f39b4ef54617b045218d8793fea1e245eb1348286ef8ca483","impliedFormat":99},{"version":"8c57c4f44dc21308fd959f792ff283be24a430d975b922b2feda8f13f0f52771","impliedFormat":99},{"version":"f16d398c7bd6a438497bffb3beefebda5f83f0241ce2cc832787d94d40a2843d","impliedFormat":99},{"version":"a4be2828c686a8a5801c12d8aea0890204963437bec5730f8740099cd1fe8f47","impliedFormat":99},{"version":"7661dacdd52d2448b18ef61fcacc25c721f43186304f7888b3f9f472321725e1","impliedFormat":99},{"version":"e2f39969c89cff97eee3a27dbda04b702b01433c86f1cdc0104db6ccfbfc6355","impliedFormat":99},{"version":"31a8c8c3dd9e43299c50e36674ff70c0234ca712c2492a687cd0bdf09a22fb0b","impliedFormat":99},{"version":"01dd6137942cc1fb6511376d1db1c49e8c07bea46715ffa3af815f2d20462d39","impliedFormat":99},{"version":"2ae9392a6221474bb135eddc8adb531946aa29c67598eb0f5c1ac7e21707a359","impliedFormat":99},{"version":"107244721ecbbcb9d015158adce0979ad8889c6fabb84e407c01e9bc231c88fe","impliedFormat":99},{"version":"f3d0fed520919e8ac1d033aeeae5608da2dacbbd63f5c717d5edd2a6dc91e0c5","impliedFormat":99},{"version":"8e3976e9d3bdb95eaf82a8f53fac9e6823be083a53d3f3939701470c254a1f04","impliedFormat":99},{"version":"eb0d8e96b801b59d5b87c834300a251a5aa6074139b8ad79585e3c01fa1691ce","impliedFormat":99},{"version":"be56e82a3782f2118d7b0c56c770103b259979004a1b92340c6caf150fbee3a9","impliedFormat":99},{"version":"cc8586e3cd56847bacddedf5f924f9ce92c11ae71828ca151f8afd216abe693e","impliedFormat":99},{"version":"805a0e7d0f47e5332285ba8145b9e81b94993461fbb1cfae6b15ffd545ae9a48","impliedFormat":99},{"version":"5b2773644d27ac8dadba762e14e837ebc06b000a725117240f96a159dfc42c78","impliedFormat":99},{"version":"26dcb4bb8795f758a8c2778c68bf6fdb08751e4b4c041b3bbff207aa41d3af5a","impliedFormat":99},{"version":"5f1b7ae9dae3bc04a2b44fd10721d58a9a4aee0633d99f8b3ac351702f47efbb","impliedFormat":1},{"version":"d4c55922007526e6c361c46722351f51dccb6d767496aab702e14eb6ca2bfdab","impliedFormat":1},{"version":"d7a574f5557f3a399c1556410ad2504bfd569a45167476c8be4839887797edd0","impliedFormat":99},{"version":"1bce7c5ce91267ed5114c93fa0725157bd9a20f03911235ee9105e87674ecc82","impliedFormat":99},{"version":"d3a77124d6c2c29c0de8857534c5dc3abc57ade3d6ffbf3707ae1d87c10ed575","impliedFormat":99},{"version":"34b606235de411ef251b68786497592f386e5351818802d4f8e04a64141d3b12","impliedFormat":99},{"version":"91f8d7c73837bafc4914567efd6777307551558989491876034e6f98b62d99a6","impliedFormat":99},{"version":"5b51b59938bd0ca81b50e79de5b2205cfdc49e76dda117636a1d6d61205db8ba","impliedFormat":99},{"version":"166ab5d596e8e097bba5f9d85f574a19f1fe98fb5a36b655ea81db4d024bd0de","impliedFormat":99},{"version":"34addbb9746e63b4f757a396ef174d267c59c9673107192e56fc9fa44355f772","impliedFormat":99},{"version":"0a6b68700031a7b966eba71a17e7efef15a008727959903abd131bb4f5c57e60","impliedFormat":99},{"version":"f54ed46100666f8850e1a0393d71e2057c6dc411895bf3ea1c35c950e5045929","impliedFormat":99},{"version":"9f6bc77840cb01219d0233973552d7fae3a0ccef6e7e6179c014de5ccc044c3e","impliedFormat":99},{"version":"73c7279d2eed2d40a82d9877e25b316ce61f20f3720e038c0288965a70ed5ae6","impliedFormat":99},{"version":"849c701def1fcfd8720d8850d5ea984a3cd4d08204a29c28b0f5ff07062f8647","impliedFormat":99},{"version":"6c4188b9f3998b804c4df6d637ff7d328eaac77ba6b33f4616bd7acc3f04e01f","impliedFormat":99},{"version":"7d263568916984bafa308be74e7400f4010e0e97ea248f66d630929844a4ce6d","impliedFormat":99},{"version":"301c4337a07ab3be97c34bee7eb15a5caaba815a02bbc376f0f2a00c47040763","impliedFormat":99},{"version":"a928314cdafb6ce7d2e420bff316b2ebe6edd9ae470f82c332cc2ac64becdb53","impliedFormat":99},{"version":"78acc3ece111ed7f9dcc461aea6b942d71e10122a5fe0b0730edfb4746eb1567","impliedFormat":99},{"version":"7b356a77218948b0f659aa3a622f0178e9e8cc8c4968b6e509296013980ce5bf","impliedFormat":99},{"version":"60bbddcefe92ddcc0f72a4324ba8d3f40f0242e60b6aa97bc6c5bf1243e6da46","impliedFormat":99},{"version":"9c364f17038ca4191ecbe46e929cc1e7c026ad6c957153438776ffe9998aa78e","impliedFormat":99},{"version":"4b2521490f9183a2bc04d30797fe550404184a581fdd0095675c28f8c80e4097","impliedFormat":99},{"version":"43b5f14a414da28b973b32ce136c260bb92019c8ff4a24a8445630a2bf435cbd","impliedFormat":99},{"version":"82edb64fbe335cd21f16bcf50248e107f201e3e09ebc73b28640c28c958067c9","impliedFormat":1},{"version":"9593de9c14310da95e677e83110b37f1407878352f9ebe1345f97fc69e4b627c","impliedFormat":1},{"version":"e009f9f511db1a215577f241b2dc6d3f9418f9bc1686b6950a1d3f1b433a37ff","impliedFormat":1},{"version":"caa48f3b98f9737d51fabce5ce2d126de47d8f9dffeb7ad17cd500f7fd5112e0","impliedFormat":1},{"version":"64d15723ce818bb7074679f5e8d4d19a6e753223f5965fd9f1a9a1f029f802f7","impliedFormat":1},{"version":"2900496cc3034767cd31dd8e628e046bc3e1e5f199afe7323ece090e8872cfa7","impliedFormat":1},{"version":"ba74ef369486b613146fa4a3bccb959f3e64cdc6a43f05cc7010338ba0eab9f7","impliedFormat":1},{"version":"a22bbe0aeceec1dc02236a03eee7736760ecd39de9c8789229ce9a70777629bb","impliedFormat":1},{"version":"a9afefcb7d0c9a89ec666cc7cccc7275f6a06b5114dd15aa2654e9e19c43b7c1","impliedFormat":1},{"version":"09bc11b53ad8cdeafbc9e689036dca972a188e3ed91ce45385f74bd6d70a2d01","impliedFormat":1},{"version":"e24094fa069365f5b61524e962f8f008e2707fe05e2b170755b14b6ca84ff4f1","impliedFormat":99},{"version":"0030cd149098b3a72487ef56785c99794291d839cf9178c18c3b9a817e57a49b","impliedFormat":99},{"version":"c69cc3387606e9c35150c95c4f1ab3924d85f1c75ba1dc9aa195ae0f333680aa","impliedFormat":99},{"version":"efd57dbf66d763611ad0faa3eba059e11b8bb58044c0711aa1728fea0d4b2ca6","impliedFormat":99},{"version":"fd099c27713fa92cf7aa697b6f7f2b95ee1a98b0802174d766cacc3daeafdefa","impliedFormat":99},{"version":"c6b51dc1de8c2ccab35dae3c92076517b614992d98b40670020d46939bb36eaf","impliedFormat":99},{"version":"bda2186a5f2f0a07e50a3cfd8d85a0744778a5152a3f96d229ed2119f1e28115","impliedFormat":99},{"version":"6905b88a7875372f067a93f89cbdd3ae9d3f2f42fa7366bc4214017b9e6534ad","impliedFormat":99},{"version":"7d03be938e7a53f8b4f732d184fb3eb275e5dbec3a28c75b39960065e77b8496","impliedFormat":99},{"version":"4a353ae985a9d09dfbe3dc356aac32bacc84f4e8d39c271cf5e4fd6797f16baf","impliedFormat":99},{"version":"ed3926abfe677cdef1d9d01090cb9e31883fbbab874c2400387e52f43bc0130f","impliedFormat":99},{"version":"a4446aeada97e090c1134a4d5d12e20a66b424ed6784b175d458701e8a95e6fc","impliedFormat":99},{"version":"1af39e6ade8c28757c5bc04483f06ec60743edea296a75aac2bb14555f09308d","impliedFormat":99},{"version":"31ad037cc2f708a504ae5f00342753a2df3dd49176e8f7af624585afaf711b12","impliedFormat":99},{"version":"4db4b196d99b42ae4f4475b9fef7a4bd9686b3e37d8734e62f650d59e26bc92a","impliedFormat":99},{"version":"aa6346beca6368ed81b40b9a402db2464b9dba5ec3f24e2ea264ca38cd96c090","impliedFormat":99},{"version":"a04890f0d84d22fd5a654ee02c42fe94db43479d9abdfbd46dd88b347cf3b6d4","impliedFormat":99},{"version":"c014a1f6b96a0c6e476294372b6a9210989e4b2a9ea9b052d64b9b374152f016","impliedFormat":99},{"version":"a994a84831fceacefd7a7b09090c9d9398bcd2422ac36e91488a9e03f2b38b8d","impliedFormat":99},{"version":"291a98aa35cca99a5ef42a97344865e5d8d5dd9d7337b612283a87d272b2bb95","impliedFormat":99},{"version":"36c7d6a9249dc96c1345e54ba4335b63af955b817fb0baa4d561caa0c1876b15","impliedFormat":99},{"version":"53eb32877c5b646c0682c14d402bf9742e1bee8d86d57f9f7c75009a09cf9215","impliedFormat":99},{"version":"2cb16816c42c3055a0bb9d8b3c0fbcec61f1d3dd5655eaaa8e6a12d779e75206","impliedFormat":99},{"version":"a27cb995d5c85e8ab069508a9b37bb37436c403ca34798a540338a0dd2f318a2","impliedFormat":99},{"version":"1eee0e089cbf1917413a357d3d8bd2a1b598b9fcd19cc8517812b0f42690e590","impliedFormat":99},{"version":"7220a4508d88a7b3dfe58143dbfc2c368abd0543d4e5d2728afcbcc9c2b96c7d","impliedFormat":99},{"version":"bd008d0bf7917dcbbcdbcb594ddb921561ec69967de8e311d911a0727ce2f248","impliedFormat":99},{"version":"34eaa37b4a48c4e7b45b82a829aa9122ce7f925262b3dd6a278c0a89bc84d5c8","impliedFormat":99},{"version":"967be370f39d7ae0fa1f28707bf3167ce4893aa9bf81dbcece3ce3d2f43deefb","impliedFormat":99},{"version":"2fcabfb093d918876210e80f037ec2c768d0af5501b5be4858c283c28e8d6f93","impliedFormat":1},{"version":"c5d3fd81de19d95a1808ebb9bd7808dd10dd52418b1a1c529f6f4418b8d3352a","impliedFormat":99},{"version":"3713219a0562f0fb3689b10723006d094f3d79633e373f4ab8b441a5401b8584","impliedFormat":99},{"version":"fac0bd8fb7a95cb36206f3dd4c272e343ecd759ab5f2fa30029e22635cb9de9d","impliedFormat":99},{"version":"fcea37d4da54ce2003ef3d287593743d797de193b4069b595e982144ff22b12d","impliedFormat":99},{"version":"1974d9cd45125039b651dfa8bcb9689e8c1d4d8a7dc20db710a27fe0d497fe6f","impliedFormat":99},{"version":"3b29f7d21bd6a07aea9adc06ee9612d3d86fa03663e3364b4d2c067c7f547e5e","impliedFormat":99},{"version":"01545f0274a774e191f06380ddedaec2b2dfbd021ca2e8775f7819959beb2cb4","impliedFormat":99},{"version":"6c557db1095e0588b7d82d9bdd9e4328872d436a94f2025da271d5ef57845309","impliedFormat":99},{"version":"2827790fc4a5c48d032a79a8d547eca0620d7fc7c997b830417f6de5b04c7c3d","impliedFormat":99},{"version":"7bba3bab37aa81a0b9628c26b43c38bfae8316e3e54a9a0572c2eaa7b20518c7","impliedFormat":99},{"version":"cbeb4c46612813c72b39dc7e0d5b897f0e9951cf81252d239ba3d20ce5758643","impliedFormat":99},{"version":"8fa21591f8689152157c9e3449ac95391fe5f31a9770a58bf9c0e4f5ee0d4af3","impliedFormat":1},{"version":"ac8582e453158a1e4cccfb683af8850b9d2a0420e7f6f9a260ab268fc715ab0d","impliedFormat":1},{"version":"c80aa3ff0661e065d700a72d8924dcec32bf30eb8f184c962da43f01a5edeb6f","impliedFormat":1},{"version":"bcf1245c84b2237aa397c74273b6a5e7de8464a07f8403c549f9bac7ae4daacd","affectsGlobalScope":true,"impliedFormat":1},{"version":"617490cbb06af111a8aa439594dc4df493b20bbf72acc43a63ceade3d0d71e2a","impliedFormat":1},{"version":"eb34b5818c9f5a31e020a8a5a7ca3300249644466ef71adf74e9e96022b8b810","impliedFormat":1},{"version":"cdec09a633b816046d9496a59345ad81f5f97c642baf4fe1611554aa3fbf4a41","impliedFormat":1},{"version":"5b933c1b71bff2aa417038dabb527b8318d9ef6136f7bd612046e66a062f5dbf","impliedFormat":1},{"version":"b94a350c0e4d7d40b81c5873b42ae0e3629b0c45abf2a1eeb1a3c88f60a26e9a","impliedFormat":1},{"version":"231f407c0f697534facae9ca5d976f3432da43d5b68f0948b55063ca53831e7c","impliedFormat":1},{"version":"188857be1eebad5f4021f5f771f248cf04495e27ad467aa1cf9624e35346e647","impliedFormat":1},{"version":"d0a20f432f1f10dc5dbb04ae3bee7253f5c7cee5865a262f9aac007b84902276","impliedFormat":1},{"version":"40a2c0b501a4900e65a2e59f7f8ae782d74b6458c39a5dd512fafc4afea4b227","impliedFormat":1},{"version":"4536edc937015c38172e7ff9d022a16110d2c1890529132c20a7c4f6005ee2c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"b750081497a8731c793cedf735f61007bb3a70efbfc12e4cdae90f906f1c5755","impliedFormat":1},{"version":"a3f10b207ac34092603a802aa6d932d22372d571d4649c1d48a074b71da95eac","impliedFormat":1},{"version":"f42365baa04389b983f87a8e14c130ea0ab4a913fada35e8e8e8825a450d4840","impliedFormat":1},{"version":"98ad7367a33f8b7cebad1f8b92e56287b28eda1bfd11f8fef8673980b1090a91","impliedFormat":1},{"version":"be43be05fe9cfd2eb3ce785ef8cbc48737843aac7baf8345c0d8857d7703c996","impliedFormat":1},{"version":"2622d23b82f46eecadc419a286395ddfaaee2f5d533b35127235815ed8807b76","impliedFormat":1},{"version":"406820d111d981e35608f3b6525b8b8a818f2ef83083e8b381f3336d7067a593","impliedFormat":1},{"version":"3bc9a5fc50e1b5678284bf0c8f6319e0cc4910e4ecc1bdb3d490850c9a0859b8","impliedFormat":1},{"version":"e480120d79410e40d95f27fd46da84e12e16b8ff57dda7206a97cb165a2c2213","impliedFormat":1},{"version":"54e4b2a4cfdae8bd4fa66c3baa19af1df604959c81f921252dfc2777e6eebd25","impliedFormat":1},{"version":"f00d9f3635a0f2b6427437b01543ecba1dbf4a5db9adb7d045beb90f8497a87e","impliedFormat":1},{"version":"1611551020c708492c66ffcda9e2b593c3ff91ee8875365c057213a8564ee60b","impliedFormat":1},{"version":"d8158d02e93f868ef402ed06e2a33e419585fe069193905c29e80554e87ac15c","impliedFormat":1},{"version":"ee994010f671930976c04e4ed48f1f3380c51dc009d7846a2ca1e86468c37257","impliedFormat":1},{"version":"8dcf156fc7436c5a104f0ecd75c2f0069061502ce9900607c1667aaca3a6851e","impliedFormat":1},{"version":"afeaa3163ca96eba18a94a8310ea952164ef767d7ae1e3f21b19bad1e204d087","impliedFormat":1},{"version":"9061663f4f28b12ca29ef8940a44ec53d5f9f386e5edee569fdcdfc7e4ca14eb","impliedFormat":1},{"version":"453ea807ecb71949a1ef40b09b2368f3a6a487705f5a2116af925efa2f7e6d92","impliedFormat":1},{"version":"a07ed03a026bf50005a267f7dd20db3797e1662da44ea635d4770420096f02e3","impliedFormat":1},{"version":"a9d62506c38c63df06c007381a4adf5459355ee31a292b86ebea9c836bb7e841","impliedFormat":1},{"version":"7641368980134052046a56141286a4ca7ab30d40fe1ba209cbffce7ddf811456","impliedFormat":1},{"version":"26020fd840eba5d9209e6b07df23d7a9ceb7571fde0c3ae9f443c84619de6a41","impliedFormat":1},{"version":"44357c6a5dab66018d8262a99a67334a0e83037da789bf5495f12d72c18ed46c","impliedFormat":1},{"version":"782ede6abab3148ba43fa5c41c3ac045b81299d306ce06bc27c045c99e375aaa","impliedFormat":1},{"version":"87a4142f849a63088dfbb3a2b67320e497e1ac1a008051e75f32ca0cc75d8da1","impliedFormat":1},{"version":"93bd377447dcc0ddb93afe519b7ca4f0400eb8d1fd11fa49848f7522789bbc38","impliedFormat":1},{"version":"87f7c14cf79d5c5409e1260dfc1dda3bc9b0d13b81f2ff39b820dde587c569ee","impliedFormat":1},{"version":"b9dd0d484906d4444d32a4c70451eaed8d54dfd618cc6f9912f0e20a6b54d7e6","impliedFormat":1},{"version":"353eca851a8aace8404c346d91e350c8ed959759f8fb2a33060ab0d850eed9c4","impliedFormat":1},{"version":"b00498e0f7de6d0b2eaabf6bc6c27d54e224dbde9b8710c37a0c5f9cabff9013","impliedFormat":1},{"version":"993200dc344eac5de024608fe26fbb1cf4764c254229f481ed8aae084f2fe0e4","impliedFormat":1},{"version":"fc23536cabc16a53018f4dbe8be39db84a73cf1c69b85f238b9ae7e09edaa199","impliedFormat":1},{"version":"89163956c437b564e0073e53141646df002e1d57d2e0bc2dbc3b0a4691776c5f","impliedFormat":1},{"version":"4970c3f3f4b6902144173902c3a969517d708ecbd8c50cc6465d4f2c488fad9e","impliedFormat":1},{"version":"9fd0da3a46448bcc367f52f9f57ba10b8eaf06bc9d4f34698298ec2aab991807","impliedFormat":1},{"version":"f3f337ffc81aab30ec297669919e1d606028f7864f6d14fee0b93547b882d2bb","impliedFormat":1},{"version":"c2649fb23b8767464051cf1f92ed0fed53ea7d5cbd6f807a348402e0be37500c","impliedFormat":1},{"version":"0d3646c780151c55b6bcf7c15f66b6769ac554eac2aedf3294edff04a0045cfe","impliedFormat":1},{"version":"8778eb90e3cd6d0e4b36aeca250abb807e009ceed8fde90866afc7568f185646","impliedFormat":1},{"version":"304ec145044d3fd83921ee3bc57f3f9bba7ac84e866aec6bab17820a581f171e","impliedFormat":1},{"version":"e15cc57b8f017cef8e32c06f04b6c724f8681f9442efc2aa4c757464483f32bc","impliedFormat":1},{"version":"bb539d13f42ca588fc5083b94e537ed67fe47449da84d414b14f3d17c7b5c49e","impliedFormat":1},{"version":"592f9ad00e8c3734ecaad7203b05fd72a028aa9fb11e64db927f00d8715476d6","impliedFormat":1},{"version":"0b4046e2e44fbcc8ad9f4e56859ab9874c669249a51217e21d6c2402ff26e615","impliedFormat":1},{"version":"da332d91f1da53266c5eb9af28f0235ab248ad81f68890df1de8b88074b24a4a","impliedFormat":1},{"version":"0764641d314681c58c751f42b47a572115dc842a72072fa868a259a1cc70f6ff","impliedFormat":1},{"version":"3720043192743812e92ee320868617e7f7e55115ea58ad9e5a512c763716a381","impliedFormat":1},{"version":"fa106dbcb508da05acda26c2deb5ecd307fd323f2d491056b980c25d7d9d3d19","impliedFormat":1},{"version":"686c74caa6c90f835616624627be07c4c977c217e400db2d6cab99b3b19681d0","impliedFormat":1},{"version":"33598ffcfddac61cb35af961c6794b6dc03a89fd2e92089113b34dbb42bd2e27","impliedFormat":1},{"version":"1f1852185404db45d03465a19f7c65bb8f2540bfccb6b967cc32779fdf844f72","impliedFormat":1},{"version":"ae51b52a71c70aa77fac061acf81c4da5770ea10a9a1ff5df252eb79d4d93f26","impliedFormat":1},{"version":"55949c519449e0e0c1eb61d34aa42d5297c2e29883b45fd009629e914e856b30","impliedFormat":1},{"version":"0cbc69cf27e58df8b07063583fb2740d9dc664afc058491af2456a2e270b43bb","impliedFormat":1},{"version":"fdcc8e65fff640091ae5db35056ef87a343c373b5b78369ae509be0cda7df5d2","impliedFormat":1},{"version":"9b24babb0bd8d8cdd5e770250f0bdab0b97ad97056b2b59e6104eda349872b89","impliedFormat":1},{"version":"ca3c62ca26416a83e1090706d6df86a089a86b76b5bf561298b1fc5afa65b0a3","impliedFormat":1},{"version":"fde60d698983b343d3ace0742f852622230902ebe5917b1a5aabf7db7f34e3d9","impliedFormat":1},{"version":"9e8147e322367517e09022bf0f00886919b922de4fb4f9b856976a3c0c5597f1","impliedFormat":1},{"version":"430aae2003d27d257031cccff62b7c05468ca2201033f01b712959b47d458049","impliedFormat":1},{"version":"fd8b21234303f04f3357ba644ffd76844f02e70a7f07a290142f11ba71ceab92","impliedFormat":1},{"version":"d10535292b8a83db27138475488a427572a558559bf3be5cad89568c66deb5e2","impliedFormat":1},{"version":"54e98342907a1a0170d8d5dc81e4f05c5f6c526421e930aadd3e30c682498a29","impliedFormat":1},{"version":"1539b21903f2f9049f1f637bfd736d593205100dd3b3d2f7cabf23e6c004edbc","impliedFormat":1},{"version":"b04f4d4736305a8fd1910b01ae9c40d0738d952744d1ec904610d1764efa91af","impliedFormat":1},{"version":"1ad05fc69812ce854a3db895e6f9a72877151ff1e5d8af0ec78d5736afaa1fcf","impliedFormat":1},{"version":"0c11d5e2e654790dfa45f9bc2d3b653fe13c4f7a0c8a1d639a5a924b6e09be8c","impliedFormat":1},{"version":"324a44990de071515cb273632ace64d4f32b72f2d9391e003a63ea69aabd3364","impliedFormat":1},{"version":"31333fe58620f76321cc0153a0aa7ae0408e1b7ca3d1c26d2569ec44b6ee3805","impliedFormat":1},{"version":"6fc89c781ebd4d280c684ce1042c9ebbc4a59cf1ecf5983cfa2eefdd3cd449a0","impliedFormat":1},{"version":"593cc5d6276e32b36088a73756514161b750c2957a84ddf5153935eee3f95e3a","impliedFormat":1},{"version":"276b8af5ab99167e0a217186a39ffa44473beecd9a937057bcad2eb3e21c53b4","impliedFormat":1},{"version":"b760d358d0b42de531509e3bff8a9cffb934e3a2ff0d53fa244b3ebfaaef9f91","impliedFormat":1},{"version":"caac24397bd88bf85b02e42ec561181acab9384d9e2429e1ff3d65abe1567407","impliedFormat":1},{"version":"9efa716140d3e52b0dda513aa7b45252af15617d6b9a6b9a5be786a4f60042a8","impliedFormat":1},{"version":"4558f132688cff22a2acc65f44d277546b55435083141779beb11e993dcdbe13","impliedFormat":1},{"version":"2e4cbb24e294d25e6bd050f1a5d6b86422475c049afc65c3cd777b16c7af88b9","impliedFormat":1},{"version":"3e162b63e35c2007cb0eb3db0ba0fdb45e4185e5417440d79d56fc989aaea13e","impliedFormat":1},{"version":"d4c3c88d6c5bbff05051f52bc7ed0eb391915ca08e049f04a07bd663f4545232","impliedFormat":99},{"version":"6baefc27658b84f6565ecab2259a518671acd9cffef43f58e60c8366ceb9af6c","impliedFormat":99},{"version":"30f228380cf6be920ac3020de1f1ba9357cf74abd9a7ddb4f552b53793422f6f","impliedFormat":99},{"version":"70474b89479c9af715d34af4a47fcfed0a2b2d849c0c3d4206af8c7aa8cd3ea4","impliedFormat":99},{"version":"c6e970337272dad258b653e3795c2cb410e86e5be97b626fb248e7069c5e13ab","impliedFormat":99},{"version":"d8ccec26d01ddcf016e75cfdd11a7d630a5a124cb4d60502cd4d06f351c63e1e","impliedFormat":99},{"version":"3372bad780414017ef08dc46d910eae7989b6f79431187bd4b5ca7906e3c189d","impliedFormat":99},{"version":"49a4a3aa4f4b6aab006edba6b1bb0f9b27002ab63fc8334774a231d42caf1f58","impliedFormat":99},{"version":"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"dd78bfe9dfcadb2c4cd3a3a36df38fb3ef8ed2c601b57f6ad9a29e38a17ff39c","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","impliedFormat":1},{"version":"53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6","impliedFormat":1},{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f85c06e750743acf31f0cfd3be284a364d469761649e29547d0dd6be48875150","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","impliedFormat":1},{"version":"5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","impliedFormat":1},{"version":"d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a30b7fefd7f8abbca4828d481c61c18e40fe5ff107e113b1c1fcd2c8dcf2743","affectsGlobalScope":true,"impliedFormat":1},{"version":"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","impliedFormat":1},{"version":"304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","impliedFormat":1},{"version":"1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","impliedFormat":1},{"version":"98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","impliedFormat":1},{"version":"c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","impliedFormat":1},{"version":"2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b","impliedFormat":1},{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","impliedFormat":1},{"version":"a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","impliedFormat":1},{"version":"d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900","impliedFormat":1},{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true,"impliedFormat":1},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","impliedFormat":1},{"version":"6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","impliedFormat":1},{"version":"56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","impliedFormat":1},{"version":"139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","impliedFormat":1},{"version":"7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","impliedFormat":1},{"version":"2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927","impliedFormat":1},{"version":"257ff9424de2bf36ba29f928e268cf6075fb7a0c2acd339c9ad7ac64653081d2","affectsGlobalScope":true,"impliedFormat":1},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","impliedFormat":1},{"version":"9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","impliedFormat":1},{"version":"e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","impliedFormat":1},{"version":"b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0","impliedFormat":1},{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","impliedFormat":1},{"version":"4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc","impliedFormat":1},{"version":"dbfdf929f7cf84da1abddfb4d4a7aa00e6e1c6ea89668222eab54e9456fe7108","impliedFormat":1},{"version":"5cbe22909f72cb167b110d4c8a78bbe21fc08722ae57029fc67277dae82a64c5","impliedFormat":1},{"version":"366519fb27e60b9a9cf9072638ed5bb6b390562ac21bfd523731b273e2127c62","impliedFormat":99},{"version":"eac647a94fb1f09789e12dfecb52dcd678d05159a4796b4e415aa15892f3b103","impliedFormat":1},{"version":"0744807211f8cd16343fb1a796f53a8f7b7f95d4bd278c48febf657679bf28e6","impliedFormat":1},{"version":"bb5972b72150856c8fc7a1ec00fff1d73d5dc9a8134863d32e9ed07b0d825b5a","impliedFormat":99},{"version":"069f27dfbe4a88a6f86772f234eb15d4c6bb7779f837c8152e0673e0be104fc8","impliedFormat":99},{"version":"8697faa527dd799c5bbe64723aa2593fdd47c609864aa4c49689997cd06cebac","impliedFormat":99},{"version":"b426147fec725961d1305b25b26dbf99e5c419de98b5728974a8a44fc5959181","impliedFormat":1},{"version":"1ee93511c5e298aab9478eafb3491934bad64569c28be6458d949eaf259ec5bf","impliedFormat":1},{"version":"55584873eae27c5607725f0a9b2123cdea9100fd47cd4bfd582b567a7c363877","impliedFormat":1},{"version":"6ce55fa01549c117d456a0533d90b250b70fb51c809d5a08a803d8ed4fd04039","impliedFormat":99},{"version":"33831f1a104f9ab46036d9c6589da4244c5ae0630ebb077e26fe52845caf17c7","impliedFormat":99},{"version":"41e65fa74e0681299ddb050259202083ebb9044ba2b240e3dff6f3c3d55006fa","impliedFormat":99},{"version":"acfed6cc001e7f7f26d2ba42222a180ba669bb966d4dd9cb4ad5596516061b13","impliedFormat":99},{"version":"f61a4dc92450609c353738f0a2daebf8cae71b24716dbd952456d80b1e1a48b6","impliedFormat":99},{"version":"b1adbadd9e2b45fa099362a19f95fec9d145b4b7f74f81c18d8fa1a163da47e0","impliedFormat":99},{"version":"e6d2c107b358421399671d5afc04f9a0993833121c74bcbd3648ac3a65770936","impliedFormat":1},{"version":"8fc45ccdfbc93363323583951b3fd593cc5be3f281743289ed5184b02cf052b1","impliedFormat":1},{"version":"3c7f076370a03c4dad3f8d537a87ac96b73bebf0ec514af1827512c86806a035","impliedFormat":99},{"version":"f4dac5c38306d19b474071753b9ee9b4c5596804fd988b8899630eb475a0c879","impliedFormat":99},{"version":"e38b35222fe9af491e30ea41227da33c391c89aa5c04738451d99f749b8f63a1","impliedFormat":99},{"version":"fa7158f52e83042da94983a5e2cebb0b7c025b0acafd71191e57698f8d9c8b09","impliedFormat":99},{"version":"bab1b5cc2da189d30f00912f4c9da4708f39237e8ed6e135ccc4b64f125afd85","impliedFormat":99},{"version":"a0d6628210c65b46188ad07eabc4991e5a2874a7ecfe5ab612c1d6647cdfab4c","impliedFormat":99},{"version":"db01b68de3dbac4adf9a8c1551da9d349ff13a6655237c4a0bfa9d77bdb0a9cf","impliedFormat":99},{"version":"c68ee5280cc1796f80319acc984ec359002b1af9842e406374a264b36f24a6e0","impliedFormat":99},{"version":"fbfd929af60007de8572b72e98ae87c833bb74d813fe745ebd6f5775550f2e44","impliedFormat":99},{"version":"f8e636042917fa88782f7973b7459f2465c82f90bd6a495adde063a20b9d5311","signature":"3af3d226894a26242e9d69335c321df3428b96d8a3befc67e555ef08021cea36","impliedFormat":99},{"version":"06dd147f2501bcd01cce5b4d227d3d8a06808fe578a17584ad508b73783ddaa7","impliedFormat":99},{"version":"1610dd063b78a0cd43f12144a2c1283d45a7c987a879fddc98cde3fdeafabb21","impliedFormat":99},{"version":"a8965f60e34fd3657c757b7e630309b0af56340922ea5c00e269fe5620e102a8","impliedFormat":1},{"version":"0c3b50fcca48ee42dd50c1348932f14a2d8ffe5bb27fe66b0289edc389d882ec","impliedFormat":99},{"version":"20064a8528651a0718e3a486f09a0fd9f39aaca3286aea63ddeb89a4428eab2b","impliedFormat":1},{"version":"743da6529a5777d7b68d0c6c2b006800d66e078e3b8391832121981d61cd0abc","impliedFormat":1},{"version":"f87c199c9f52878c8a2f418af250ccfc80f2419d0bd9b8aebf4d4822595d654f","impliedFormat":1},{"version":"57397be192782bd8bedf04faa9eea2b59de3e0cfa1d69367f621065e7abd253b","impliedFormat":1},{"version":"df9e6f89f923a5e8acf9ce879ec70b4b2d8d744c3fb8a54993396b19660ac42a","impliedFormat":1},{"version":"175628176d1c2430092d82b06895e072176d92d6627b661c8ea85bee65232f6e","impliedFormat":1},{"version":"21625e9b1e7687f847a48347d9b77ce02b9631e8f14990cffb7689236e95f2bb","impliedFormat":1},{"version":"483fad2b4ebaabd01e983d596e2bb883121165660060f498f7f056fecd6fb56a","impliedFormat":1},{"version":"6a089039922bf00f81957eafd1da251adb0201a21dcb8124bcfed14be0e5b37d","impliedFormat":1},{"version":"6cd1c25b356e9f7100ca69219522a21768ae3ea9a0273a3cc8c4af0cbd0a3404","impliedFormat":1},{"version":"201497a1cbe0d7c5145acd9bf1b663737f1c3a03d4ecffd2d7e15da74da4aaf1","impliedFormat":1},{"version":"66e92a7b3d38c8fa4d007b734be3cdcd4ded6292753a0c86976ac92ae2551926","impliedFormat":1},{"version":"a8e88f5e01065a9ab3c99ff5e35a669fdb7ae878a03b53895af35e1130326c15","impliedFormat":1},{"version":"05a8dfa81435f82b89ecbcb8b0e81eb696fac0a3c3f657a2375a4630d4f94115","impliedFormat":1},{"version":"5773e4f6ac407d1eff8ef11ccaa17e4340a7da6b96b2e346821ebd5fff9f6e30","impliedFormat":1},{"version":"c736dd6013cac2c57dffb183f9064ddd6723be3dfc0da1845c9e8a9921fc53bb","impliedFormat":1},{"version":"7b43949c0c0a169c6e44dcdf5b146f5115b98fa9d1054e8a7b420d28f2e6358f","impliedFormat":1},{"version":"b46549d078955775366586a31e75028e24ad1f3c4bc1e75ad51447c717151c68","impliedFormat":1},{"version":"34dd068c2a955f4272db0f9fdafb6b0871db4ec8f1f044dfc5c956065902fe1c","impliedFormat":1},{"version":"e5854625da370345ba85c29208ae67c2ae17a8dbf49f24c8ed880c9af2fe95b2","impliedFormat":1},{"version":"cf1f7b8b712d5db28e180d907b3dd2ba7949efcfec81ec30feb229eee644bda4","impliedFormat":1},{"version":"2423fa71d467235a0abffb4169e4650714d37461a8b51dc4e523169e6caac9b8","impliedFormat":1},{"version":"4de5d28c3bc76943453df1a00435eb6f81d0b61aa08ff34ae9c64dd8e0800544","impliedFormat":1},{"version":"659875f9a0880fb4ae1ce4b35b970304d2337f98fe6f2e4671567d7292780bae","impliedFormat":1},{"version":"dbfa8af0021ddb4ddebe1b279b46e5bccf05f473c178041b3b859b1d535dd1e5","impliedFormat":1},{"version":"7ab2721483b53d5551175e29a383283242704c217695378e2462c16de44aff1a","impliedFormat":1},{"version":"ebafa97de59db1a26c71b59fa4ee674c91d85a24a29d715e29e4db58b5ff267d","impliedFormat":1},{"version":"16ba4c64c1c5a52cc6f1b4e1fa084b82b273a5310ae7bc1206c877be7de45d03","impliedFormat":1},{"version":"1538a8a715f841d0a130b6542c72aea01d55d6aa515910dfef356185acf3b252","impliedFormat":1},{"version":"68eeb3d2d97a86a2c037e1268f059220899861172e426b656740effd93f63a45","impliedFormat":1},{"version":"d5689cb5d542c8e901195d8df6c2011a516d5f14c6a2283ffdaae381f5c38c01","impliedFormat":1},{"version":"9974861cff8cb8736b8784879fe44daca78bc2e621fc7828b0c2cf03b184a9e5","impliedFormat":1},{"version":"675e5ac3410a9a186dd746e7b2b5612fa77c49f534283876ffc0c58257da2be7","impliedFormat":1},{"version":"951a8f023da2905ae4d00418539ff190c01d8a34c8d8616b3982ff50c994bbb6","impliedFormat":1},{"version":"f2d7b9458a51b24d6a39dcdebb446111cdaf3ebcc3f265671f860b6650c722fe","impliedFormat":1},{"version":"955c80622de0580d047d9ccdb1590e589c666c9240f63d2c5159e0732ab0a02e","impliedFormat":1},{"version":"e4b31fc1a59b688d30ff95f5a511bfb05e340097981e0de3e03419cbefe36c0e","impliedFormat":1},{"version":"16a2ac3ba047eddda3a381e6dac30b2e14e84459967f86013c97b5d8959276f3","impliedFormat":1},{"version":"45f1c5dbeb6bbf16c32492ba182c17449ab18d2d448cc2751c779275be0713d8","impliedFormat":1},{"version":"23d9f0f07f316bc244ffaaec77ae8e75219fb8b6697d1455916bc2153a312916","impliedFormat":1},{"version":"eac028a74dba3e0c2aa785031b7df83586beab4efce9da4903b2f3abad293d3a","impliedFormat":1},{"version":"8d22beed3e8bbf57e0adbc986f3b96011eef317fd0adadccd401bcb45d6ee57e","impliedFormat":1},{"version":"3a1fc0aae490201663c926fde22e6203a8ac6aa4c01c7f5532d2dcdde5b512f5","impliedFormat":1},{"version":"cb7dc2db9e286cfc107b3d90513a0e24276a7f0474059c2694ec3b37a3093426","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"a7f590406204026bf49d737edb9d605bb181d0675e5894a6b80714bbc525f3df","impliedFormat":1},{"version":"533039607e507410c858c1fa607d473deacb25c8bf0c3f1bd74873af5210e9a0","impliedFormat":1},{"version":"b09561e71ae9feab2e4d2b06ceb7b89de7fad8d6e3dc556c33021f20b0fb88c4","impliedFormat":1},{"version":"dd79d768006bfd8dd46cf60f7470dca0c8fa25a56ac8778e40bd46f873bd5687","impliedFormat":1},{"version":"4daacd053dd57d50a8cdf110f5bc9bb18df43cd9bcc784a2a6979884e5f313de","impliedFormat":1},{"version":"d103fff68cd233722eea9e4e6adfb50c0c36cc4a2539c50601b0464e33e4f702","impliedFormat":1},{"version":"3c6d8041b0c8db6f74f1fd9816cd14104bcd9b7899b38653eb082e3bdcfe64d7","impliedFormat":1},{"version":"4207e6f2556e3e9f7daa5d1dd1fdaa294f7d766ebea653846518af48a41dd8e0","impliedFormat":1},{"version":"c94b3332d328b45216078155ba5228b4b4f500d6282ac1def812f70f0306ed1c","impliedFormat":1},{"version":"43497bdd2d9b53afad7eed81fb5656a36c3a6c735971c1eed576d18d3e1b8345","impliedFormat":1},{"version":"5db2d64cfcfbc8df01eda87ce5937cb8af952f8ba8bbc8fd2a8ef10783614ca7","impliedFormat":1},{"version":"b13319e9b7e8a9172330a364416d483c98f3672606695b40af167754c91fa4ec","impliedFormat":1},{"version":"7f8a5e8fc773c089c8ca1b27a6fea3b4b1abc8e80ca0dd5c17086bbed1df6eaa","impliedFormat":1},{"version":"0d54e6e53636877755ac3e2fab3e03e2843c8ca7d5f6f8a18bbf5702d3771323","impliedFormat":1},{"version":"124b96661046ec3f63b7590dc13579d4f69df5bb42fa6d3e257c437835a68b4d","impliedFormat":1},{"version":"55c757a58282956c14fcad649c4221f02c4455b401f5b1011f8b921cbc2da80e","impliedFormat":1},{"version":"724775a12f87fc7005c3805c77265374a28fb3bc93c394a96e2b4ffee9dde65d","impliedFormat":1},{"version":"30ae46aab3d5a05c1a4c7144bc357621c81939dd5c0b11090f69e2b1c43c6f01","impliedFormat":1},{"version":"c477c9c6003e659d5aad681acd70694176d4f88fc16cc4c5bcfa5b8dcc01874b","impliedFormat":1},{"version":"ca2ebe3f3791275d3287eed417660b515eb4d171f0b7badcfa95f0f709b149f7","impliedFormat":1},{"version":"b4fa8bc7aeb4d1fc766f29e7f62e1054a01ac1eb115c05a7f07afa51e16668ff","impliedFormat":1},{"version":"e2a4983a141f4185996e1ab3230cb24754c786d68434f2e7659276c325f3c46c","impliedFormat":1},{"version":"b2216c0b4c7f32e7e9bba74d0223fc9ad3bec50b71663701d60578cecc323fb5","impliedFormat":1},{"version":"1cbbd9272af325d7189d845c75bbdb6d467ce1691afe12bcb9964e4bd1270e66","impliedFormat":1},{"version":"86eb11b1e540fe07b2ebfc9cca24c35b005f0d81edf7701eaf426db1f5702a07","impliedFormat":1},{"version":"1a12da23f2827e8b945787f8cc66a8f744eabf3d3d3d6ba7ad0d5dfeeb5dfbb4","impliedFormat":1},{"version":"67cbde477deac96c2b92ccb42d9cf21f2a7417f8df9330733643cc101aa1bca5","impliedFormat":1},{"version":"2cb440791f9d52fa2222c92654d42f510bf3f7d2f47727bf268f229feced15ba","impliedFormat":1},{"version":"5bb4355324ea86daf55ee8b0a4d0afdef1b8adadc950aab1324c49a3acd6d74e","impliedFormat":1},{"version":"64e07eac6076ccb2880461d483bae870604062746415393bfbfae3db162e460a","impliedFormat":1},{"version":"5b6707397f71e3e1c445a75a06abf882872d347c4530eef26c178215de1e6043","impliedFormat":1},{"version":"c74d9594bda9fe32ab2a99010db232d712f09686bbee66f2026bc17401fe7b7e","impliedFormat":1},{"version":"15bbb824c277395f8b91836a5e17fedc86f3bb17df19dcdc5173930fd50cc83e","impliedFormat":1},{"version":"47500fa93a1970ebd86f552b26e8b502aa12263cbf10f549c45d824bf37c4e46","impliedFormat":1},{"version":"c155ae94698cf0ddc6794fce0787dc436556963fb0289c914d5ff3f63c1f472e","impliedFormat":1},{"version":"f54f0d5c19bc57ba17b690a8121c5cf3a2e8dc887fcf2257f74bd799a097ff9b","impliedFormat":1},{"version":"a61fe1d36e52610853e709fd0dab30de2b53e3d7afe5ad336696492a7eda0877","impliedFormat":1},{"version":"42dbc7f80df0369abc6376234898767a47de30809d40e1668878d47123bd2802","impliedFormat":1},{"version":"7c8266350412c20023ad6f78deccec313c804e82167f1d8367f5403cbf2e9dcb","impliedFormat":1},{"version":"8c4eacbd89171a62110657df3eeed414077e651a01578fea82e56092a0608fa3","impliedFormat":1},{"version":"3de634975d27bf67ff397484ae26e60f1a32b211f4709e921ad3be76c07fa0d9","impliedFormat":1},{"version":"342a37c1b97735df61fdeb2497fde2771bcdcadcaaebdd1d626d4b51d3bc164d","impliedFormat":1},{"version":"07ea97f8e11cedfb35f22c5cab2f7aacd8721df7a9052fb577f9ba400932933b","impliedFormat":1},{"version":"66ab54a2a098a1f22918bd47dc7af1d1a8e8428aa9c3cb5ef5ed0fef45a13fa4","impliedFormat":1},{"version":"ad81f30f47f1ab2bb5528b97c1e6e4dab5e006413925052f4573a30bf4a632bd","impliedFormat":1},{"version":"ff3f1d258bd14ca6bbf7c7158580b486d199e317fc4c433f98f13b31e6bb5723","impliedFormat":1},{"version":"a3f1cac717a25f5b8b6df9deef8fc8d0a0726390fdaa83aed55be430cd532ebf","impliedFormat":1},{"version":"bf22ee38d4d989e1c72307ab701557022e074e66940cf3d03efa9beb72224723","impliedFormat":1},{"version":"68ce7df3ae5d096597107619d2507ef4e86a641c0371f88a4a6fa0adac6cb461","impliedFormat":1},{"version":"f1a1edb271da27e2d8925a68db1eb8b16d8190037eb44a324b826e54f97e315f","impliedFormat":1},{"version":"1553d16fb752521327f101465a3844fe73684503fdd10bed79bd886c6d72a1bc","impliedFormat":1},{"version":"271119c7cbd09036fd8bd555144ec0ea54d43b59bcb3d8733995c8ef94cb620b","impliedFormat":1},{"version":"5a51eff6f27604597e929b13ee67a39267df8f44bbd6a634417ed561a2fa05d6","impliedFormat":1},{"version":"1f93b377bb06ed9de4dc4eb664878edb8dcac61822f6e7633ca99a3d4a1d85da","impliedFormat":1},{"version":"53e77c7bf8f076340edde20bf00088543230ba19c198346112af35140a0cfac5","impliedFormat":1},{"version":"6e0f9298ff05cc206fe1ec45fd2b55a8d93d4136b0d75b395c73968814d7c5ba","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"68888ec4d4cff782a03aebc26ddc821e1f4dffb3a22940164eff67371997add6","impliedFormat":1},{"version":"c9018ca6314539bf92981ab4f6bc045d7caaff9f798ce7e89d60bb1bb70f579c","impliedFormat":1},{"version":"d74c5b76c1c964a2e80a54f759de4b35003b7f5969fb9f6958bd263dcc86d288","impliedFormat":1},{"version":"b83a3738f76980505205e6c88ca03823d01b1aa48b3700e8ba69f47d72ab8d0f","impliedFormat":1},{"version":"01b9f216ada543f5c9a37fbc24d80a0113bda8c7c2c057d0d1414cde801e5f9d","impliedFormat":1},{"version":"f1e9397225a760524141dc52b1ca670084bde5272e56db1bd0ad8c8bea8c1c30","impliedFormat":1},{"version":"08c43afe12ba92c1482fc4727aab5f788a83fd49339eb0b43ad01ed2b5ad6066","impliedFormat":1},{"version":"6066b918eb4475bfcce362999f7199ce5df84cea78bd55ed338da57c73043d45","impliedFormat":1},{"version":"5fd5d02d1ec7d48a180deaefcfec819c364ec4ffddd1371ec2c7ad9d36e8220f","impliedFormat":1},{"version":"526f860ab047358ccdd6cd2de52ebbb0022cdecaf3af842f74fa2dd3a1ab556b","impliedFormat":1},{"version":"1c94de96416c02405da00d8f7bde9d196064c3ce1464f0c4df1966202196b558","impliedFormat":1},{"version":"406cc85801b49efd5f75c84cc557e2bba9155c7f88c758c3fadd4e844ad6b19e","impliedFormat":1},{"version":"6d235f62eb41ac4010a0dab8ba186c20dec8565f42273a34f0fa3fc3ca9d0dbb","impliedFormat":1},{"version":"f7663954884610aeb38c78ffd22525749fab19ab5e86e4a53df664180efd1ff5","impliedFormat":1},{"version":"4ac0045aa4bc48b5f709da38c944d4fec2368eda6b67e4dd224147f3471b7eaf","impliedFormat":1},{"version":"1d2d7636e3c6906a5d368ab0bab53df39e2a6f99c284bae4625b6445c1d799e7","impliedFormat":1},{"version":"9555a2d83e46b47c5b72de5637b2afad68b28670deacdb3b514267d780b5423c","impliedFormat":1},{"version":"3e717eef40648a7d8895219063b1e5cb5bcc404bc1d41a22b91f3140b83bce1d","impliedFormat":1},{"version":"9b61c06ab1e365e5b32f50a56c0f3bb2491329bb3cd2a46e8caa30edcf0281cc","impliedFormat":1},{"version":"8f91df3614625daa000bffe84a5c1939b4da0254db9d7c62764f916ebb93dcdc","impliedFormat":1},{"version":"ee745db646de4c5cf019e495ff5d800ed6f4ee9d9b3aaa7b2c5ca836928bc80e","impliedFormat":1},{"version":"d8d808ab0c5c550fb715641e1f5813dededa9b657e7ed3c3a6665ce7f629273d","impliedFormat":1},{"version":"059a7dfc70b0e875ef87a961d1e9b69917a32a6eea1c3950a5aad8c62d8274aa","impliedFormat":1},{"version":"cf575b64fadf5f646c0f715730c490f317f856f5b3bbe06493638576bad711d9","impliedFormat":1},{"version":"d260a7eae2f0f643fe2de133cfa3e7d035e9e787cb88119f9628099d4039609c","impliedFormat":1},{"version":"6306621db4fbb1c1e79883599912c32da2c5974402531b47a2cf2c19ce61200e","impliedFormat":1},{"version":"a4f50263cd9ef27fcb0ab56c7214ffca3a0871f93ddd3dfb486bfa07aeed55ef","impliedFormat":1},{"version":"f263db23ce0b198ab373032126d83eb6bcd9a70c1f08048e7770dac32297d9b5","impliedFormat":1},{"version":"f6ff0d0ac0bf324dd366aadf72c5458da333fbd44aa1dae825507be3b3b6ccdc","impliedFormat":1},{"version":"aa8f659712fd02d08bdf17d3a93865d33bd1ee3b5bcf2120b2aa5e9374a74157","impliedFormat":1},{"version":"5a06765319ef887a78dd42ca5837e2e46723525b0eaa53dd31b36ba9b9d33b56","impliedFormat":1},{"version":"27bf29df603ae9c123ffd3d3cfd3b047b1fa9898bf04e6ab3b05db95beebb017","impliedFormat":1},{"version":"acd5aa42ea02c570be5f7fa35451cc9844b3b8c1d66d3e94aa4875ec868ac86e","impliedFormat":1},{"version":"4278526ea26849feb706bbc4cda029b6fd99dd8875fb58daeeca02b346bbdbb4","impliedFormat":1},{"version":"9d1c3fe1639a48bfd9b086b8ae333071f7da60759344916600b979b7ed6ffaa6","impliedFormat":1},{"version":"8b3d89d08a132d7a2549ac0a972af3773f10902908a96590b3fe702c325a80ec","impliedFormat":1},{"version":"450040775fe198d9bf87cf57ca398d1d2e74b4f84bca6e5dbf0b73217cf9004b","impliedFormat":1},{"version":"98ee8fe92810ad706b1bfb06441bee284b62c07175ae9ba875589043d0836086","impliedFormat":1},{"version":"49cfd2c983594c18fe36f64c82d5e1282fd5d42168e925937345ef927b07f073","impliedFormat":1},{"version":"310cb56898b50696ce10cff66102aca94c85833bf24effa10c434673c2d57f4c","impliedFormat":1},{"version":"ad62415a113c9a3556e3dc4557a5389735ab8a6b7c7835b11be9b7ae8ada0561","impliedFormat":1},{"version":"8f46cccec5c65f65525d6753c441bdacec11294a63ed05fe251266b51ba81a07","impliedFormat":1},{"version":"6af2b769f0cf81e0af97e428e3b007488c5f8ffd0c055cfc6ea0affe01cb3f26","impliedFormat":1},{"version":"c9c9ff79fc57622fbe6ee5a6311535d1a4e45f7d7bd6a09d68f77758e1563ab0","impliedFormat":1},{"version":"4507eb375ee3a0816f012d84c4bc0171974c862642975e37c2c9cb9c89bd49e4","impliedFormat":1},{"version":"5eefc69318cd391f726df9920ae75e1a4397d779e5cacd446804eb409731ae4b","impliedFormat":1},{"version":"6454633c474931a9b7ff26a0ba11efde4b6bbdc0affa9cb4dede58a4afd3a33d","impliedFormat":1},{"version":"561245d869462531843ff822d91cb0946d1c5d908184b2a9984321a25cad660c","impliedFormat":1},{"version":"be190c89dfc7816db3b8ce05cf9cb439a788b1a2ec52368a21e1c640b88edfee","impliedFormat":1},{"version":"3fbf81d3e7bd2b2fb1a3c94520d288e7ab2967425e927541ce7cf86be4cc2c70","impliedFormat":1},{"version":"1844945d0161178148f2f82e19c726a1f6b6f3b93ae9593fdd13615f1677bee5","impliedFormat":1},{"version":"acf7c4e29a0ea8cce0549393d869330dbe2e24901757e65dd71cb8408387385d","impliedFormat":1},{"version":"d71cdcdb40fef282cd7cab18807c0316660cd7aef26521a1f17883f3fd538fe8","impliedFormat":1},{"version":"dd4f68c0cb17bdc8dc390af94a519510bf6d048b8e093a43b307be384978342b","impliedFormat":1},{"version":"1669d352f1ddfaf5fbed076b17fbd0be5fd7d5524a79d1d27986e6f23c4c30a4","impliedFormat":1},{"version":"9d56b6f06fc6c282de36229cd00fdee2df6a3261044224ee8bb0766965fe6d74","impliedFormat":1},{"version":"4a47c898db15ac283e46fcfb148b968c67a837f45a1c41f6163bc396ca313bb3","impliedFormat":1},{"version":"be0ae1993ee15b7e25b5808a8d34b88c7443e1c2730bae38b2c4642099591eaa","impliedFormat":1},{"version":"b41b52206d064032437936a3708a1ccd5022f524d73ebdd54650b197cd9c5c5d","impliedFormat":1},{"version":"c2b3e96c52ed37ba06e006bfc4655ac89fb2769b5c605149237c8865314b08ab","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"730bc59b59a58a530d2ed0b995776db32a983aa8e1729724ea3e227e8b273133","impliedFormat":1},{"version":"e39514fc08fdedd95766643609b0ede54386156196d79a2d9d49247fb4406dcd","impliedFormat":1},{"version":"e4a4e40e8bc24425e03de8f002c62448dbaefe284278c0a1d93af2bfd2b528c2","impliedFormat":1},{"version":"4e6fc96724557945de42c1c5d64912ebd90d181358e1e58cce4bbf7b7b24d422","impliedFormat":1},{"version":"12ff538504c374dfa9f554c03d19b2a39ae1816a18b32c1a0549d17b2450d493","impliedFormat":1},{"version":"41ca214cf922678daa4dbfbe0f72cc9ac9c9858baced90041a64d4b29430fb25","impliedFormat":1},{"version":"f1541e57cf058caf3c95fab65b55c7dc2de1c960d866123d43c1deb5531dd25e","impliedFormat":1},{"version":"793b9f1b275af203f9751081adfe2dc11d17690fd5863d97bd90b539fa38c948","impliedFormat":1},{"version":"015b9253293cee33a84af9a93ac69e0df829fa7f4fa7e73e13bb247e68875d90","impliedFormat":1},{"version":"e017ece383491a42beefcf762344e98c7203c03993168b5b3ebb183a2b2f8602","impliedFormat":99},{"version":"b3105fad266021c1e297b5799931d87bb398dc277c65f8351d703c20fae0a5ad","impliedFormat":99},{"version":"49def90724c7b946566b2fa044703a269482befb3f86c5301423ccd87b2577fa","impliedFormat":99},{"version":"bd52e1f4cda69c2627f8bba50d26cdc61baaba5161fe7f9c6f80da13ca0d8be6","impliedFormat":99},{"version":"a78f50e337f69300a4180f5559154054364eb3291146c2907f21d4371f8a70b8","impliedFormat":99},{"version":"641ad1cf893d65bdc0c824dd3df204de60f714c80371986d83002e2045dfdb0e","impliedFormat":99},{"version":"bda1b258b774dbb246ec54308fdce2c89ffd6e9738d9d3fd37dceecbc86dce74","impliedFormat":99},{"version":"01feaae3ce24ca01593f6f8ebd6ee56772d084454a7ca64c45c4fa0e0cb47cb7","impliedFormat":99},{"version":"d2d264f396b4f688df90eed2c6ca34a0184f441d19a95db71f0f3663eff880cf","impliedFormat":99},{"version":"5d932f5561a979964fce8f93e5eae98884d4bc8b819497dfceb8a9d4d5f46d0a","impliedFormat":99},{"version":"06a0fe3fdcc7af16de9bb72557ea8ae3f9f5bea1d18e48ac862f2b1c54a23a97","impliedFormat":1},{"version":"8a500e42a18196b97200a10ce6a4ae344635033b1cb7055a1015b13ab98f4d67","impliedFormat":1},{"version":"5c29f295e044c671b50ae7b9b03ec55391931f1fc5ae64aae4ac7e123daaf79d","impliedFormat":1},{"version":"ef2b41aee9b88d0a1db3ac9d70faf0f3eec9ed6027f2cc56bfc68755c4040db0","impliedFormat":1},{"version":"b3cbf35da2e1b476dc51f203d1e884497905366380786e133bad6ee8b8d55e4d","impliedFormat":1},{"version":"3002a2da523d510465e43692aad18a17bb6c36c176732733e12eeae423d3951b","impliedFormat":1},{"version":"78a9a1ea6e379e38e21e8a712cecd63e3ea7f872c182038db65d1a37d5920f86","impliedFormat":1},{"version":"d7d8f35b6c8380607f93ddd598b60d0b6ed28e85227c211376039f6a7234aab6","impliedFormat":1},{"version":"f2cd90af0e0db4e65fa03b01f9c760f253bb7c861ef9d28c9814e03badcf956b","impliedFormat":1},{"version":"1af39e6ade8c28757c5bc04483f06ec60743edea296a75aac2bb14555f09308d","impliedFormat":99},{"version":"1721ed47b527193b6d2bc50f440f3cc0e3342b51c54bdf70c0dd4a4b9163fc97","impliedFormat":99},{"version":"56326d2cf939c385c5184e429c80662d2c63806736fcfdf3434a4e53577cab5b","impliedFormat":99},{"version":"a2212a06fa9f29ceda411a41ead0d2c6cb2d714f506a51b4375572cd81a82cb9","impliedFormat":99},{"version":"f0a0fb8844039b8979f5d87e1625bba7f1e38407566ced10e8c45a6898a46fe0","impliedFormat":99},{"version":"f6d820fdd885f80871151f909626399e4f8f0b53dfca7636e363cb4c74764df9","impliedFormat":99},{"version":"0d17dc7966027bf9e474f7988a6b2e50039d2ae7d508c94f4258b5fec3ddaec8","impliedFormat":99},{"version":"f238304eb8b6c4ad19f9bd10a4caf56ff1e2c3d76406f2aa516242c1f62cfea6","impliedFormat":99},{"version":"4338ae137f650fbed4d97f5ed088639a66bfa3afdaadfbe99a30bce2d9b176ab","impliedFormat":99},{"version":"cd95856972fd74e031275cd6bf36e629a4633fa3ebca24becb4b1540d13f817a","impliedFormat":99},{"version":"449a20ae68dcb13e742c121206407acb3638353570ff0196facfea6153ff461b","impliedFormat":99},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":99},{"version":"5bd0f306b4a9dc65bccf38d9295bc52720d2fa455e06f604529d981b5eb8d9dc","impliedFormat":99},{"version":"f30992084e86f4b4c223c558b187cb0a9e83071592bd830d8ff2a471ee2bf2d4","impliedFormat":99},{"version":"854045924626ba585f454b53531c42aed4365f02301aa8eca596423f4675b71f","impliedFormat":99},{"version":"5aca5a3bc07d2e16b6824a76c30378d6fb1b92e915d854315e1d1bd2d00974c9","impliedFormat":1},{"version":"b897c1933bfea99fee17da0366ab2abd69078265a34d998674d873df31b6d270","impliedFormat":99},{"version":"f6f17d2f173fe27c8979d8a075f53b752b6e77fbbe4498b7c164202b6f488341","impliedFormat":99},{"version":"dde88cb2c8656ca653d89c0d29bedc26193c60ef6ad7f55447528a794559205d","impliedFormat":99},{"version":"1815a4fe21ed564add8bd0741df67d9efa92d800aae953869f616f6d5ca20870","impliedFormat":1},{"version":"09bb82a3209f36c4aaef67418d3dc6e283238037e01e73c858ddfa6f17f2a258","impliedFormat":1},{"version":"7ef19b5da2f1021812a9d5da70b2c5706e8281ef5a34e2f45cc65a6f5f82651f","impliedFormat":1},{"version":"0a0d5400b9cc57d1670c560d90deabfc9e8213017513100b7e531abd6ddf4031","impliedFormat":1},{"version":"d6713dfe9cb00c1e267a5df18b28de39d4635ceb4eb0e73d0673fa5b5414a927","impliedFormat":1},{"version":"ae7320787bd244193b06b50ba3e8ff9b9785423a3744f0cd95c12ba7236ae743","impliedFormat":1},{"version":"d2a68d871f2f52b0e422f645fa4e5a2561293e7a29f9fda69cecdb3d6d9e8be2","impliedFormat":1},{"version":"e2bcb02d7871e1b9cdbad68234aa7b5c6fba079ec581a3b5a8f8e3d17b07318f","impliedFormat":1},{"version":"3c3778cbf0a8bbd2077102c4035fd9be5a4d0fbfe58d1e8da1e51a12f691217d","impliedFormat":1},{"version":"f7e17453514ae560c177116133af8fc22aa24f8d030ab54d69b7bb49011283db","impliedFormat":1},{"version":"15512c8dc4a2c97ba35db379b3c21354b81bdab79ea5dd049d3f7d2d24172752","impliedFormat":1},{"version":"320cec276b7c7333d43c6c384553cce14fbf673b920e8fd57044691690f4bb76","impliedFormat":1},{"version":"afc1ee00655bbe4cc3215144d805877ff3917e891cce4aab49d8ce69decf52bd","impliedFormat":1},{"version":"9a807426dcc735d7d7daf4eca79e055a716996e4446acf9a565983de002a6c9d","impliedFormat":1},{"version":"84583b6389931f8d97785fdea9e065b64ae32d73706db018a19a653f9bb6928b","impliedFormat":1},{"version":"9663f529cffee3b899ec8cb58702cdaa3b1411131bc94e20942821c114e3a406","impliedFormat":1},{"version":"d6652e5b8025401ae818e572673a160b93e6da24ed5169178ea277319a8b1ce5","impliedFormat":1},{"version":"c75d82dd8712658daea6f57519eb50f98d69099847f978c481b47bde87c27c14","impliedFormat":1},{"version":"2e49e83fb6ffde8a1b6318bd1c85058a81a1f66246161e517034d7ebc7b32728","impliedFormat":1},{"version":"60c9d5b4b82381da12c4f4538305a01d3eff0a4516f3536c31a9e7d1e6ed47fd","impliedFormat":1},{"version":"319f1f2d6a854530b37511fa20710c9a099a146f49918ed241f4e79c915ebaa2","impliedFormat":1},{"version":"1988a964719eb23ca0d7b834fc3008d8e49ec2fc28284b88064259b41d3f6c6c","impliedFormat":1},{"version":"2e34b82fb73100e9810f1f5a6a0cf7339a79ed1e3ac74ed08027c794e73851f0","impliedFormat":1},{"version":"46976b2406118fde0ab93c5ee01a3fdbf1c7a017a5d8dbab45f34556c2bab918","impliedFormat":1},{"version":"eb38b0856f8b1476c114d0096e17a267fc5b5a8643ca4cee56ea4dd8f6629eae","impliedFormat":1},{"version":"69504253f6463fdd258c42c87228741d8f18a992181470398ff53d224da02bb8","impliedFormat":1},{"version":"75ff0715ea56597240ab2f258416ec178bb5997886702a906560451994e987f1","impliedFormat":1},{"version":"e72ac692d526ac23d469a5362ef0bd9b6174cb78d79d25dde81bc1c1957e1a96","impliedFormat":1},{"version":"32526fc4b2b3f61f254c5e6b69e3e25c6b1d67e1ee4daa1e9bf843121993c883","impliedFormat":1},{"version":"08f67b4e8109c53db3d04357c72eb7f47bc6d3a25f40461b27bf4433cfeb67d9","impliedFormat":1},{"version":"e93fb43d383f07656e73b73df72e3f0eb791f4f0198dd20246043e0367deb680","impliedFormat":1},{"version":"95aad6d32e5ec5bb9d11ab03d5824b767b691221cde581808b23975e3b54cd8b","impliedFormat":1},{"version":"6b9d4ef1007e8497cc410941b4893d1b316f1b7e2207b37d0ea44097c09edd4b","impliedFormat":1},{"version":"0f5e58769a3f875171488a44097776074ffa916317dca7a320cd8bd4e992e01f","impliedFormat":1},{"version":"dab19cc0ea2f923ab37eef79545b8fa8579079fadbc06b6080ac0bd01d72c9e8","impliedFormat":1},{"version":"84c4bf530c22d98ae09ed64c7e5fc532f12ebfd571018e6934149f056bc71155","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"e0b42053584d0a38d447eeb4ed53893a9d0f8d42497ecf73c1202b5c7bf81a60","impliedFormat":1},{"version":"d3a3aa4f715b4a6d5236253ab3e5f8e7f0dc06af58555f561621f52bb77b79f8","impliedFormat":1},{"version":"c2eb03a26a893ee9a8f32b048091aa89d97c1d5d7c5b80b155a3b1dfdb8003e7","impliedFormat":1},{"version":"d656a2a292dd6fe9c882fde399435b8283360e3748dc294b0773714b95f66530","impliedFormat":1},{"version":"ff0ab6364048531b98fcc87672a26c066f2bab5c34b40ab471e3a3f0bfaaa038","impliedFormat":1},{"version":"855d49c4569eacc223cdb06f4cc29fc67ffda5856161987437d85ca0e1d4dc8c","impliedFormat":1},{"version":"ea7aef2762afb5a34341f98a8281b770b5e4002695f58794a7394a0942523ea6","impliedFormat":1},{"version":"f1af4692fa75d702066a4ce4bca8ca8eb358cbb81b49943e978aa57ce1885b08","impliedFormat":1},{"version":"40981294bf805b4d65b835a4a8a4797359f223d02f1da8e91187b13d755553ca","impliedFormat":1},{"version":"57cfe4d05e9bca280c825dd60ac3ed353833131a3ee819931f80d55b0ba2161c","impliedFormat":1},{"version":"467bcea8d01a58e40f79792a17e061fd3b36c91d8d48f08c01444f35196a00c3","impliedFormat":1},{"version":"e7857655ed271845f4beefa9db3f254d1117b1dba7147baa66b5b8983628db4c","impliedFormat":1},{"version":"3531b7405193f569acbf686b9d72324d2981704abcd0d1768726142a73fba9a8","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"23b9d1e5645e981d55197e659c5b206817f84c534cd974a0cdd329b2893d88d9","impliedFormat":1},{"version":"0fde525b372bfc7a50e45a6edc682937cda56c2d9aca70c072046f00f4bfdc47","impliedFormat":1},{"version":"14ecfc29e0c44ad4c5e50f9b597492cd8f45a2a635db8b5fe911a5da83e26cf8","impliedFormat":1},{"version":"bd93a3a1fabff2b95fe9442989cafdda76c3c8949ae1fc4bc75a92d04396d9e2","impliedFormat":99},{"version":"02ed2766d79a00719ac3cc77851d54bd7197c1b12085ea12126bc2a65068223e","impliedFormat":99},{"version":"4b84373e192b7e0f8569b65eb16857098a6ee279b75d49223db2a751fdd7efde","impliedFormat":99},{"version":"4beaed44904fb7a63bb00f17c5703baa79282e0f03b849bcae6af55fcbdb589d","impliedFormat":99},{"version":"7c37569e586a3276ae7cbc405c9f1c51efdf3f603cc8b76dd2196d1b01c2f9d0","impliedFormat":99},{"version":"bef359bd6998f4ce186f7450ec3fbd9cf47ee3097d75c26828b6d985c843a48d","impliedFormat":99},{"version":"696a04758e6c58966e18bb99a64292017fac57f0ba5482e1bc0b617be850b12e","impliedFormat":99},{"version":"46fe6faf3d6907bb675b5c37df15b6021b9ca1e4f91b25ccc422630b4c1568e3","impliedFormat":99},{"version":"c45a995ea8fd0d701c3e013dcf7a106809d9b1517c7115ade3f58d4196bd350c","impliedFormat":99},{"version":"0332891c6714ceea22d919677ba76e7875f4be1104dc1c2a19b9359b7a2e08e4","impliedFormat":99},{"version":"38a217719a1e847d3b56f0e513075f07740ea536a838c332d02b2ce4288f23be","impliedFormat":99},{"version":"d51809d133c78da34a13a1b4267e29afb0d979f50acbeb4321e10d74380beeea","impliedFormat":99},{"version":"68745f37d24b1b5800c45d0c5c00abfcbb031f9be0bcecdafd29405667397abe","impliedFormat":99},{"version":"fccc4725f7937821ed7744c796c090963929da13a497a05a58ba478d1c1442ef","impliedFormat":99},{"version":"7537e0e842b0da6682fd234989bac6c8a2fe146520225b142c75f39fb31b2549","impliedFormat":99},{"version":"75e7f3ceea520eb800e38806fe4be2a37747597d837602657ed809840d64e9e8","impliedFormat":99},{"version":"60fbce4fe62a585d67228f8c1e43e7f1e5493519ac7f3d0fb383d95c1f690a1b","impliedFormat":99},{"version":"ec680627cfcc2c14c92a3771593020cd6ef28b20ac2c11595c788c22e5ed8825","impliedFormat":99},{"version":"4bf23205a5134b5cb091f32ebd7affd760654a2b8cb97c9fa88f7c707a9ac2bd","impliedFormat":99},{"version":"b2f9961e315ef33571dd9bf260954d490a102415bbe2fd9d1bef851a02349c25","impliedFormat":99},{"version":"da8fa56052507a3beea2fb7042c4c5bb8ac42e2e9ff33c8b42b3b518a4842f1f","impliedFormat":99},{"version":"b26eecf17ac0c18014cc89f48834eea70477c0ed7c635ea07dab4d8fcb2fbe93","impliedFormat":99},{"version":"dfef5af5a05c7db3212b693e915f851e063e82b9d48c4496d34af53a97bab0e0","impliedFormat":99},{"version":"cb6be797eb80b11a3f83d203f83487b0a902a3e69362f7dc067d2fe7b209f875","impliedFormat":99},{"version":"dea673b66b920ea65ed79966bac4f2350f0bbd4bd5b840fd4ade1ecebe1df91e","impliedFormat":99},{"version":"4103abe01e6f32503d7956e096d9068d5f446657b6199972a3fcdde75c9576f5","impliedFormat":99},{"version":"8542c8fade39aab62e446e56e74c398106d051be0d93650d4d8ccb06eda0f180","impliedFormat":99},{"version":"67c7763f019116e1bfd7d6a48b45875171eaca5bc7ccbbcd9aa48344afbd768f","impliedFormat":99},{"version":"8d92256e9f21c19ad9f3a60371f642a09bac8337f6b700535bfd9a53b133aced","impliedFormat":99},{"version":"033e8dc00e47d136e59821af574edc8a706e54ea6221a1ac89b0dbe3be75d2df","impliedFormat":99},{"version":"10de5203f810023efd1858a0c5738909ead3869b87ce3845cc54ff4e62b53a73","signature":"f4afd6c12f0021f33713055ce9810ceddd930ca8e4dd23ad64323da2c989380c","impliedFormat":99},{"version":"0ab09caf121e399894ed0931c8671b242882fd3bd1b0d13fbbe9a3ff26da8e25","impliedFormat":1},{"version":"d01fd423c817f863ec41aed05cd85b283456bcea843016d4f4f8aceb2af0fec9","impliedFormat":1},{"version":"77c5c7f8578d139c74102a29384f5f4f0792a12d819ddcdcaf8307185ff2d45d","impliedFormat":1},{"version":"d4bab662ee32cc259629ecb2cb00c87f0457045c51c86ce43a77075c3eb32330","impliedFormat":99},{"version":"f634e4c7d5cdba8e092d98098033b311c8ef304038d815c63ffdb9f78f3f7bb7","impliedFormat":1},{"version":"e483df764d57fd33d327530920c837893132940f314573dbe98a3ee249097e10","impliedFormat":99},{"version":"3e1c75655fd2f994f41a26e47ca3fee216b01489f4bb63a0bbd43538b80ef9c2","impliedFormat":99},{"version":"d343b342883f8afb9347e84ae2a6af0706bb13e61a29d279a2469b41740db3d7","impliedFormat":99},{"version":"43cdba5299f8ea543367f1fbd6cb0eb629194d8223e7e687289aabcd1406efa7","impliedFormat":99},{"version":"0da58bd7d1c2377f67498932c6cdf08bbd8f56d118e5422e98b22fa92e7f9e06","impliedFormat":99},{"version":"ae62a1c5f5a1a6f6fefa6a6153a81796d65d4c7ae4f5db562e9e800ae00f8415","impliedFormat":99},{"version":"7a0928f97798ef22e5c14cad5084de414d226c1627bc78c86113a5090df31f0d","impliedFormat":99},{"version":"0f2ae04073b443c64f86d3a0126824f68d059b0b3d9f2cbd7910cce9f5f6959d","impliedFormat":1},{"version":"1bcfc25d642c74f6509123fb8ff0f5213d32ff37e48c7dfa608afcfc4b89c084","impliedFormat":99},{"version":"6239a596957325226e6d9377f911b704d2a123a3fdcc1b2ecf4f8cea841655ea","impliedFormat":99},{"version":"a3f265d2241e50e803d63c91a8d8a940209a33be034b444ba6b023877f1ec94d","impliedFormat":99},{"version":"93a98ba747d8637f2e65250461ff910355f755caf6a29744def94b1c0636843d","impliedFormat":99},{"version":"510616459e6edd01acbce333fb256e06bdffdad43ca233a9090164bf8bb83912","impliedFormat":1},{"version":"b506b92fdfd66b7386f1f749e85c7cb2fc9dc95828e679d4a78ee9520c1db265","impliedFormat":99},{"version":"a3cf82d743cf4957f3e67abed29bddad61bbe6719395387bc03e73a350bca55b","impliedFormat":99},{"version":"11df923a4336e0511ea2c659a92b562dcb27c2f34e15d22fc128dab0c78a6f65","impliedFormat":99},{"version":"b66ade632d10c119189e9665a9133828d0b491795c1e5c0918e3ad377f08b8b0","impliedFormat":99},{"version":"99266c752dfcda9edb4433c77b8f3426913105dadaf096dda3afdeeb7de610f3","impliedFormat":99},{"version":"01b61284a7bc0c4842543e6ad1fc6b06626f08bd368558f183fa5422bcccc137","signature":"20c2077de2104c1c5d3b03abcda91b7f3511057ea0068ba36af0e7b87ae8f175","impliedFormat":99},{"version":"979fa09cf9942037df5639b40116dcf89f47592c26cb48a1824d4273b47d9e5f","impliedFormat":99},{"version":"4d82dad8d8a312706a9bc240c805088fef713bc71eaa622e55970e251b6c1a0f","impliedFormat":1},{"version":"f35ff988cfa7565250b75bb6b5770b11b7c0d1b0825a33532a798ebd7d724fac","signature":"b2ff87e6e448fa839dadb584cc76a2fca2d4cb56fb85603d6f10628f0a15ea7f","impliedFormat":99},{"version":"bebde3e6cfe51b4418ebc732359384adf2e9fbdc55acfcd73ffc4afb4bf75fc6","signature":"d16282a8a5b6de4137b4293222e5f209afa428c046b0860c1289bffcd452b200","impliedFormat":99},{"version":"a51f54153dbde122f4615fbf139e4a5922c6e35254f89113e5c94a0560b63ca6","impliedFormat":99},{"version":"4c96cfba2b8456ef5d4212d70db352a2cd5ffb6e9d3b909956997097b0ae63a1","impliedFormat":99},{"version":"dc3fdfd6a776dbfc524fb5164e3693dd11468f9181abd7c8d43c040b5a5fdfc4","impliedFormat":1},{"version":"180487b2ec227168694d3f8ca6360ec1d7772accc8c72e7a3a5e29fa184bc773","impliedFormat":99},{"version":"490c584e06adf63eac2b66e519bd94c420cccbf123a400874f878107c7483202","impliedFormat":99},{"version":"b8b5fbb6398719b4392feefad9549f56da48dcb6e86fbe1eb77e3b12a1b46315","impliedFormat":99},{"version":"8578479e73ca265ff08b7b9479c2efcc8fa51e1ca9c4591326fd73af672aab5e","impliedFormat":99},{"version":"c562f5082b68cf33357acb28b6ae9b72c83eb781a771183404a835392946e20e","impliedFormat":99},{"version":"47c3641f713a8920650ec15329b60f25d811ebb0898d6857ad8fd21c2ec9731a","impliedFormat":99},{"version":"049b31deabf3bc9ed59f9c6b783e86c5c4233121cba7902ceea7ec033eeffc23","signature":"ba573d5b3e74fc4c98a66156be08ba55a9abc100677321893e861f99343d0583","impliedFormat":99},{"version":"5c664f8e9a81c4c4e9ec6a035ad211be2bd4b286c4a50c713430cbdf88395fb8","impliedFormat":99},{"version":"19d12219608995f846cbfaf4f7cc143e73822f0eb27f7231b1441783b248f1be","impliedFormat":99},{"version":"4250e2a4db9e0edb16e66743dddcd7a8f0202a3b86f0590adfdb62563560d59a","impliedFormat":99},{"version":"f0e7b019de4bbb51d1bcb706f692f36d683aaf8df542418f57dd0f82507e7e26","impliedFormat":99},{"version":"2887592574fcdfd087647c539dcb0fbe5af2521270dad4a37f9d17c16190d579","impliedFormat":1},{"version":"f5858a3e4621139b8a375fb79a482c633d5f31d744f3674e3d51a4ae291c8f2b","impliedFormat":1},{"version":"56d973b2d24ebc9eed24dacc4314fd7104f4f4f48859ac1989aa79f8c48b6bbb","impliedFormat":99},{"version":"5ddccde677e46b6ec383570b1f7a3020e56d330cc861f268e9e3dd6d9db59e78","impliedFormat":99},{"version":"a36da131cfdf92b9fdfc5f9615c9ef6927e0556b1c854e7047168fdd09b8ef0c","impliedFormat":99},{"version":"0abc145ad160b017474b634fdc4f078bb927676eba496d43e16419a0bcd4ac11","impliedFormat":99},{"version":"327d1410497b2e59e2e9d289e38d3ea6649424246a7bf06af6dceb6b325cdbd2","impliedFormat":99},{"version":"8442636337af073b3914bcac51cb37cce30cd6939a435a03557e0945cccbe7b0","impliedFormat":99},{"version":"32cbe201bfe8ed7f4c323fb8a3fcfdfb451f22e84d3c49da33ceda2fbf9230be","impliedFormat":99},{"version":"57a57c130dc597c5e65c27d203e915ebb194d3d6cb21f4bd20bb4ffa6da57810","impliedFormat":99},{"version":"9b8504d83696efbf20fc97d14ae71bde4ca5a0c957657bdb4db0496353a27234","impliedFormat":99},{"version":"b536ec7c1188023add680f8c86d17fc8b8462493e7f85f2303fd8e5f9acd7345","impliedFormat":99},{"version":"00635b715d343e7a970fb536256fa9689d5cc0160c6b671a8ec622b7f1ac13c9","impliedFormat":99},{"version":"1df8a60ea1b1ca29697bca90b23f1f6314bbff7968e364710c4d2ad3eff92db4","impliedFormat":99},{"version":"7d4b301f8371224d1406703429b65468a8b8a74bd7a540154221e1fe6fdfc7b8","impliedFormat":99},{"version":"e92998af5e032c1dc14c837a0d8823e162280b2c2d2f3be9e2dbe5f5d68ce51f","impliedFormat":99},{"version":"6777c666af08ea025f5906ffeacf0985f54b8f51b1bb47fff9cf7327d63e3ee8","impliedFormat":99},{"version":"153e0f456246ddbfcdf96b396196223f61e822f322181aa7f9743f335b345c2e","impliedFormat":99},{"version":"27bad973d7921bbdb09accceb07f014857435996d29ad9e90ee2d2d22874a9f3","impliedFormat":99},{"version":"f097c3b9d99d7d902e28ee2c6a03c242715773886b7c5a66065a7124689d1d55","impliedFormat":99},{"version":"2375ce7bc038de3fc78edc15ada99a11c85e32fde9f10c73e6435ca10bfd1d78","impliedFormat":99},{"version":"0495ec24f6aa5bea8d0e90f3af9be73326e0ed3783554e37628f632fa13757f7","impliedFormat":99},{"version":"a3d96e5357c0595e5bb118dc13a953736f5064a46ba85f3eee2f70e384667e18","impliedFormat":99},{"version":"32ec4501693e9191fee9e7c98ad9594b0170292502558364187abc4b6cc2b57d","impliedFormat":1},{"version":"6c89d4c05f04508e8adb7a17c4f12af505a42ff00516dd43bd3d9c12801e65fa","impliedFormat":99},{"version":"721de564240d40e2bb55fefa1e05ab65a53e00ab785e535f3c13f700b4f4c69e","impliedFormat":99},{"version":"65874f01c83db0bd4ba028d947230e31315417d2acac585af22ae3fe049e9fe5","impliedFormat":99},{"version":"ca072fb6425e6a1543f4d208b72f566c5720f3d220f7cad6d9201c36df3b0b30","impliedFormat":99},{"version":"6c2b5c9897b868e8f4ac2c3791cb4778f17f4e7ec010d208892f7af99f5b1e69","impliedFormat":99},{"version":"1545e4c0c83df6408602f502b557da487ec0064f5d10cdfca822aae9ec67e7a4","impliedFormat":99},{"version":"2348aae90a572f1f2802d3b6623ee42c2d0ddc9c60cfde1edffa7f35dc249c44","impliedFormat":99},{"version":"76a8081f702949d3fe1f886bf5cd08a10dddba8b6216256d163eac62f35e54eb","impliedFormat":99},{"version":"836cefe09f54b4b7e610a7a8590078ad2c5ba0b7d19cc7affdb5631ee1502833","impliedFormat":99},{"version":"bcd2fb2c6eb01493f04602b8ea41b2d5d341a6f8f284dcbaf6db93a0ab17b79c","impliedFormat":99},{"version":"ac5e9a761be47c8aa92939ca57a886ac8ff5185adf8a7a881e7a237a0cfed280","impliedFormat":99},{"version":"a2f6708415475f137756bd1761d6003d72ed646af52ace1cb4e6f11b34ce2047","impliedFormat":1},{"version":"b125679c44508b6df91d66f9ae584b58d2c3a399cf3d91a62c288cf9ce70220f","impliedFormat":1},{"version":"355fed2467fbcdb0e4004a9fcdf0201d6d15ad68bc90160a12b56e9fcf945d11","impliedFormat":1},{"version":"0bd5e7096c7bc02bf70b2cc017fc45ef489cb19bd2f32a71af39ff5787f1b56a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c29793071152b207c01ea1954e343be9a44d85234447b2b236acae9e709a383","impliedFormat":1},{"version":"6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea","impliedFormat":1},{"version":"f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5","impliedFormat":1},{"version":"e6f3077b1780226627f76085397d10c77a4d851c7154fd4b3f1eb114f4c2e56d","affectsGlobalScope":true,"impliedFormat":1},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"a17971bcd87302fd817c6f62f77b3a33ecb9d4b0200fddc44d6081d98092092c","impliedFormat":1},{"version":"2efc9e4063a2c7727ad90067d630fd4736319ad9402646d96e0143880b0c8cad","impliedFormat":1},{"version":"c56ef8201a294d65d1132160ebc76ed0c0a98dcf983d20775c8c8c0912210572","impliedFormat":1},{"version":"de0199a112f75809a7f80ec071495159dcf3e434bc021347e0175627398264c3","impliedFormat":1},{"version":"1a2bed55cfa62b4649485df27c0e560b04d4da4911e3a9f0475468721495563f","impliedFormat":1},{"version":"854045924626ba585f454b53531c42aed4365f02301aa8eca596423f4675b71f","impliedFormat":1},{"version":"d392cdf58e0c7a988c3df400caa63a5c070c0bf13996ec619e3535e19e952a95","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"237aa833f2cd2ff42db5d3f5a2b7b143ead11aff861097593ecd99015a69b220","impliedFormat":1},{"version":"50542cad26bd372cb942d418d42cdeced50a4d4226db390a1e3405f3d9a6103f","impliedFormat":1},{"version":"60660150e844e9d27f7ae4dfc7456f27fc683bed718d0e4a1dd4908d5da11d35","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"ef65d2f6377f3506a454c341ba1749ae686d7d11d18ed601e98322eff69e765b","impliedFormat":1},{"version":"046dcfe25106d1b4370e688bae2e15e5fbdc3d6a68cef1c97904380a6fae8d6a","impliedFormat":1},{"version":"d8272401aa994ed8a60f71067acbcc9a73d847be6badf1b9397a8ce965af6318","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"55e103448f452988dbdf65e293607c77fb91a967744bad2a72f1a36765e7e88d","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1}],"root":[321,425,431,[440,442],[636,646],[652,654],[731,735],738,739,[745,747],[749,751],[753,755],[759,761],763,764,[766,769],[772,781],[784,786],797,800,801,804,[806,816]],"options":{"alwaysStrict":true,"composite":true,"downlevelIteration":true,"emitDecoratorMetadata":false,"esModuleInterop":true,"experimentalDecorators":false,"isolatedDeclarations":false,"jsx":2,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":false,"noUnusedParameters":false,"removeComments":false,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":9,"verbatimModuleSyntax":false},"fileIdsList":[[392],[437],[362,392],[175,176,177],[173,174,175,176,177,178,179,180],[174,175],[121],[174],[175,176],[121,173],[80],[83],[88,90],[76,80,92,93],[103,106,112,114],[75,80],[74],[75],[82],[85],[75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120],[91],[87],[88],[79,80,86],[87,88],[94],[115],[79],[80,97,100],[96],[97],[95,97],[80,100,102,103,104],[103,104,106],[80,95,98,101,108],[95,96],[77,78,95,97,98,99],[97,100],[78,95,98,101],[80,100,102],[103,104],[121,472],[472],[469,470,471,472,473,474,475,476,477,478,479,483,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506],[477],[488],[479],[480,481,482,484,485,486,487],[384,411],[483],[411],[603],[602],[601],[522,591,600],[607],[606],[605],[555,591,600],[121,236,632,633],[634],[225],[224,225,226,232,233,234,235],[121,181,224],[224],[231],[229,230],[224,227,228],[383],[121,181],[523,524,598,599],[507,523],[595,596],[523,524,591],[523],[594,597],[525,592,593],[376,378,411,523,524,525,591],[376,378,411,523],[376,378,411,523,525,592,594],[121,526],[526,527,528,529,530,531,556,586,587,588,589,590],[522,529,530,531,555,585,588],[181,522,526,531],[526,528],[526,529,585],[526],[526,530,555],[447],[445,446],[445,446,447],[460,461,462,463,464],[459],[445,447,448],[452,453,454,455,456,457,458],[445,446,447,448,451,465,466],[450],[449],[446,447],[121,445,446],[468,510,511,514],[507,508,514],[507,508],[121,508,511],[121,181,467,507],[510,511,514],[468,508,510,511,512,513,514,515,516,517,521],[181,467,468,511],[181,468,511],[121,181,467,507,508,509],[121,510],[520],[468,518],[519],[467],[121,561,562,563,575],[121,561,562,563,566,567,575],[563,564,565,568,569,570],[121,561,562,575],[561,572,574],[507,561,574,575,576,577],[507,561,574,575,577],[121,467,507,561,563,574],[507,561,572,574,575],[575],[561,572,574,575,576,578,579],[577,578,580],[561,562,563,572,573,574,575,576,577,578,580,581,582,583,584],[121,573],[121,467,573,579,580],[121,507],[562,563,571,574],[558,574],[558],[557,559,560,572,574],[121,467,534,537,555],[121,534,536,537,539,540],[507,536,537],[121,536,539,540],[121,467,507,535],[121,536,537,539,540],[507,536],[532,533,534,535,536,537,538,539,540,541,546,547,548,549,550,551,552,553,554],[545],[534,542],[543,544],[532],[533],[121,533],[121,467,507,535,536,541],[121,536,539],[121,467,507,534,538,540],[121,467,532,533],[555],[555,609,610],[555,609],[555,627,628,629,630,631],[629],[121,630],[613,615],[614],[612],[817],[324],[360],[361,366,395],[362,367,373,374,381,392,403],[362,363,373,381],[364,404],[365,366,374,382],[366,392,400],[367,369,373,381],[360,368],[369,370],[373],[371,373],[360,373],[373,374,375,392,403],[373,374,375,388,392,395],[358,361,408],[369,373,376,381,392,403],[373,374,376,377,381,392,400,403],[376,378,392,400,403],[324,325,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410],[373,379],[380,403,408],[369,373,381,392],[382],[360,384],[381,382,385,402,408],[386],[387],[373,388,389],[388,390,404,406],[361,373,392,393,394,395],[361,392,394],[392,393],[395],[396],[373,398,399],[398,399],[366,381,392,400],[401],[381,402],[361,376,387,403],[366,404],[392,405],[380,406],[407],[361,366,373,375,384,392,403,406,408],[392,409],[820,821,822,823],[841,880],[841,865,880],[880],[841],[841,866,880],[841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879],[866,880],[782],[742],[373,376,378,392,400,403,409,411],[413,414,416,417],[426,427],[402],[373,374,411,415],[403,411],[713,714,718,719,720,721],[708,712,713],[708,712,714],[715,716,717],[713],[712,713],[709],[411,709,710,711],[667],[682],[682,699,704],[662,682,691,692,693,694,695,697,698,700,701,702,703],[682,696],[690],[682,689,690,704,706],[667,705],[663],[655,667],[667,671,672],[670,671,672],[671,672,673,674,675,676,677],[670],[655,667,668,678,679,680,681],[662,668,669,670],[668,670],[656,661],[656,657,658,659,661,662,663,664,665,666,669,670],[655,659,660,662,668,669],[669],[657,658],[664],[656],[655,659,661,662,669],[655],[707],[683,684,685,686],[687,688],[361,362,392],[411,825,827,831,832,835],[836],[827,831,834],[825,827,831,834,835,836,837],[411,831],[827,831,832,834],[411,825,827,832,833,835],[380,411,412],[422,423],[422],[650],[647,648,649],[831],[828,829,830],[373,396,411],[362],[757],[740],[374,383,411,825,826],[419,420],[839],[374,411,838],[411,736],[723,724,725],[708,722,723,724],[708,723,725],[708],[218,219],[218],[218,219,220,221],[216,222],[222],[216,217],[241],[248],[279,280],[239],[305],[245,284],[240],[240,278],[240,245],[240,268,278],[240,244,268,278],[240,268],[245,259],[296],[244],[239,240,241,242,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,273,274,275,276,277,278,279,280,281,282,283,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314],[247,271],[267],[247,273],[247,276],[252],[245],[240,244,259],[261],[307],[272],[293],[285,286],[285,288],[244,245],[239,244,265],[262,268],[335,339,403],[335,392,403],[330],[332,335,400,403],[381,400],[330,411],[332,335,381,403],[327,328,331,334,361,373,392,403],[327,333],[331,335,361,395,403,411],[361,411],[351,361,411],[329,330,411],[335],[329,330,331,332,333,334,335,336,337,339,340,341,342,343,344,345,346,347,348,349,350,352,353,354,355,356,357],[335,342,343],[333,335,343,344],[334],[327,330,335],[335,339,343,344],[339],[333,335,338,403],[327,332,333,335,339,342],[361,392],[330,335,351,361,408,411],[148],[73],[72],[63,64],[61,62,63,65,66,70],[62,63],[71],[63],[61,62,63,66,67,68,69],[61,62,72],[433,434,435],[323,375,383,432],[323,383,421],[323],[73,319,320],[136,319,323,375,383,403,421,430,636,639,641,644,646,652,653,735,772,773],[136,237,323,366,383,431,639,641,643],[136,237,323,431,438,645],[136,237,323,375,383,421,431,650,651,652],[236,323,380],[136,375,431],[319,383,640],[136,237,323,431,441,642],[419],[73,149,319,431,438,440,443,626,637],[442,443,636,638,759,761,763,764,767,768,769,777],[73,136,319,321,323,375,383,421,431,438,440,441,443,638,639,738,745,749,750,755,761,763,772,773,774,776],[73,323,431,440,441,443,638,747,750,751,755,761,763],[73,121,319,321,375,383,421,428,431,438,440,441,442,443,626,638,639,749,750,761,762,765,766],[73,431,438,440,443,638,750,754],[73,321,430,431,438,440,443,626,636,638,749,750,754,755,756,758,759,760],[73,431,443,638,750,754],[73,383,421,430,431,438,440,443,636,638,639,749,750,762],[73,321,431,438,440,443,638,749,750,755],[237,238,319,323,375,383,418,421,425,431,436,440],[136,383,431,639,770,771],[375,383,438,440,639,775],[197,319,323,383,431,440,639,707,731,732,734],[136,197,319,323,431,440,734,764],[136,237,319,321,323,431,636,641,644,646,652,653,654,734,735,738,739,746,764],[319,321,323,376,431,440,652,728,733,734,735,741,743,745,764],[319,321,375,383,430,732,735],[319,375,430,626,728,783,784,785],[319,366,375,376,399,430,431,707,729,731,795,796],[121,181,319,375,399,430,626,636,730,783,784,799],[121,181,319,375,430,626,636,730,783,784,803],[380,805],[197,319,323,362,430,431,440,707,729,730],[424],[752],[431,778],[136,197,323,362,728],[319,784],[237],[380,383,403],[403],[121,236,430,431,467,608,611,616,635,636],[136],[428,430,438,439],[73,374,383,431,639,753],[375,383,639],[73,319,383,428,431,440,775],[383,430,744],[319,373,733],[374,375,382,383],[428,431,440,636,748,749],[362,431],[237,404,428,429,430],[383,403],[431,440],[321,431,626,637,754],[136,366,375,383,409],[319,374,383,780],[374,383,737],[430,438],[153],[169],[73,150,151,152,153,154,155,156,157,158,159,160,161,162],[73,161],[73,150,153,162,163],[151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168],[73,150,153],[73,150,152,158,160,163],[73,155,161],[73,155,156],[73,153,156,157],[73,121,136,145,149,171,172,189,191,192],[73,121,136,147,172,193,194,195],[136,192],[137,207],[137,144,196,206],[196],[399],[366,790,791],[376],[787,788,789,791,792,793,794],[790],[125,126,131,376,399,728,729,788,789,791,793],[130,237,316],[316,317,322],[124,130,238,315,318],[130,383,403],[184],[138,144,183],[138,182],[124,125,200,236,317,319],[138,145,181,185,190,199,404],[802],[73,125,128,130,131],[181],[124,136,145,147,171,172,185,188,189,190,191,192,193,194,195,196,197,198,200,202,205,208,211,213,214,215,223,318],[201],[121,144,200],[121,138,145,181,185,189,190,199],[121,618],[121,145,181,195,198,206,236,467,522,604,608,611,616,617],[798],[204],[136,139,796],[136,139,144,188,203],[136,139],[136,139,185,730],[73,125,126,127],[73,126,129],[73,124,126,133],[122,125,126,127,128,129,130,131,132,133,134,135],[73,125,126,127,130],[73,125,126],[73,124,125],[210],[124,136],[124,136,140,144,209],[124,136,140],[146],[121,136,141,144,145],[121,145,147,190,522,555],[121,145,147,181,185,188],[123,136],[187],[142,144,186],[138,142,185],[142],[142,399,624],[208],[212],[137,138,139,140,141,142,143],[121,145,189,190,198,208,222],[136,170],[121,136,145,190],[139,188,200,206,444,617,619,620,621,622,623,625],[121,124,136,142,145,147,171,172,189,191,195,197,223,319,444,619],[172,192,193],[73,131,366,404,728,729],[73,727],[73,149,726,727,728]],"referencedMap":[[437,1],[438,2],[770,3],[180,4],[181,5],[178,6],[179,4],[173,7],[175,8],[176,7],[177,9],[174,10],[82,11],[85,12],[91,13],[94,14],[115,15],[93,16],[75,17],[76,18],[116,19],[81,11],[117,20],[84,12],[121,21],[118,22],[88,23],[90,24],[87,25],[89,26],[86,23],[119,27],[92,11],[120,28],[95,29],[114,30],[111,31],[113,32],[98,33],[105,34],[107,35],[109,36],[108,37],[100,38],[97,31],[112,39],[102,40],[103,41],[106,42],[469,7],[478,7],[471,7],[473,43],[474,44],[475,7],[472,7],[507,45],[506,46],[489,47],[480,48],[488,49],[485,50],[484,51],[487,52],[490,7],[492,7],[493,7],[494,7],[495,7],[496,7],[497,7],[498,7],[491,7],[479,7],[503,44],[604,53],[603,54],[602,55],[601,56],[608,57],[607,58],[606,59],[605,60],[634,61],[635,62],[633,7],[226,63],[236,64],[228,65],[233,66],[234,66],[232,67],[231,68],[229,69],[230,70],[224,71],[225,65],[235,66],[600,72],[524,73],[597,74],[595,75],[596,76],[598,77],[594,78],[592,79],[525,80],[593,81],[527,82],[591,83],[590,84],[587,85],[531,86],[586,87],[529,86],[589,84],[528,88],[556,89],[530,86],[445,90],[466,91],[461,92],[463,92],[462,92],[464,92],[465,93],[460,94],[452,92],[453,95],[459,96],[454,92],[455,95],[456,92],[457,92],[458,95],[467,97],[446,90],[451,98],[450,99],[448,100],[447,101],[518,102],[515,103],[517,103],[514,104],[513,105],[508,106],[516,107],[522,108],[509,109],[512,110],[510,111],[511,112],[521,113],[519,114],[520,115],[468,116],[564,117],[568,118],[565,117],[571,119],[569,117],[570,117],[563,120],[576,121],[583,122],[582,123],[575,124],[577,125],[578,126],[580,127],[581,128],[585,129],[574,130],[584,131],[579,7],[562,132],[572,133],[557,7],[559,134],[560,135],[573,136],[538,137],[542,138],[547,139],[548,139],[550,140],[536,141],[549,142],[537,143],[555,144],[546,145],[543,146],[545,147],[544,148],[533,7],[551,149],[552,149],[553,150],[554,149],[539,151],[540,152],[535,7],[541,153],[534,154],[609,155],[611,156],[610,157],[632,158],[628,7],[630,159],[631,160],[627,155],[616,161],[615,162],[613,163],[818,164],[324,165],[325,165],[360,166],[361,167],[362,168],[363,169],[364,170],[365,171],[366,172],[367,173],[368,174],[369,175],[370,175],[372,176],[371,177],[373,178],[374,179],[375,180],[359,181],[376,182],[377,183],[378,184],[411,185],[379,186],[380,187],[381,188],[382,189],[383,70],[384,190],[385,191],[386,192],[387,193],[388,194],[389,194],[390,195],[392,196],[394,197],[393,198],[395,199],[396,200],[397,1],[398,201],[399,202],[400,203],[401,204],[402,205],[403,206],[404,207],[405,208],[406,209],[407,210],[408,211],[409,212],[824,213],[865,214],[866,215],[841,216],[844,216],[863,214],[864,214],[854,214],[853,217],[851,214],[846,214],[859,214],[857,214],[861,214],[845,214],[858,214],[862,214],[847,214],[848,214],[860,214],[842,214],[849,214],[850,214],[852,214],[856,214],[867,218],[855,214],[843,214],[880,219],[874,218],[876,220],[875,218],[868,218],[869,218],[871,218],[873,218],[877,220],[878,220],[870,220],[872,220],[783,221],[743,222],[742,223],[418,224],[428,225],[427,226],[416,227],[744,228],[722,229],[714,230],[713,231],[718,232],[715,230],[716,233],[717,234],[711,235],[710,235],[712,236],[690,237],[701,238],[698,238],[700,239],[692,238],[704,240],[694,238],[697,241],[693,238],[703,238],[695,238],[702,242],[707,243],[706,244],[660,245],[668,246],[677,247],[673,248],[678,249],[672,237],[675,237],[674,237],[671,250],[682,251],[663,252],[669,253],[662,254],[664,250],[667,255],[661,256],[670,257],[659,258],[666,259],[658,260],[657,261],[665,250],[688,262],[686,263],[687,264],[685,238],[683,263],[684,238],[689,265],[790,266],[836,267],[837,268],[835,269],[838,270],[832,271],[833,272],[834,273],[413,274],[424,275],[423,276],[647,277],[648,277],[650,278],[649,277],[828,279],[829,279],[831,280],[830,279],[825,281],[756,282],[758,283],[741,284],[827,285],[421,286],[840,287],[839,288],[737,289],[736,52],[726,290],[725,291],[724,292],[723,293],[220,294],[221,295],[222,296],[217,297],[216,298],[218,299],[771,3],[245,300],[249,301],[281,302],[240,303],[306,304],[285,305],[282,306],[283,307],[286,308],[279,309],[288,308],[290,310],[291,307],[292,307],[280,311],[250,300],[296,312],[312,313],[300,314],[315,315],[272,316],[268,317],[274,318],[277,319],[253,320],[297,321],[260,322],[294,323],[308,324],[273,325],[295,326],[263,300],[287,327],[289,328],[246,329],[303,314],[266,330],[276,325],[269,331],[342,332],[349,333],[341,332],[356,334],[333,335],[332,336],[355,52],[350,337],[353,338],[335,339],[334,340],[330,341],[329,342],[352,343],[331,344],[336,345],[340,345],[358,346],[357,345],[344,347],[345,348],[347,349],[343,350],[346,351],[351,52],[338,352],[339,353],[348,354],[328,355],[354,356],[149,357],[148,358],[73,359],[65,360],[71,361],[66,362],[69,359],[72,363],[64,364],[70,365],[63,366],[436,367],[433,368],[434,369],[435,370],[321,371],[774,372],[644,373],[646,374],[653,375],[652,376],[654,377],[641,378],[643,379],[645,380],[638,381],[778,382],[777,383],[764,384],[767,385],[769,386],[761,387],[768,388],[763,389],[759,390],[441,391],[772,392],[776,393],[733,394],[739,395],[747,396],[746,397],[781,398],[786,399],[797,400],[800,401],[801,399],[804,402],[806,403],[731,404],[425,405],[753,406],[779,407],[732,408],[785,409],[642,410],[807,411],[640,412],[637,413],[773,414],[440,415],[754,416],[766,417],[809,418],[745,419],[734,420],[639,421],[750,422],[760,423],[431,424],[784,412],[813,70],[814,425],[751,426],[755,427],[735,428],[816,429],[738,430],[749,431],[214,432],[170,433],[163,434],[152,358],[153,358],[166,435],[165,436],[169,437],[154,358],[168,358],[155,358],[164,358],[156,358],[167,358],[162,438],[161,439],[157,358],[160,440],[158,441],[159,442],[193,443],[196,444],[194,445],[208,446],[207,447],[137,448],[787,449],[792,450],[793,451],[795,452],[791,453],[794,454],[317,455],[323,456],[316,457],[322,458],[185,459],[184,460],[621,461],[183,461],[318,462],[444,463],[803,464],[197,465],[199,466],[319,467],[198,7],[202,468],[201,469],[200,470],[619,471],[618,472],[799,473],[205,474],[802,475],[204,476],[139,414],[203,477],[798,478],[128,479],[130,480],[125,358],[129,358],[133,358],[134,481],[136,482],[131,483],[135,358],[127,484],[126,485],[132,358],[122,358],[211,486],[140,487],[210,488],[209,489],[622,489],[147,490],[146,491],[617,492],[141,414],[189,493],[124,494],[188,495],[187,496],[623,497],[186,498],[625,499],[624,500],[213,501],[190,7],[144,502],[223,503],[171,504],[191,505],[796,449],[626,506],[620,507],[320,508],[730,509],[728,510],[729,511]],"affectedFilesPendingEmit":[321,774,644,646,653,652,654,641,643,645,638,778,777,764,767,769,761,768,763,759,441,442,772,776,733,739,747,746,781,786,797,800,801,804,806,731,425,753,779,732,785,642,807,640,637,780,808,773,440,754,766,809,745,734,639,810,750,811,775,760,431,784,812,813,814,751,815,755,735,816,738,749,636],"emitSignatures":[321,425,431,440,441,442,636,637,638,639,640,641,642,643,644,645,646,652,653,654,731,732,733,734,735,738,739,745,746,747,749,750,751,753,754,755,759,760,761,763,764,766,767,768,769,772,773,774,775,776,777,778,779,780,781,784,785,786,797,800,801,804,806,807,808,809,810,811,812,813,814,815,816]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/core/src/v3/schemas/api.ts b/packages/core/src/v3/schemas/api.ts index e31ccb991..b81fbe862 100644 --- a/packages/core/src/v3/schemas/api.ts +++ b/packages/core/src/v3/schemas/api.ts @@ -68,7 +68,9 @@ export const TriggerTaskRequestBody = z.object({ options: z .object({ dependentAttempt: z.string().optional(), + parentAttempt: z.string().optional(), dependentBatch: z.string().optional(), + parentBatch: z.string().optional(), lockToVersion: z.string().optional(), queue: QueueOptions.optional(), concurrencyKey: z.string().optional(), @@ -470,6 +472,15 @@ export const RunScheduleDetails = z.object({ export type RunScheduleDetails = z.infer; +export const TriggerFunction = z.enum([ + "triggerAndWait", + "trigger", + "batchTriggerAndWait", + "batchTrigger", +]); + +export type TriggerFunction = z.infer; + const CommonRunFields = { id: z.string(), status: RunStatus, @@ -496,6 +507,13 @@ const CommonRunFields = { durationMs: z.number(), }; +export const RelatedRunDetails = z.object({ + ...CommonRunFields, + depth: z.number(), + triggerFunction: z.enum(["triggerAndWait", "trigger", "batchTriggerAndWait", "batchTrigger"]), + batchId: z.string().optional(), +}); + export const RetrieveRunResponse = z.object({ ...CommonRunFields, payload: z.any().optional(), @@ -503,6 +521,11 @@ export const RetrieveRunResponse = z.object({ output: z.any().optional(), outputPresignedUrl: z.string().optional(), schedule: RunScheduleDetails.optional(), + relatedRuns: z.object({ + root: RelatedRunDetails.optional(), + parent: RelatedRunDetails.optional(), + children: z.array(RelatedRunDetails).optional(), + }), attempts: z.array( z .object({ diff --git a/packages/core/tsconfig.src.tsbuildinfo b/packages/core/tsconfig.src.tsbuildinfo deleted file mode 100644 index e58a4b45e..000000000 --- a/packages/core/tsconfig.src.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/bloom.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/typealiases.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/util.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/zoderror.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/locales/en.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/errors.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/parseutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/enumutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/errorutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/helpers/partialutil.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/types.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/external.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/lib/index.d.ts","../../node_modules/.pnpm/zod@3.22.3/node_modules/zod/index.d.ts","./src/schemas/eventfilter.ts","./src/eventfiltermatches.ts","./src/types.ts","./src/schemas/addmissingversionfield.ts","./src/schemas/errors.ts","./src/schemas/integrations.ts","./src/schemas/json.ts","./src/schemas/properties.ts","./src/schemas/schedules.ts","./src/schemas/tasks.ts","./src/schemas/triggers.ts","./src/schemas/statuses.ts","./src/schemas/runs.ts","./src/schemas/requestfilter.ts","./src/schemas/api.ts","./src/schemas/notifications.ts","./src/schemas/fetch.ts","./src/schemas/events.ts","./src/schemas/request.ts","./src/schemas/jobs.ts","./src/schemas/index.ts","./src/utils.ts","./src/retry.ts","./src/replacements.ts","./src/searchparams.ts","./src/requestfiltermatches.ts","./src/versions.ts","./src/index.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/internal/symbol.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/exception.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/types.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag/consolelogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/diag.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/observableresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/metric.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/noopmeter.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/metrics.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation/textmappropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/baggage/context-helpers.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/propagation.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_state.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_context.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/link.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/status.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/span_kind.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spanoptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_options.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracer.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/tracer_provider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/proxytracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/samplingresult.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/trace_flags.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/internal/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/spancontext-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/invalid-span-constants.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace/context-utils.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/api/trace.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/context-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/diag-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/metrics-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/propagation-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/trace-api.d.ts","../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/build/src/index.d.ts","./src/logger.ts","./src/version.ts","./src/v3/schemas/tokens.ts","./src/v3/types/utils.ts","./src/v3/types/index.ts","./src/v3/schemas/common.ts","./src/v3/schemas/schemas.ts","./src/v3/schemas/resources.ts","./src/v3/schemas/api.ts","./src/v3/schemas/config.ts","./src/v3/schemas/build.ts","./src/v3/schemas/messages.ts","./src/v3/schemas/style.ts","./src/v3/schemas/eventfilter.ts","./src/v3/schemas/fetch.ts","./src/v3/schemas/opentelemetry.ts","./src/v3/schemas/index.ts","./src/v3/apiclientmanager/types.ts","./src/v3/clock/clock.ts","./src/v3/runtime/manager.ts","./src/v3/task-catalog/catalog.ts","./src/v3/taskcontext/types.ts","./src/v3/usage/types.ts","./src/v3/utils/platform.ts","./src/v3/utils/globals.ts","./src/v3/semanticinternalattributes.ts","./src/v3/taskcontext/index.ts","./src/v3/task-context-api.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/validationerror.d.ts","../../node_modules/.pnpm/zod-validation-error@1.5.0_zod@3.22.3/node_modules/zod-validation-error/dist/types/index.d.ts","./src/v3/utils/retries.ts","./src/v3/apiclient/errors.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/anyvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/logger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggeroptions.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/types/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooplogger.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/nooploggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts","../../node_modules/.pnpm/@opentelemetry+api-logs@0.52.1/node_modules/@opentelemetry/api-logs/build/src/index.d.ts","../../node_modules/.pnpm/@google-cloud+precise-date@4.0.0/node_modules/@google-cloud/precise-date/build/src/index.d.ts","./src/v3/clock/simpleclock.ts","./src/v3/clock/index.ts","./src/v3/clock-api.ts","./src/v3/usage/noopusagemanager.ts","./src/v3/usage/api.ts","./src/v3/usage-api.ts","./src/v3/tracer.ts","./src/v3/utils/flattenattributes.ts","./src/v3/utils/styleattributes.ts","./src/v3/apiclient/pagination.ts","./src/v3/apiclient/core.ts","./src/v3/apiclient/types.ts","./src/v3/apiclient/index.ts","./src/v3/utils/getenv.ts","./src/v3/apiclientmanager/index.ts","./src/v3/apiclientmanager-api.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/types_internal.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/autoloader.d.ts","../../node_modules/.pnpm/@types+shimmer@1.0.2/node_modules/@types/shimmer/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/instrumentation.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/normalize.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemoduledefinition.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/instrumentationnodemodulefile.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+instrumentation@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/instrumentation/build/src/index.d.ts","../../node_modules/.pnpm/esbuild@0.23.0/node_modules/esbuild/lib/main.d.ts","../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-record.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-equal-considering-writability.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-fully-writable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-undefinable.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-modify.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/unreachable-case-error/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/assert/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/create-factory-with-constraint/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/is-exact/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/functions/noop/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.d.ts","../../node_modules/.pnpm/ts-essentials@10.0.1_typescript@5.5.4/node_modules/ts-essentials/dist/index.d.ts","./src/v3/build/resolvedconfig.ts","./src/v3/build/extensions.ts","./src/v3/icons.ts","./src/v3/logger/tasklogger.ts","./src/v3/errors.ts","./src/v3/limits.ts","./src/v3/logger/index.ts","./src/v3/logger-api.ts","./src/v3/runtime/noopruntimemanager.ts","./src/v3/runtime/index.ts","./src/v3/runtime-api.ts","./src/v3/task-catalog/nooptaskcatalog.ts","./src/v3/task-catalog/index.ts","./src/v3/task-catalog-api.ts","../../node_modules/.pnpm/@types+humanize-duration@3.27.1/node_modules/@types/humanize-duration/index.d.ts","./src/v3/utils/durations.ts","./src/v3/utils/omit.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/transformer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/plainer.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/types.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/class-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/custom-transformer-registry.d.ts","../../node_modules/.pnpm/superjson@2.2.1/node_modules/superjson/dist/index.d.ts","./src/v3/utils/ioserialization.ts","./src/v3/index.ts","./src/v3/config.ts","./src/v3/consoleinterceptor.ts","../../node_modules/.pnpm/@socket.io+component-emitter@3.1.0/node_modules/@socket.io/component-emitter/index.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/file.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/filereader.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@5.26.5/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/globals.global.d.ts","../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/commons.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/encodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/decodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/esm/index.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transport.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/socket.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/polling.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/websocket.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/webtransport.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/index.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/util.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/transports/websocket-constructor.d.ts","../../node_modules/.pnpm/engine.io-client@6.5.3/node_modules/engine.io-client/build/esm/index.d.ts","../../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/esm-debug/index.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/socket.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/manager.d.ts","../../node_modules/.pnpm/socket.io-client@4.7.5/node_modules/socket.io-client/build/esm/index.d.ts","./src/v3/utils/structuredlogger.ts","./src/v3/zodmessagehandler.ts","./src/v3/zodsocket.ts","./src/v3/zodipc.ts","../../node_modules/.pnpm/@types+cookie@0.4.1/node_modules/@types/cookie/index.d.ts","../../node_modules/.pnpm/@types+cors@2.8.17/node_modules/@types/cors/index.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/server.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/cjs/commons.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/cjs/encodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/cjs/decodepacket.d.ts","../../node_modules/.pnpm/engine.io-parser@5.2.2_patch_hash=e6nctogrhpxoivwiwy37ersfu4/node_modules/engine.io-parser/build/cjs/index.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/transport.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/transports/polling.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/transports/websocket.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/transports/webtransport.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/transports/index.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/userver.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/socket.d.ts","../../node_modules/.pnpm/engine.io@6.5.4/node_modules/engine.io/build/engine.io.d.ts","../../node_modules/.pnpm/socket.io-parser@4.2.4/node_modules/socket.io-parser/build/cjs/index.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/typed-events.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/client.d.ts","../../node_modules/.pnpm/socket.io-adapter@2.5.4/node_modules/socket.io-adapter/dist/in-memory-adapter.d.ts","../../node_modules/.pnpm/socket.io-adapter@2.5.4/node_modules/socket.io-adapter/dist/cluster-adapter.d.ts","../../node_modules/.pnpm/socket.io-adapter@2.5.4/node_modules/socket.io-adapter/dist/index.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/broadcast-operator.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/socket.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/namespace.d.ts","../../node_modules/.pnpm/socket.io@4.7.4/node_modules/socket.io/dist/index.d.ts","./src/v3/zodnamespace.ts","./src/v3/zodfetch.ts","./src/v3/apps/backoff.ts","../../node_modules/.pnpm/execa@8.0.1/node_modules/execa/index.d.ts","./src/v3/apps/isexecachildprocess.ts","./src/v3/apps/checkpoints.ts","./src/v3/apps/http.ts","./src/v3/apps/logger.ts","./src/v3/apps/process.ts","./src/v3/apps/provider.ts","./src/v3/apps/index.ts","./src/v3/build/runtime.ts","./src/v3/build/index.ts","./src/v3/clock/precisewallclock.ts","./src/v3/utils/timers.ts","./src/v3/runtime/devruntimemanager.ts","./src/v3/dev/index.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/iresource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/resource.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/default-service-name.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/hostdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/osdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/processdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/serviceinstanceiddetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetector.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/browserdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/envdetectorsync.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detectors/index.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/detect-resources.d.ts","../../node_modules/.pnpm/@opentelemetry+resources@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/resources/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/propagation/w3cbaggagepropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/anchored-clock.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/types.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/time.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/common/hex-to-binary.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/exportresult.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/environment.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/globalthis.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/hex-to-base64.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/performance.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/sdk-info.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/timer-util.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/w3ctracecontextpropagator.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/trace/tracestate.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/merge.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/sampling.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/timeout.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/url.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/wrap.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/utils/callback.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/version.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/internal/exporter.d.ts","../../node_modules/.pnpm/@opentelemetry+core@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/core/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/readablelogrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/internal/loggerprovidersharedstate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecord.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/logrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/loggerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/nooplogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/logrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/consolelogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/simplelogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/inmemorylogrecordexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/export/batchlogrecordprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/batchlogrecordprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-logs@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/otlpexporterbase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/resource/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/metrics/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/trace/types.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/logs/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/idgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/timedevent.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/readablespan.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/spanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/basictracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/span.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/spanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/tracer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/batchspanprocessorbase.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/batchspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/randomidgenerator.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/consolespanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/inmemoryspanexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/simplespanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/export/noopspanprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysoffsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/alwaysonsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/parentbasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/traceidratiobasedsampler.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-base@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/trace/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/attributesprocessor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/predicate.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/instrumentselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/meterselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationtemporality.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/drop.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/histogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/buckets.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponential-histogram/mapping/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/exponentialhistogram.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/lastvalue.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/sum.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/aggregation.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/view/view.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/instrumentdescriptor.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricdata.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/aggregationselector.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricproducer.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/metricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/periodicexportingmetricreader.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/inmemorymetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/export/consolemetricexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/meterprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-metrics@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/metrics/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/logs/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/common/i-serializer.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/protobuf/serializers.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/json/serializers.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-transformer@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-transformer/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/otlpexporternodebase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/otlpexporterbrowserbase.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/browser/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/util.d.ts","../../node_modules/.pnpm/@opentelemetry+otlp-exporter-base@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/otlp-exporter-base/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/node/otlplogexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-logs-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-logs-otlp-http/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/node/otlptraceexporter.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/node/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/platform/index.d.ts","../../node_modules/.pnpm/@opentelemetry+exporter-trace-otlp-http@0.52.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/exporter-trace-otlp-http/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/config.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/nodetracerprovider.d.ts","../../node_modules/.pnpm/@opentelemetry+sdk-trace-node@1.25.1_@opentelemetry+api@1.9.0/node_modules/@opentelemetry/sdk-trace-node/build/src/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/trace/semanticattributes.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/trace/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/resource/semanticresourceattributes.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/resource/index.d.ts","../../node_modules/.pnpm/@opentelemetry+semantic-conventions@1.25.1/node_modules/@opentelemetry/semantic-conventions/build/src/index.d.ts","./src/v3/taskcontext/otelprocessors.ts","./src/v3/otel/tracingsdk.ts","./src/v3/otel/index.ts","./src/v3/runtime/prodruntimemanager.ts","./src/v3/prod/index.ts","./src/v3/task-catalog/standardtaskcatalog.ts","./src/v3/usage/devusagemanager.ts","./src/v3/usage/usageclient.ts","./src/v3/usage/produsagemanager.ts","./src/v3/utils/safeasynclocalstorage.ts","./src/v3/workers/taskexecutor.ts","./src/v3/workers/index.ts","../../node_modules/.pnpm/safe-buffer@5.1.2/node_modules/safe-buffer/index.d.ts","../../node_modules/.pnpm/@types+readable-stream@4.0.14/node_modules/@types/readable-stream/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"63b46fe5cc10f8da568f9617d0d7fa72d684a13ac20ddf1e63ffeac0229f45d6","impliedFormat":99},{"version":"5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","impliedFormat":1},{"version":"7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","impliedFormat":1},{"version":"fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","impliedFormat":1},{"version":"8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","impliedFormat":1},{"version":"ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","impliedFormat":1},{"version":"c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","impliedFormat":1},{"version":"c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","impliedFormat":1},{"version":"d6a6e6fcd382a05f787a81a157e66f54f360f81a405015bf07f77a622139ed90","impliedFormat":1},{"version":"f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","impliedFormat":1},{"version":"b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","impliedFormat":1},{"version":"5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","impliedFormat":1},{"version":"34b606235de411ef251b68786497592f386e5351818802d4f8e04a64141d3b12","impliedFormat":99},{"version":"3713219a0562f0fb3689b10723006d094f3d79633e373f4ab8b441a5401b8584","impliedFormat":99},{"version":"d7a574f5557f3a399c1556410ad2504bfd569a45167476c8be4839887797edd0","impliedFormat":99},{"version":"1bce7c5ce91267ed5114c93fa0725157bd9a20f03911235ee9105e87674ecc82","impliedFormat":99},{"version":"d3a77124d6c2c29c0de8857534c5dc3abc57ade3d6ffbf3707ae1d87c10ed575","impliedFormat":99},{"version":"91f8d7c73837bafc4914567efd6777307551558989491876034e6f98b62d99a6","impliedFormat":99},{"version":"5b51b59938bd0ca81b50e79de5b2205cfdc49e76dda117636a1d6d61205db8ba","impliedFormat":99},{"version":"166ab5d596e8e097bba5f9d85f574a19f1fe98fb5a36b655ea81db4d024bd0de","impliedFormat":99},{"version":"34addbb9746e63b4f757a396ef174d267c59c9673107192e56fc9fa44355f772","impliedFormat":99},{"version":"0a6b68700031a7b966eba71a17e7efef15a008727959903abd131bb4f5c57e60","impliedFormat":99},{"version":"f54ed46100666f8850e1a0393d71e2057c6dc411895bf3ea1c35c950e5045929","impliedFormat":99},{"version":"9f6bc77840cb01219d0233973552d7fae3a0ccef6e7e6179c014de5ccc044c3e","impliedFormat":99},{"version":"73c7279d2eed2d40a82d9877e25b316ce61f20f3720e038c0288965a70ed5ae6","impliedFormat":99},{"version":"849c701def1fcfd8720d8850d5ea984a3cd4d08204a29c28b0f5ff07062f8647","impliedFormat":99},{"version":"6c4188b9f3998b804c4df6d637ff7d328eaac77ba6b33f4616bd7acc3f04e01f","impliedFormat":99},{"version":"7d263568916984bafa308be74e7400f4010e0e97ea248f66d630929844a4ce6d","impliedFormat":99},{"version":"301c4337a07ab3be97c34bee7eb15a5caaba815a02bbc376f0f2a00c47040763","impliedFormat":99},{"version":"a928314cdafb6ce7d2e420bff316b2ebe6edd9ae470f82c332cc2ac64becdb53","impliedFormat":99},{"version":"78acc3ece111ed7f9dcc461aea6b942d71e10122a5fe0b0730edfb4746eb1567","impliedFormat":99},{"version":"7b356a77218948b0f659aa3a622f0178e9e8cc8c4968b6e509296013980ce5bf","impliedFormat":99},{"version":"60bbddcefe92ddcc0f72a4324ba8d3f40f0242e60b6aa97bc6c5bf1243e6da46","impliedFormat":99},{"version":"aa6c00b4294f6cd58fd5302c7519910ee97922509734ba9677a86fa8c11f42e8","impliedFormat":99},{"version":"9c364f17038ca4191ecbe46e929cc1e7c026ad6c957153438776ffe9998aa78e","impliedFormat":99},{"version":"070fef1a744485d2b52df1948184494e9861439ecbc97c6a71ac65fc51139eaf","impliedFormat":99},{"version":"7ffb5e0bda524a1725c10bd6d26eda23277644e42f50ae0bc2b3d4bcf3189949","impliedFormat":99},{"version":"024c5ef0ed5b307ba58f8f937a6a98102f1da6a39c19de3d2a9281b52d63b926","impliedFormat":99},{"version":"63bfd340b24e03d85716c766c4e53570bb60519ef4a22d941c750240a8183b57","impliedFormat":99},{"version":"1001e0a2b67a35bd4b03ce8d2760c07173088879460c695b07490343edd33f7c","impliedFormat":99},{"version":"a4e9e0d92dcad2cb387a5f1bdffe621569052f2d80186e11973aa7080260d296","impliedFormat":1},{"version":"f6380cc36fc3efc70084d288d0a05d0a2e09da012ee3853f9d62431e7216f129","impliedFormat":1},{"version":"497c3e541b4acf6c5d5ba75b03569cfe5fe25c8a87e6c87f1af98da6a3e7b918","impliedFormat":1},{"version":"d9429b81edf2fb2abf1e81e9c2e92615f596ed3166673d9b69b84c369b15fdc0","impliedFormat":1},{"version":"7e22943ae4e474854ca0695ab750a8026f55bb94278331fda02a4fb42efce063","impliedFormat":1},{"version":"7da9ff3d9a7e62ddca6393a23e67296ab88f2fcb94ee5f7fb977fa8e478852ac","impliedFormat":1},{"version":"e1b45cc21ea200308cbc8abae2fb0cfd014cb5b0e1d1643bcc50afa5959b6d83","impliedFormat":1},{"version":"c9740b0ce7533ce6ba21a7d424e38d2736acdddeab2b1a814c00396e62cc2f10","impliedFormat":1},{"version":"b3c1f6a3fdbb04c6b244de6d5772ffdd9e962a2faea1440e410049c13e874b87","impliedFormat":1},{"version":"dcaa872d9b52b9409979170734bdfd38f846c32114d05b70640fd05140b171bb","impliedFormat":1},{"version":"6c434d20da381fcd2e8b924a3ec9b8653cf8bed8e0da648e91f4c984bd2a5a91","impliedFormat":1},{"version":"992419d044caf6b14946fa7b9463819ab2eeb7af7c04919cc2087ce354c92266","impliedFormat":1},{"version":"fa9815e9ce1330289a5c0192e2e91eb6178c0caa83c19fe0c6a9f67013fe795c","impliedFormat":1},{"version":"06384a1a73fcf4524952ecd0d6b63171c5d41dd23573907a91ef0a687ddb4a8c","impliedFormat":1},{"version":"34b1594ecf1c84bcc7a04d9f583afa6345a6fea27a52cf2685f802629219de45","impliedFormat":1},{"version":"d82c9ca830d7b94b7530a2c5819064d8255b93dfeddc5b2ebb8a09316f002c89","impliedFormat":1},{"version":"7e046b9634add57e512412a7881efbc14d44d1c65eadd35432412aa564537975","impliedFormat":1},{"version":"aac9079b9e2b5180036f27ab37cb3cf4fd19955be48ccc82eab3f092ee3d4026","impliedFormat":1},{"version":"3d9c38933bc69e0a885da20f019de441a3b5433ce041ba5b9d3a541db4b568cb","impliedFormat":1},{"version":"606aa2b74372221b0f79ca8ae3568629f444cc454aa59b032e4cb602308dec94","impliedFormat":1},{"version":"50474eaea72bfda85cc37ae6cd29f0556965c0849495d96c8c04c940ef3d2f44","impliedFormat":1},{"version":"b4874382f863cf7dc82b3d15aed1e1372ac3fede462065d5bfc8510c0d8f7b19","impliedFormat":1},{"version":"df10b4f781871afb72b2d648d497671190b16b679bf7533b744cc10b3c6bf7ea","impliedFormat":1},{"version":"1fdc28754c77e852c92087c789a1461aa6eed19c335dc92ce6b16a188e7ba305","impliedFormat":1},{"version":"a656dab1d502d4ddc845b66d8735c484bfebbf0b1eda5fb29729222675759884","impliedFormat":1},{"version":"465a79505258d251068dc0047a67a3605dd26e6b15e9ad2cec297442cbb58820","impliedFormat":1},{"version":"ddae22d9329db28ce3d80a2a53f99eaed66959c1c9cd719c9b744e5470579d2f","impliedFormat":1},{"version":"d0e25feadef054c6fc6a7f55ccc3b27b7216142106b9ff50f5e7b19d85c62ca7","impliedFormat":1},{"version":"111214009193320cacbae104e8281f6cb37788b52a6a84d259f9822c8c71f6ca","impliedFormat":1},{"version":"01c8e2c8984c96b9b48be20ee396bd3689a3a3e6add8d50fe8229a7d4e62ff45","impliedFormat":1},{"version":"a4a0800b592e533897b4967b00fb00f7cd48af9714d300767cc231271aa100af","impliedFormat":1},{"version":"20aa818c3e16e40586f2fa26327ea17242c8873fe3412a69ec68846017219314","impliedFormat":1},{"version":"f498532f53d54f831851990cb4bcd96063d73e302906fa07e2df24aa5935c7d1","impliedFormat":1},{"version":"5fd19dfde8de7a0b91df6a9bbdc44b648fd1f245cae9e8b8cf210d83ee06f106","impliedFormat":1},{"version":"3b8d6638c32e63ea0679eb26d1eb78534f4cc02c27b80f1c0a19f348774f5571","impliedFormat":1},{"version":"ce0da52e69bc3d82a7b5bc40da6baad08d3790de13ad35e89148a88055b46809","impliedFormat":1},{"version":"9e01233da81bfed887f8d9a70d1a26bf11b8ddff165806cc586c84980bf8fc24","impliedFormat":1},{"version":"214a6afbab8b285fc97eb3cece36cae65ea2fca3cbd0c017a96159b14050d202","impliedFormat":1},{"version":"14beeca2944b75b229c0549e0996dc4b7863e07257e0d359d63a7be49a6b86a4","impliedFormat":1},{"version":"f7bb9adb1daa749208b47d1313a46837e4d27687f85a3af7777fc1c9b3dc06b1","impliedFormat":1},{"version":"c549fe2f52101ffe47f58107c702af7cdcd42da8c80afd79f707d1c5d77d4b6e","impliedFormat":1},{"version":"3966ea9e1c1a5f6e636606785999734988e135541b79adc6b5d00abdc0f4bf05","impliedFormat":1},{"version":"0b60b69c957adb27f990fbc27ea4ac1064249400262d7c4c1b0a1687506b3406","impliedFormat":1},{"version":"12c26e5d1befc0ded725cee4c2316f276013e6f2eb545966562ae9a0c1931357","impliedFormat":1},{"version":"27b247363f1376c12310f73ebac6debcde009c0b95b65a8207e4fa90e132b30a","impliedFormat":1},{"version":"05bd302e2249da923048c09dc684d1d74cb205551a87f22fb8badc09ec532a08","impliedFormat":1},{"version":"fe930ec064571ab3b698b13bddf60a29abf9d2f36d51ab1ca0083b087b061f3a","impliedFormat":1},{"version":"6b85c4198e4b62b0056d55135ad95909adf1b95c9a86cdbed2c0f4cc1a902d53","impliedFormat":1},{"version":"2c4cffd8ab0947cddeb77ac223563ffb2a7827b194862ac8c1cdd27f61ba0fa0","impliedFormat":99},{"version":"1af39e6ade8c28757c5bc04483f06ec60743edea296a75aac2bb14555f09308d","impliedFormat":99},{"version":"a2cbd7619074b44363cf8df182d5e951db89cae34d5a5676426782d31098ef31","impliedFormat":99},{"version":"e47a8bcff0cb89ef43aa0d4290138a5cb260101d079f69d330410b366a013bb7","impliedFormat":99},{"version":"a52f42e9038ea2d24040696fde6658210ad92688fb1404eb9d2f7e1f6b89b5a5","impliedFormat":99},{"version":"e1e7501e34ba58af8a00fad1455a893fd768d3fbba698fa53a8d61e72f0885a2","impliedFormat":99},{"version":"28296a5ea8028263072c1e0528c9a5557aacd1c89092c2b7440d15451aaf445b","impliedFormat":99},{"version":"b5465d10cc2d064b3f31578182fc41b42e1e84601809d96735885a3b36c68036","impliedFormat":99},{"version":"182a1bad4717a1e96f26aea5c8ce87a5a819ca996f237db611023b9d89f4b5ca","impliedFormat":99},{"version":"af6ace4911b15244a6fb0cf1dcc22e1a89b1486f0e0fb3be7fbb9cb6caa550fa","impliedFormat":99},{"version":"a71d2efbe78d1d5f39b4ef54617b045218d8793fea1e245eb1348286ef8ca483","impliedFormat":99},{"version":"8c57c4f44dc21308fd959f792ff283be24a430d975b922b2feda8f13f0f52771","impliedFormat":99},{"version":"f16d398c7bd6a438497bffb3beefebda5f83f0241ce2cc832787d94d40a2843d","impliedFormat":99},{"version":"a4be2828c686a8a5801c12d8aea0890204963437bec5730f8740099cd1fe8f47","impliedFormat":99},{"version":"7661dacdd52d2448b18ef61fcacc25c721f43186304f7888b3f9f472321725e1","impliedFormat":99},{"version":"e2f39969c89cff97eee3a27dbda04b702b01433c86f1cdc0104db6ccfbfc6355","impliedFormat":99},{"version":"31a8c8c3dd9e43299c50e36674ff70c0234ca712c2492a687cd0bdf09a22fb0b","impliedFormat":99},{"version":"01dd6137942cc1fb6511376d1db1c49e8c07bea46715ffa3af815f2d20462d39","impliedFormat":99},{"version":"2ae9392a6221474bb135eddc8adb531946aa29c67598eb0f5c1ac7e21707a359","impliedFormat":99},{"version":"107244721ecbbcb9d015158adce0979ad8889c6fabb84e407c01e9bc231c88fe","impliedFormat":99},{"version":"f3d0fed520919e8ac1d033aeeae5608da2dacbbd63f5c717d5edd2a6dc91e0c5","impliedFormat":99},{"version":"8e3976e9d3bdb95eaf82a8f53fac9e6823be083a53d3f3939701470c254a1f04","impliedFormat":99},{"version":"eb0d8e96b801b59d5b87c834300a251a5aa6074139b8ad79585e3c01fa1691ce","impliedFormat":99},{"version":"be56e82a3782f2118d7b0c56c770103b259979004a1b92340c6caf150fbee3a9","impliedFormat":99},{"version":"cc8586e3cd56847bacddedf5f924f9ce92c11ae71828ca151f8afd216abe693e","impliedFormat":99},{"version":"805a0e7d0f47e5332285ba8145b9e81b94993461fbb1cfae6b15ffd545ae9a48","impliedFormat":99},{"version":"5b2773644d27ac8dadba762e14e837ebc06b000a725117240f96a159dfc42c78","impliedFormat":99},{"version":"26dcb4bb8795f758a8c2778c68bf6fdb08751e4b4c041b3bbff207aa41d3af5a","impliedFormat":99},{"version":"5f1b7ae9dae3bc04a2b44fd10721d58a9a4aee0633d99f8b3ac351702f47efbb","impliedFormat":1},{"version":"d4c55922007526e6c361c46722351f51dccb6d767496aab702e14eb6ca2bfdab","impliedFormat":1},{"version":"4b2521490f9183a2bc04d30797fe550404184a581fdd0095675c28f8c80e4097","impliedFormat":99},{"version":"43b5f14a414da28b973b32ce136c260bb92019c8ff4a24a8445630a2bf435cbd","impliedFormat":99},{"version":"82edb64fbe335cd21f16bcf50248e107f201e3e09ebc73b28640c28c958067c9","impliedFormat":1},{"version":"9593de9c14310da95e677e83110b37f1407878352f9ebe1345f97fc69e4b627c","impliedFormat":1},{"version":"e009f9f511db1a215577f241b2dc6d3f9418f9bc1686b6950a1d3f1b433a37ff","impliedFormat":1},{"version":"caa48f3b98f9737d51fabce5ce2d126de47d8f9dffeb7ad17cd500f7fd5112e0","impliedFormat":1},{"version":"64d15723ce818bb7074679f5e8d4d19a6e753223f5965fd9f1a9a1f029f802f7","impliedFormat":1},{"version":"2900496cc3034767cd31dd8e628e046bc3e1e5f199afe7323ece090e8872cfa7","impliedFormat":1},{"version":"ba74ef369486b613146fa4a3bccb959f3e64cdc6a43f05cc7010338ba0eab9f7","impliedFormat":1},{"version":"a22bbe0aeceec1dc02236a03eee7736760ecd39de9c8789229ce9a70777629bb","impliedFormat":1},{"version":"a9afefcb7d0c9a89ec666cc7cccc7275f6a06b5114dd15aa2654e9e19c43b7c1","impliedFormat":1},{"version":"09bc11b53ad8cdeafbc9e689036dca972a188e3ed91ce45385f74bd6d70a2d01","impliedFormat":1},{"version":"e24094fa069365f5b61524e962f8f008e2707fe05e2b170755b14b6ca84ff4f1","impliedFormat":99},{"version":"0030cd149098b3a72487ef56785c99794291d839cf9178c18c3b9a817e57a49b","impliedFormat":99},{"version":"c69cc3387606e9c35150c95c4f1ab3924d85f1c75ba1dc9aa195ae0f333680aa","impliedFormat":99},{"version":"efd57dbf66d763611ad0faa3eba059e11b8bb58044c0711aa1728fea0d4b2ca6","impliedFormat":99},{"version":"fd099c27713fa92cf7aa697b6f7f2b95ee1a98b0802174d766cacc3daeafdefa","impliedFormat":99},{"version":"c6b51dc1de8c2ccab35dae3c92076517b614992d98b40670020d46939bb36eaf","impliedFormat":99},{"version":"bda2186a5f2f0a07e50a3cfd8d85a0744778a5152a3f96d229ed2119f1e28115","impliedFormat":99},{"version":"6905b88a7875372f067a93f89cbdd3ae9d3f2f42fa7366bc4214017b9e6534ad","impliedFormat":99},{"version":"7d03be938e7a53f8b4f732d184fb3eb275e5dbec3a28c75b39960065e77b8496","impliedFormat":99},{"version":"4a353ae985a9d09dfbe3dc356aac32bacc84f4e8d39c271cf5e4fd6797f16baf","impliedFormat":99},{"version":"ed3926abfe677cdef1d9d01090cb9e31883fbbab874c2400387e52f43bc0130f","impliedFormat":99},{"version":"a4446aeada97e090c1134a4d5d12e20a66b424ed6784b175d458701e8a95e6fc","impliedFormat":99},{"version":"31ad037cc2f708a504ae5f00342753a2df3dd49176e8f7af624585afaf711b12","impliedFormat":99},{"version":"a27cb995d5c85e8ab069508a9b37bb37436c403ca34798a540338a0dd2f318a2","impliedFormat":99},{"version":"1eee0e089cbf1917413a357d3d8bd2a1b598b9fcd19cc8517812b0f42690e590","impliedFormat":99},{"version":"7220a4508d88a7b3dfe58143dbfc2c368abd0543d4e5d2728afcbcc9c2b96c7d","impliedFormat":99},{"version":"8fa21591f8689152157c9e3449ac95391fe5f31a9770a58bf9c0e4f5ee0d4af3","impliedFormat":1},{"version":"ac8582e453158a1e4cccfb683af8850b9d2a0420e7f6f9a260ab268fc715ab0d","impliedFormat":1},{"version":"c80aa3ff0661e065d700a72d8924dcec32bf30eb8f184c962da43f01a5edeb6f","impliedFormat":1},{"version":"bcf1245c84b2237aa397c74273b6a5e7de8464a07f8403c549f9bac7ae4daacd","affectsGlobalScope":true,"impliedFormat":1},{"version":"617490cbb06af111a8aa439594dc4df493b20bbf72acc43a63ceade3d0d71e2a","impliedFormat":1},{"version":"eb34b5818c9f5a31e020a8a5a7ca3300249644466ef71adf74e9e96022b8b810","impliedFormat":1},{"version":"cdec09a633b816046d9496a59345ad81f5f97c642baf4fe1611554aa3fbf4a41","impliedFormat":1},{"version":"5b933c1b71bff2aa417038dabb527b8318d9ef6136f7bd612046e66a062f5dbf","impliedFormat":1},{"version":"b94a350c0e4d7d40b81c5873b42ae0e3629b0c45abf2a1eeb1a3c88f60a26e9a","impliedFormat":1},{"version":"231f407c0f697534facae9ca5d976f3432da43d5b68f0948b55063ca53831e7c","impliedFormat":1},{"version":"188857be1eebad5f4021f5f771f248cf04495e27ad467aa1cf9624e35346e647","impliedFormat":1},{"version":"d0a20f432f1f10dc5dbb04ae3bee7253f5c7cee5865a262f9aac007b84902276","impliedFormat":1},{"version":"40a2c0b501a4900e65a2e59f7f8ae782d74b6458c39a5dd512fafc4afea4b227","impliedFormat":1},{"version":"4536edc937015c38172e7ff9d022a16110d2c1890529132c20a7c4f6005ee2c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"b750081497a8731c793cedf735f61007bb3a70efbfc12e4cdae90f906f1c5755","impliedFormat":1},{"version":"a3f10b207ac34092603a802aa6d932d22372d571d4649c1d48a074b71da95eac","impliedFormat":1},{"version":"f42365baa04389b983f87a8e14c130ea0ab4a913fada35e8e8e8825a450d4840","impliedFormat":1},{"version":"98ad7367a33f8b7cebad1f8b92e56287b28eda1bfd11f8fef8673980b1090a91","impliedFormat":1},{"version":"be43be05fe9cfd2eb3ce785ef8cbc48737843aac7baf8345c0d8857d7703c996","impliedFormat":1},{"version":"2622d23b82f46eecadc419a286395ddfaaee2f5d533b35127235815ed8807b76","impliedFormat":1},{"version":"406820d111d981e35608f3b6525b8b8a818f2ef83083e8b381f3336d7067a593","impliedFormat":1},{"version":"3bc9a5fc50e1b5678284bf0c8f6319e0cc4910e4ecc1bdb3d490850c9a0859b8","impliedFormat":1},{"version":"e480120d79410e40d95f27fd46da84e12e16b8ff57dda7206a97cb165a2c2213","impliedFormat":1},{"version":"54e4b2a4cfdae8bd4fa66c3baa19af1df604959c81f921252dfc2777e6eebd25","impliedFormat":1},{"version":"f00d9f3635a0f2b6427437b01543ecba1dbf4a5db9adb7d045beb90f8497a87e","impliedFormat":1},{"version":"1611551020c708492c66ffcda9e2b593c3ff91ee8875365c057213a8564ee60b","impliedFormat":1},{"version":"d8158d02e93f868ef402ed06e2a33e419585fe069193905c29e80554e87ac15c","impliedFormat":1},{"version":"ee994010f671930976c04e4ed48f1f3380c51dc009d7846a2ca1e86468c37257","impliedFormat":1},{"version":"8dcf156fc7436c5a104f0ecd75c2f0069061502ce9900607c1667aaca3a6851e","impliedFormat":1},{"version":"afeaa3163ca96eba18a94a8310ea952164ef767d7ae1e3f21b19bad1e204d087","impliedFormat":1},{"version":"9061663f4f28b12ca29ef8940a44ec53d5f9f386e5edee569fdcdfc7e4ca14eb","impliedFormat":1},{"version":"453ea807ecb71949a1ef40b09b2368f3a6a487705f5a2116af925efa2f7e6d92","impliedFormat":1},{"version":"a07ed03a026bf50005a267f7dd20db3797e1662da44ea635d4770420096f02e3","impliedFormat":1},{"version":"a9d62506c38c63df06c007381a4adf5459355ee31a292b86ebea9c836bb7e841","impliedFormat":1},{"version":"7641368980134052046a56141286a4ca7ab30d40fe1ba209cbffce7ddf811456","impliedFormat":1},{"version":"26020fd840eba5d9209e6b07df23d7a9ceb7571fde0c3ae9f443c84619de6a41","impliedFormat":1},{"version":"44357c6a5dab66018d8262a99a67334a0e83037da789bf5495f12d72c18ed46c","impliedFormat":1},{"version":"782ede6abab3148ba43fa5c41c3ac045b81299d306ce06bc27c045c99e375aaa","impliedFormat":1},{"version":"87a4142f849a63088dfbb3a2b67320e497e1ac1a008051e75f32ca0cc75d8da1","impliedFormat":1},{"version":"93bd377447dcc0ddb93afe519b7ca4f0400eb8d1fd11fa49848f7522789bbc38","impliedFormat":1},{"version":"87f7c14cf79d5c5409e1260dfc1dda3bc9b0d13b81f2ff39b820dde587c569ee","impliedFormat":1},{"version":"b9dd0d484906d4444d32a4c70451eaed8d54dfd618cc6f9912f0e20a6b54d7e6","impliedFormat":1},{"version":"353eca851a8aace8404c346d91e350c8ed959759f8fb2a33060ab0d850eed9c4","impliedFormat":1},{"version":"b00498e0f7de6d0b2eaabf6bc6c27d54e224dbde9b8710c37a0c5f9cabff9013","impliedFormat":1},{"version":"993200dc344eac5de024608fe26fbb1cf4764c254229f481ed8aae084f2fe0e4","impliedFormat":1},{"version":"fc23536cabc16a53018f4dbe8be39db84a73cf1c69b85f238b9ae7e09edaa199","impliedFormat":1},{"version":"89163956c437b564e0073e53141646df002e1d57d2e0bc2dbc3b0a4691776c5f","impliedFormat":1},{"version":"4970c3f3f4b6902144173902c3a969517d708ecbd8c50cc6465d4f2c488fad9e","impliedFormat":1},{"version":"9fd0da3a46448bcc367f52f9f57ba10b8eaf06bc9d4f34698298ec2aab991807","impliedFormat":1},{"version":"f3f337ffc81aab30ec297669919e1d606028f7864f6d14fee0b93547b882d2bb","impliedFormat":1},{"version":"c2649fb23b8767464051cf1f92ed0fed53ea7d5cbd6f807a348402e0be37500c","impliedFormat":1},{"version":"0d3646c780151c55b6bcf7c15f66b6769ac554eac2aedf3294edff04a0045cfe","impliedFormat":1},{"version":"8778eb90e3cd6d0e4b36aeca250abb807e009ceed8fde90866afc7568f185646","impliedFormat":1},{"version":"304ec145044d3fd83921ee3bc57f3f9bba7ac84e866aec6bab17820a581f171e","impliedFormat":1},{"version":"e15cc57b8f017cef8e32c06f04b6c724f8681f9442efc2aa4c757464483f32bc","impliedFormat":1},{"version":"bb539d13f42ca588fc5083b94e537ed67fe47449da84d414b14f3d17c7b5c49e","impliedFormat":1},{"version":"592f9ad00e8c3734ecaad7203b05fd72a028aa9fb11e64db927f00d8715476d6","impliedFormat":1},{"version":"0b4046e2e44fbcc8ad9f4e56859ab9874c669249a51217e21d6c2402ff26e615","impliedFormat":1},{"version":"da332d91f1da53266c5eb9af28f0235ab248ad81f68890df1de8b88074b24a4a","impliedFormat":1},{"version":"0764641d314681c58c751f42b47a572115dc842a72072fa868a259a1cc70f6ff","impliedFormat":1},{"version":"3720043192743812e92ee320868617e7f7e55115ea58ad9e5a512c763716a381","impliedFormat":1},{"version":"fa106dbcb508da05acda26c2deb5ecd307fd323f2d491056b980c25d7d9d3d19","impliedFormat":1},{"version":"686c74caa6c90f835616624627be07c4c977c217e400db2d6cab99b3b19681d0","impliedFormat":1},{"version":"33598ffcfddac61cb35af961c6794b6dc03a89fd2e92089113b34dbb42bd2e27","impliedFormat":1},{"version":"1f1852185404db45d03465a19f7c65bb8f2540bfccb6b967cc32779fdf844f72","impliedFormat":1},{"version":"ae51b52a71c70aa77fac061acf81c4da5770ea10a9a1ff5df252eb79d4d93f26","impliedFormat":1},{"version":"55949c519449e0e0c1eb61d34aa42d5297c2e29883b45fd009629e914e856b30","impliedFormat":1},{"version":"0cbc69cf27e58df8b07063583fb2740d9dc664afc058491af2456a2e270b43bb","impliedFormat":1},{"version":"fdcc8e65fff640091ae5db35056ef87a343c373b5b78369ae509be0cda7df5d2","impliedFormat":1},{"version":"9b24babb0bd8d8cdd5e770250f0bdab0b97ad97056b2b59e6104eda349872b89","impliedFormat":1},{"version":"ca3c62ca26416a83e1090706d6df86a089a86b76b5bf561298b1fc5afa65b0a3","impliedFormat":1},{"version":"fde60d698983b343d3ace0742f852622230902ebe5917b1a5aabf7db7f34e3d9","impliedFormat":1},{"version":"9e8147e322367517e09022bf0f00886919b922de4fb4f9b856976a3c0c5597f1","impliedFormat":1},{"version":"430aae2003d27d257031cccff62b7c05468ca2201033f01b712959b47d458049","impliedFormat":1},{"version":"fd8b21234303f04f3357ba644ffd76844f02e70a7f07a290142f11ba71ceab92","impliedFormat":1},{"version":"d10535292b8a83db27138475488a427572a558559bf3be5cad89568c66deb5e2","impliedFormat":1},{"version":"54e98342907a1a0170d8d5dc81e4f05c5f6c526421e930aadd3e30c682498a29","impliedFormat":1},{"version":"1539b21903f2f9049f1f637bfd736d593205100dd3b3d2f7cabf23e6c004edbc","impliedFormat":1},{"version":"b04f4d4736305a8fd1910b01ae9c40d0738d952744d1ec904610d1764efa91af","impliedFormat":1},{"version":"1ad05fc69812ce854a3db895e6f9a72877151ff1e5d8af0ec78d5736afaa1fcf","impliedFormat":1},{"version":"0c11d5e2e654790dfa45f9bc2d3b653fe13c4f7a0c8a1d639a5a924b6e09be8c","impliedFormat":1},{"version":"324a44990de071515cb273632ace64d4f32b72f2d9391e003a63ea69aabd3364","impliedFormat":1},{"version":"31333fe58620f76321cc0153a0aa7ae0408e1b7ca3d1c26d2569ec44b6ee3805","impliedFormat":1},{"version":"6fc89c781ebd4d280c684ce1042c9ebbc4a59cf1ecf5983cfa2eefdd3cd449a0","impliedFormat":1},{"version":"593cc5d6276e32b36088a73756514161b750c2957a84ddf5153935eee3f95e3a","impliedFormat":1},{"version":"276b8af5ab99167e0a217186a39ffa44473beecd9a937057bcad2eb3e21c53b4","impliedFormat":1},{"version":"b760d358d0b42de531509e3bff8a9cffb934e3a2ff0d53fa244b3ebfaaef9f91","impliedFormat":1},{"version":"caac24397bd88bf85b02e42ec561181acab9384d9e2429e1ff3d65abe1567407","impliedFormat":1},{"version":"9efa716140d3e52b0dda513aa7b45252af15617d6b9a6b9a5be786a4f60042a8","impliedFormat":1},{"version":"4558f132688cff22a2acc65f44d277546b55435083141779beb11e993dcdbe13","impliedFormat":1},{"version":"2e4cbb24e294d25e6bd050f1a5d6b86422475c049afc65c3cd777b16c7af88b9","impliedFormat":1},{"version":"3e162b63e35c2007cb0eb3db0ba0fdb45e4185e5417440d79d56fc989aaea13e","impliedFormat":1},{"version":"d4c3c88d6c5bbff05051f52bc7ed0eb391915ca08e049f04a07bd663f4545232","impliedFormat":99},{"version":"6baefc27658b84f6565ecab2259a518671acd9cffef43f58e60c8366ceb9af6c","impliedFormat":99},{"version":"a04890f0d84d22fd5a654ee02c42fe94db43479d9abdfbd46dd88b347cf3b6d4","impliedFormat":99},{"version":"c014a1f6b96a0c6e476294372b6a9210989e4b2a9ea9b052d64b9b374152f016","impliedFormat":99},{"version":"4db4b196d99b42ae4f4475b9fef7a4bd9686b3e37d8734e62f650d59e26bc92a","impliedFormat":99},{"version":"aa6346beca6368ed81b40b9a402db2464b9dba5ec3f24e2ea264ca38cd96c090","impliedFormat":99},{"version":"a994a84831fceacefd7a7b09090c9d9398bcd2422ac36e91488a9e03f2b38b8d","impliedFormat":99},{"version":"291a98aa35cca99a5ef42a97344865e5d8d5dd9d7337b612283a87d272b2bb95","impliedFormat":99},{"version":"36c7d6a9249dc96c1345e54ba4335b63af955b817fb0baa4d561caa0c1876b15","impliedFormat":99},{"version":"53eb32877c5b646c0682c14d402bf9742e1bee8d86d57f9f7c75009a09cf9215","impliedFormat":99},{"version":"2cb16816c42c3055a0bb9d8b3c0fbcec61f1d3dd5655eaaa8e6a12d779e75206","impliedFormat":99},{"version":"bd008d0bf7917dcbbcdbcb594ddb921561ec69967de8e311d911a0727ce2f248","impliedFormat":99},{"version":"34eaa37b4a48c4e7b45b82a829aa9122ce7f925262b3dd6a278c0a89bc84d5c8","impliedFormat":99},{"version":"967be370f39d7ae0fa1f28707bf3167ce4893aa9bf81dbcece3ce3d2f43deefb","impliedFormat":99},{"version":"2fcabfb093d918876210e80f037ec2c768d0af5501b5be4858c283c28e8d6f93","impliedFormat":1},{"version":"c5d3fd81de19d95a1808ebb9bd7808dd10dd52418b1a1c529f6f4418b8d3352a","impliedFormat":99},{"version":"fac0bd8fb7a95cb36206f3dd4c272e343ecd759ab5f2fa30029e22635cb9de9d","impliedFormat":99},{"version":"fcea37d4da54ce2003ef3d287593743d797de193b4069b595e982144ff22b12d","impliedFormat":99},{"version":"1974d9cd45125039b651dfa8bcb9689e8c1d4d8a7dc20db710a27fe0d497fe6f","impliedFormat":99},{"version":"3b29f7d21bd6a07aea9adc06ee9612d3d86fa03663e3364b4d2c067c7f547e5e","impliedFormat":99},{"version":"01545f0274a774e191f06380ddedaec2b2dfbd021ca2e8775f7819959beb2cb4","impliedFormat":99},{"version":"6c557db1095e0588b7d82d9bdd9e4328872d436a94f2025da271d5ef57845309","impliedFormat":99},{"version":"2827790fc4a5c48d032a79a8d547eca0620d7fc7c997b830417f6de5b04c7c3d","impliedFormat":99},{"version":"7bba3bab37aa81a0b9628c26b43c38bfae8316e3e54a9a0572c2eaa7b20518c7","impliedFormat":99},{"version":"cbeb4c46612813c72b39dc7e0d5b897f0e9951cf81252d239ba3d20ce5758643","impliedFormat":99},{"version":"70474b89479c9af715d34af4a47fcfed0a2b2d849c0c3d4206af8c7aa8cd3ea4","impliedFormat":99},{"version":"30f228380cf6be920ac3020de1f1ba9357cf74abd9a7ddb4f552b53793422f6f","impliedFormat":99},{"version":"0c3b50fcca48ee42dd50c1348932f14a2d8ffe5bb27fe66b0289edc389d882ec","impliedFormat":99},{"version":"14ecfc29e0c44ad4c5e50f9b597492cd8f45a2a635db8b5fe911a5da83e26cf8","impliedFormat":1},{"version":"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","impliedFormat":1},{"version":"3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","impliedFormat":1},{"version":"e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","impliedFormat":1},{"version":"471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","impliedFormat":1},{"version":"c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","impliedFormat":1},{"version":"40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","impliedFormat":1},{"version":"8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","impliedFormat":1},{"version":"4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1","impliedFormat":1},{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true,"impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"dd78bfe9dfcadb2c4cd3a3a36df38fb3ef8ed2c601b57f6ad9a29e38a17ff39c","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","impliedFormat":1},{"version":"53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6","impliedFormat":1},{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f85c06e750743acf31f0cfd3be284a364d469761649e29547d0dd6be48875150","affectsGlobalScope":true,"impliedFormat":1},{"version":"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","impliedFormat":1},{"version":"5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","impliedFormat":1},{"version":"d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a30b7fefd7f8abbca4828d481c61c18e40fe5ff107e113b1c1fcd2c8dcf2743","affectsGlobalScope":true,"impliedFormat":1},{"version":"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","impliedFormat":1},{"version":"304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","impliedFormat":1},{"version":"1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","impliedFormat":1},{"version":"98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","impliedFormat":1},{"version":"c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","impliedFormat":1},{"version":"2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b","impliedFormat":1},{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","impliedFormat":1},{"version":"a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","impliedFormat":1},{"version":"d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900","impliedFormat":1},{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true,"impliedFormat":1},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","impliedFormat":1},{"version":"6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","impliedFormat":1},{"version":"56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","impliedFormat":1},{"version":"139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","impliedFormat":1},{"version":"7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","impliedFormat":1},{"version":"269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","impliedFormat":1},{"version":"2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927","impliedFormat":1},{"version":"257ff9424de2bf36ba29f928e268cf6075fb7a0c2acd339c9ad7ac64653081d2","affectsGlobalScope":true,"impliedFormat":1},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","impliedFormat":1},{"version":"9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","impliedFormat":1},{"version":"e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","impliedFormat":1},{"version":"b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0","impliedFormat":1},{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","impliedFormat":1},{"version":"4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc","impliedFormat":1},{"version":"bd93a3a1fabff2b95fe9442989cafdda76c3c8949ae1fc4bc75a92d04396d9e2","impliedFormat":99},{"version":"02ed2766d79a00719ac3cc77851d54bd7197c1b12085ea12126bc2a65068223e","impliedFormat":99},{"version":"4b84373e192b7e0f8569b65eb16857098a6ee279b75d49223db2a751fdd7efde","impliedFormat":99},{"version":"4beaed44904fb7a63bb00f17c5703baa79282e0f03b849bcae6af55fcbdb589d","impliedFormat":99},{"version":"7c37569e586a3276ae7cbc405c9f1c51efdf3f603cc8b76dd2196d1b01c2f9d0","impliedFormat":99},{"version":"bef359bd6998f4ce186f7450ec3fbd9cf47ee3097d75c26828b6d985c843a48d","impliedFormat":99},{"version":"696a04758e6c58966e18bb99a64292017fac57f0ba5482e1bc0b617be850b12e","impliedFormat":99},{"version":"46fe6faf3d6907bb675b5c37df15b6021b9ca1e4f91b25ccc422630b4c1568e3","impliedFormat":99},{"version":"c45a995ea8fd0d701c3e013dcf7a106809d9b1517c7115ade3f58d4196bd350c","impliedFormat":99},{"version":"0332891c6714ceea22d919677ba76e7875f4be1104dc1c2a19b9359b7a2e08e4","impliedFormat":99},{"version":"38a217719a1e847d3b56f0e513075f07740ea536a838c332d02b2ce4288f23be","impliedFormat":99},{"version":"d51809d133c78da34a13a1b4267e29afb0d979f50acbeb4321e10d74380beeea","impliedFormat":99},{"version":"68745f37d24b1b5800c45d0c5c00abfcbb031f9be0bcecdafd29405667397abe","impliedFormat":99},{"version":"fccc4725f7937821ed7744c796c090963929da13a497a05a58ba478d1c1442ef","impliedFormat":99},{"version":"7537e0e842b0da6682fd234989bac6c8a2fe146520225b142c75f39fb31b2549","impliedFormat":99},{"version":"75e7f3ceea520eb800e38806fe4be2a37747597d837602657ed809840d64e9e8","impliedFormat":99},{"version":"60fbce4fe62a585d67228f8c1e43e7f1e5493519ac7f3d0fb383d95c1f690a1b","impliedFormat":99},{"version":"ec680627cfcc2c14c92a3771593020cd6ef28b20ac2c11595c788c22e5ed8825","impliedFormat":99},{"version":"4bf23205a5134b5cb091f32ebd7affd760654a2b8cb97c9fa88f7c707a9ac2bd","impliedFormat":99},{"version":"b2f9961e315ef33571dd9bf260954d490a102415bbe2fd9d1bef851a02349c25","impliedFormat":99},{"version":"da8fa56052507a3beea2fb7042c4c5bb8ac42e2e9ff33c8b42b3b518a4842f1f","impliedFormat":99},{"version":"b26eecf17ac0c18014cc89f48834eea70477c0ed7c635ea07dab4d8fcb2fbe93","impliedFormat":99},{"version":"117ffeecf6c55e25b6446f449ad079029b5e7317399b0a693858faaaea5ca73e","impliedFormat":1},{"version":"3937b50a4de68f6d21614461e9d47af0d8421ca80fc2a72b667ca2151f492120","impliedFormat":1},{"version":"900c9ac4410e26a79c84018c05a0f2f349f4a8a8642979f2c406635098061393","impliedFormat":1},{"version":"bd93a3a1fabff2b95fe9442989cafdda76c3c8949ae1fc4bc75a92d04396d9e2","impliedFormat":1},{"version":"02ed2766d79a00719ac3cc77851d54bd7197c1b12085ea12126bc2a65068223e","impliedFormat":1},{"version":"4b84373e192b7e0f8569b65eb16857098a6ee279b75d49223db2a751fdd7efde","impliedFormat":1},{"version":"fc85a7c96dc69c9e16ccc8d9520075d1ec272e0036aa26c88251709ba25ac841","impliedFormat":1},{"version":"9a54fbcd6b9dc94128b240c737dc29e250cd46324ef9e81a7a669184f0b2a492","impliedFormat":1},{"version":"ea5bed05bbaf5bf64db72c16595c4b38174ae1907e7d1c0f141c62028dfc7489","impliedFormat":1},{"version":"10b380d117e4541a5c0a579b688d8ca242b8c6e2ab8b482c3d275dbf36b0c302","impliedFormat":1},{"version":"82b3cba0541866992f8a590c22b1af692dd72bce7659d7f3b8f01cff1eccf6a4","impliedFormat":1},{"version":"7219baf44a47094a4226d3f129c45469fd4a4fe5423930ea733a8565033e6855","impliedFormat":1},{"version":"f36667369f72f863ca0fe9d969b5c5748775ff3346d50a992695e48c781dfcb3","impliedFormat":1},{"version":"cc28535a906585353be3076b92f6ace9a900ea88449995d9b2d85b969ead3e8b","impliedFormat":1},{"version":"425c40782eb4b3c26c62e6eb9283f25867f8a32b488175b7a91330ee8a2d835f","impliedFormat":1},{"version":"7537e0e842b0da6682fd234989bac6c8a2fe146520225b142c75f39fb31b2549","impliedFormat":1},{"version":"752bc032dbf613a7e8c3298651ffc1d839ae321d9dcb1adb7fb2449fcfcf724f","impliedFormat":1},{"version":"25553dd62e1ff6120422ec20e03841e8374ca3c46a47847921d788aa9f6d75b8","impliedFormat":1},{"version":"0052f6cf96c3c7dc10e27540cee3839d3a5f647df9189c4cfb2f4260ff67fc92","impliedFormat":1},{"version":"6dc488fd3d01e4269f0492b3e0ee7961eec79f4fc3ae997c7d28cde0572dbd91","impliedFormat":1},{"version":"a09b706f16bda9372761bd70cf59814b6f0a0c2970d62a5b2976e2fd157b920f","impliedFormat":1},{"version":"ad8ca55ce3f0db1921e36c9f7f8c67826ff5b66b096de00e2b1fe1ecc8a8251a","impliedFormat":1},{"version":"b58ea2d34cf68ee8e01028dc5039490963ff1ebee838a5f8e0c22b7bbd827479","impliedFormat":1},{"version":"1823f3a1dba689bc2fdccaf67f744003b452ef4a1ad0c2dd6e8d3243e6b6655d","impliedFormat":1},{"version":"db0bcc704537eb20637182cf373fee555bb05a7db3a2f9b8cc5cfd5ae4db8a24","impliedFormat":1},{"version":"4aa2f96b81b14206ee2539126d373b450d8f2454d72039ac38a0daf0f651890f","impliedFormat":99},{"version":"c6e970337272dad258b653e3795c2cb410e86e5be97b626fb248e7069c5e13ab","impliedFormat":99},{"version":"0abc145ad160b017474b634fdc4f078bb927676eba496d43e16419a0bcd4ac11","impliedFormat":99},{"version":"32cbe201bfe8ed7f4c323fb8a3fcfdfb451f22e84d3c49da33ceda2fbf9230be","impliedFormat":99},{"version":"57a57c130dc597c5e65c27d203e915ebb194d3d6cb21f4bd20bb4ffa6da57810","impliedFormat":99},{"version":"9b8504d83696efbf20fc97d14ae71bde4ca5a0c957657bdb4db0496353a27234","impliedFormat":99},{"version":"b536ec7c1188023add680f8c86d17fc8b8462493e7f85f2303fd8e5f9acd7345","impliedFormat":99},{"version":"327d1410497b2e59e2e9d289e38d3ea6649424246a7bf06af6dceb6b325cdbd2","impliedFormat":99},{"version":"8442636337af073b3914bcac51cb37cce30cd6939a435a03557e0945cccbe7b0","impliedFormat":99},{"version":"00635b715d343e7a970fb536256fa9689d5cc0160c6b671a8ec622b7f1ac13c9","impliedFormat":99},{"version":"1df8a60ea1b1ca29697bca90b23f1f6314bbff7968e364710c4d2ad3eff92db4","impliedFormat":99},{"version":"3372bad780414017ef08dc46d910eae7989b6f79431187bd4b5ca7906e3c189d","impliedFormat":99},{"version":"49a4a3aa4f4b6aab006edba6b1bb0f9b27002ab63fc8334774a231d42caf1f58","impliedFormat":99},{"version":"a78f50e337f69300a4180f5559154054364eb3291146c2907f21d4371f8a70b8","impliedFormat":99},{"version":"7d4b301f8371224d1406703429b65468a8b8a74bd7a540154221e1fe6fdfc7b8","impliedFormat":99},{"version":"2375ce7bc038de3fc78edc15ada99a11c85e32fde9f10c73e6435ca10bfd1d78","impliedFormat":99},{"version":"0495ec24f6aa5bea8d0e90f3af9be73326e0ed3783554e37628f632fa13757f7","impliedFormat":99},{"version":"20064a8528651a0718e3a486f09a0fd9f39aaca3286aea63ddeb89a4428eab2b","impliedFormat":1},{"version":"743da6529a5777d7b68d0c6c2b006800d66e078e3b8391832121981d61cd0abc","impliedFormat":1},{"version":"f87c199c9f52878c8a2f418af250ccfc80f2419d0bd9b8aebf4d4822595d654f","impliedFormat":1},{"version":"57397be192782bd8bedf04faa9eea2b59de3e0cfa1d69367f621065e7abd253b","impliedFormat":1},{"version":"df9e6f89f923a5e8acf9ce879ec70b4b2d8d744c3fb8a54993396b19660ac42a","impliedFormat":1},{"version":"175628176d1c2430092d82b06895e072176d92d6627b661c8ea85bee65232f6e","impliedFormat":1},{"version":"21625e9b1e7687f847a48347d9b77ce02b9631e8f14990cffb7689236e95f2bb","impliedFormat":1},{"version":"483fad2b4ebaabd01e983d596e2bb883121165660060f498f7f056fecd6fb56a","impliedFormat":1},{"version":"6a089039922bf00f81957eafd1da251adb0201a21dcb8124bcfed14be0e5b37d","impliedFormat":1},{"version":"6cd1c25b356e9f7100ca69219522a21768ae3ea9a0273a3cc8c4af0cbd0a3404","impliedFormat":1},{"version":"201497a1cbe0d7c5145acd9bf1b663737f1c3a03d4ecffd2d7e15da74da4aaf1","impliedFormat":1},{"version":"66e92a7b3d38c8fa4d007b734be3cdcd4ded6292753a0c86976ac92ae2551926","impliedFormat":1},{"version":"a8e88f5e01065a9ab3c99ff5e35a669fdb7ae878a03b53895af35e1130326c15","impliedFormat":1},{"version":"05a8dfa81435f82b89ecbcb8b0e81eb696fac0a3c3f657a2375a4630d4f94115","impliedFormat":1},{"version":"5773e4f6ac407d1eff8ef11ccaa17e4340a7da6b96b2e346821ebd5fff9f6e30","impliedFormat":1},{"version":"c736dd6013cac2c57dffb183f9064ddd6723be3dfc0da1845c9e8a9921fc53bb","impliedFormat":1},{"version":"7b43949c0c0a169c6e44dcdf5b146f5115b98fa9d1054e8a7b420d28f2e6358f","impliedFormat":1},{"version":"b46549d078955775366586a31e75028e24ad1f3c4bc1e75ad51447c717151c68","impliedFormat":1},{"version":"34dd068c2a955f4272db0f9fdafb6b0871db4ec8f1f044dfc5c956065902fe1c","impliedFormat":1},{"version":"e5854625da370345ba85c29208ae67c2ae17a8dbf49f24c8ed880c9af2fe95b2","impliedFormat":1},{"version":"cf1f7b8b712d5db28e180d907b3dd2ba7949efcfec81ec30feb229eee644bda4","impliedFormat":1},{"version":"2423fa71d467235a0abffb4169e4650714d37461a8b51dc4e523169e6caac9b8","impliedFormat":1},{"version":"4de5d28c3bc76943453df1a00435eb6f81d0b61aa08ff34ae9c64dd8e0800544","impliedFormat":1},{"version":"659875f9a0880fb4ae1ce4b35b970304d2337f98fe6f2e4671567d7292780bae","impliedFormat":1},{"version":"dbfa8af0021ddb4ddebe1b279b46e5bccf05f473c178041b3b859b1d535dd1e5","impliedFormat":1},{"version":"7ab2721483b53d5551175e29a383283242704c217695378e2462c16de44aff1a","impliedFormat":1},{"version":"ebafa97de59db1a26c71b59fa4ee674c91d85a24a29d715e29e4db58b5ff267d","impliedFormat":1},{"version":"16ba4c64c1c5a52cc6f1b4e1fa084b82b273a5310ae7bc1206c877be7de45d03","impliedFormat":1},{"version":"1538a8a715f841d0a130b6542c72aea01d55d6aa515910dfef356185acf3b252","impliedFormat":1},{"version":"68eeb3d2d97a86a2c037e1268f059220899861172e426b656740effd93f63a45","impliedFormat":1},{"version":"d5689cb5d542c8e901195d8df6c2011a516d5f14c6a2283ffdaae381f5c38c01","impliedFormat":1},{"version":"9974861cff8cb8736b8784879fe44daca78bc2e621fc7828b0c2cf03b184a9e5","impliedFormat":1},{"version":"675e5ac3410a9a186dd746e7b2b5612fa77c49f534283876ffc0c58257da2be7","impliedFormat":1},{"version":"951a8f023da2905ae4d00418539ff190c01d8a34c8d8616b3982ff50c994bbb6","impliedFormat":1},{"version":"f2d7b9458a51b24d6a39dcdebb446111cdaf3ebcc3f265671f860b6650c722fe","impliedFormat":1},{"version":"955c80622de0580d047d9ccdb1590e589c666c9240f63d2c5159e0732ab0a02e","impliedFormat":1},{"version":"e4b31fc1a59b688d30ff95f5a511bfb05e340097981e0de3e03419cbefe36c0e","impliedFormat":1},{"version":"16a2ac3ba047eddda3a381e6dac30b2e14e84459967f86013c97b5d8959276f3","impliedFormat":1},{"version":"45f1c5dbeb6bbf16c32492ba182c17449ab18d2d448cc2751c779275be0713d8","impliedFormat":1},{"version":"23d9f0f07f316bc244ffaaec77ae8e75219fb8b6697d1455916bc2153a312916","impliedFormat":1},{"version":"eac028a74dba3e0c2aa785031b7df83586beab4efce9da4903b2f3abad293d3a","impliedFormat":1},{"version":"8d22beed3e8bbf57e0adbc986f3b96011eef317fd0adadccd401bcb45d6ee57e","impliedFormat":1},{"version":"3a1fc0aae490201663c926fde22e6203a8ac6aa4c01c7f5532d2dcdde5b512f5","impliedFormat":1},{"version":"cb7dc2db9e286cfc107b3d90513a0e24276a7f0474059c2694ec3b37a3093426","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"a7f590406204026bf49d737edb9d605bb181d0675e5894a6b80714bbc525f3df","impliedFormat":1},{"version":"533039607e507410c858c1fa607d473deacb25c8bf0c3f1bd74873af5210e9a0","impliedFormat":1},{"version":"b09561e71ae9feab2e4d2b06ceb7b89de7fad8d6e3dc556c33021f20b0fb88c4","impliedFormat":1},{"version":"dd79d768006bfd8dd46cf60f7470dca0c8fa25a56ac8778e40bd46f873bd5687","impliedFormat":1},{"version":"4daacd053dd57d50a8cdf110f5bc9bb18df43cd9bcc784a2a6979884e5f313de","impliedFormat":1},{"version":"d103fff68cd233722eea9e4e6adfb50c0c36cc4a2539c50601b0464e33e4f702","impliedFormat":1},{"version":"3c6d8041b0c8db6f74f1fd9816cd14104bcd9b7899b38653eb082e3bdcfe64d7","impliedFormat":1},{"version":"4207e6f2556e3e9f7daa5d1dd1fdaa294f7d766ebea653846518af48a41dd8e0","impliedFormat":1},{"version":"c94b3332d328b45216078155ba5228b4b4f500d6282ac1def812f70f0306ed1c","impliedFormat":1},{"version":"43497bdd2d9b53afad7eed81fb5656a36c3a6c735971c1eed576d18d3e1b8345","impliedFormat":1},{"version":"5db2d64cfcfbc8df01eda87ce5937cb8af952f8ba8bbc8fd2a8ef10783614ca7","impliedFormat":1},{"version":"b13319e9b7e8a9172330a364416d483c98f3672606695b40af167754c91fa4ec","impliedFormat":1},{"version":"7f8a5e8fc773c089c8ca1b27a6fea3b4b1abc8e80ca0dd5c17086bbed1df6eaa","impliedFormat":1},{"version":"0d54e6e53636877755ac3e2fab3e03e2843c8ca7d5f6f8a18bbf5702d3771323","impliedFormat":1},{"version":"124b96661046ec3f63b7590dc13579d4f69df5bb42fa6d3e257c437835a68b4d","impliedFormat":1},{"version":"55c757a58282956c14fcad649c4221f02c4455b401f5b1011f8b921cbc2da80e","impliedFormat":1},{"version":"724775a12f87fc7005c3805c77265374a28fb3bc93c394a96e2b4ffee9dde65d","impliedFormat":1},{"version":"30ae46aab3d5a05c1a4c7144bc357621c81939dd5c0b11090f69e2b1c43c6f01","impliedFormat":1},{"version":"c477c9c6003e659d5aad681acd70694176d4f88fc16cc4c5bcfa5b8dcc01874b","impliedFormat":1},{"version":"ca2ebe3f3791275d3287eed417660b515eb4d171f0b7badcfa95f0f709b149f7","impliedFormat":1},{"version":"b4fa8bc7aeb4d1fc766f29e7f62e1054a01ac1eb115c05a7f07afa51e16668ff","impliedFormat":1},{"version":"e2a4983a141f4185996e1ab3230cb24754c786d68434f2e7659276c325f3c46c","impliedFormat":1},{"version":"b2216c0b4c7f32e7e9bba74d0223fc9ad3bec50b71663701d60578cecc323fb5","impliedFormat":1},{"version":"1cbbd9272af325d7189d845c75bbdb6d467ce1691afe12bcb9964e4bd1270e66","impliedFormat":1},{"version":"86eb11b1e540fe07b2ebfc9cca24c35b005f0d81edf7701eaf426db1f5702a07","impliedFormat":1},{"version":"1a12da23f2827e8b945787f8cc66a8f744eabf3d3d3d6ba7ad0d5dfeeb5dfbb4","impliedFormat":1},{"version":"67cbde477deac96c2b92ccb42d9cf21f2a7417f8df9330733643cc101aa1bca5","impliedFormat":1},{"version":"2cb440791f9d52fa2222c92654d42f510bf3f7d2f47727bf268f229feced15ba","impliedFormat":1},{"version":"5bb4355324ea86daf55ee8b0a4d0afdef1b8adadc950aab1324c49a3acd6d74e","impliedFormat":1},{"version":"64e07eac6076ccb2880461d483bae870604062746415393bfbfae3db162e460a","impliedFormat":1},{"version":"5b6707397f71e3e1c445a75a06abf882872d347c4530eef26c178215de1e6043","impliedFormat":1},{"version":"c74d9594bda9fe32ab2a99010db232d712f09686bbee66f2026bc17401fe7b7e","impliedFormat":1},{"version":"15bbb824c277395f8b91836a5e17fedc86f3bb17df19dcdc5173930fd50cc83e","impliedFormat":1},{"version":"47500fa93a1970ebd86f552b26e8b502aa12263cbf10f549c45d824bf37c4e46","impliedFormat":1},{"version":"c155ae94698cf0ddc6794fce0787dc436556963fb0289c914d5ff3f63c1f472e","impliedFormat":1},{"version":"f54f0d5c19bc57ba17b690a8121c5cf3a2e8dc887fcf2257f74bd799a097ff9b","impliedFormat":1},{"version":"a61fe1d36e52610853e709fd0dab30de2b53e3d7afe5ad336696492a7eda0877","impliedFormat":1},{"version":"42dbc7f80df0369abc6376234898767a47de30809d40e1668878d47123bd2802","impliedFormat":1},{"version":"7c8266350412c20023ad6f78deccec313c804e82167f1d8367f5403cbf2e9dcb","impliedFormat":1},{"version":"8c4eacbd89171a62110657df3eeed414077e651a01578fea82e56092a0608fa3","impliedFormat":1},{"version":"3de634975d27bf67ff397484ae26e60f1a32b211f4709e921ad3be76c07fa0d9","impliedFormat":1},{"version":"342a37c1b97735df61fdeb2497fde2771bcdcadcaaebdd1d626d4b51d3bc164d","impliedFormat":1},{"version":"07ea97f8e11cedfb35f22c5cab2f7aacd8721df7a9052fb577f9ba400932933b","impliedFormat":1},{"version":"66ab54a2a098a1f22918bd47dc7af1d1a8e8428aa9c3cb5ef5ed0fef45a13fa4","impliedFormat":1},{"version":"ad81f30f47f1ab2bb5528b97c1e6e4dab5e006413925052f4573a30bf4a632bd","impliedFormat":1},{"version":"ff3f1d258bd14ca6bbf7c7158580b486d199e317fc4c433f98f13b31e6bb5723","impliedFormat":1},{"version":"a3f1cac717a25f5b8b6df9deef8fc8d0a0726390fdaa83aed55be430cd532ebf","impliedFormat":1},{"version":"bf22ee38d4d989e1c72307ab701557022e074e66940cf3d03efa9beb72224723","impliedFormat":1},{"version":"68ce7df3ae5d096597107619d2507ef4e86a641c0371f88a4a6fa0adac6cb461","impliedFormat":1},{"version":"f1a1edb271da27e2d8925a68db1eb8b16d8190037eb44a324b826e54f97e315f","impliedFormat":1},{"version":"1553d16fb752521327f101465a3844fe73684503fdd10bed79bd886c6d72a1bc","impliedFormat":1},{"version":"271119c7cbd09036fd8bd555144ec0ea54d43b59bcb3d8733995c8ef94cb620b","impliedFormat":1},{"version":"5a51eff6f27604597e929b13ee67a39267df8f44bbd6a634417ed561a2fa05d6","impliedFormat":1},{"version":"1f93b377bb06ed9de4dc4eb664878edb8dcac61822f6e7633ca99a3d4a1d85da","impliedFormat":1},{"version":"53e77c7bf8f076340edde20bf00088543230ba19c198346112af35140a0cfac5","impliedFormat":1},{"version":"6e0f9298ff05cc206fe1ec45fd2b55a8d93d4136b0d75b395c73968814d7c5ba","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"68888ec4d4cff782a03aebc26ddc821e1f4dffb3a22940164eff67371997add6","impliedFormat":1},{"version":"c9018ca6314539bf92981ab4f6bc045d7caaff9f798ce7e89d60bb1bb70f579c","impliedFormat":1},{"version":"d74c5b76c1c964a2e80a54f759de4b35003b7f5969fb9f6958bd263dcc86d288","impliedFormat":1},{"version":"b83a3738f76980505205e6c88ca03823d01b1aa48b3700e8ba69f47d72ab8d0f","impliedFormat":1},{"version":"01b9f216ada543f5c9a37fbc24d80a0113bda8c7c2c057d0d1414cde801e5f9d","impliedFormat":1},{"version":"f1e9397225a760524141dc52b1ca670084bde5272e56db1bd0ad8c8bea8c1c30","impliedFormat":1},{"version":"08c43afe12ba92c1482fc4727aab5f788a83fd49339eb0b43ad01ed2b5ad6066","impliedFormat":1},{"version":"6066b918eb4475bfcce362999f7199ce5df84cea78bd55ed338da57c73043d45","impliedFormat":1},{"version":"5fd5d02d1ec7d48a180deaefcfec819c364ec4ffddd1371ec2c7ad9d36e8220f","impliedFormat":1},{"version":"526f860ab047358ccdd6cd2de52ebbb0022cdecaf3af842f74fa2dd3a1ab556b","impliedFormat":1},{"version":"1c94de96416c02405da00d8f7bde9d196064c3ce1464f0c4df1966202196b558","impliedFormat":1},{"version":"406cc85801b49efd5f75c84cc557e2bba9155c7f88c758c3fadd4e844ad6b19e","impliedFormat":1},{"version":"6d235f62eb41ac4010a0dab8ba186c20dec8565f42273a34f0fa3fc3ca9d0dbb","impliedFormat":1},{"version":"f7663954884610aeb38c78ffd22525749fab19ab5e86e4a53df664180efd1ff5","impliedFormat":1},{"version":"4ac0045aa4bc48b5f709da38c944d4fec2368eda6b67e4dd224147f3471b7eaf","impliedFormat":1},{"version":"1d2d7636e3c6906a5d368ab0bab53df39e2a6f99c284bae4625b6445c1d799e7","impliedFormat":1},{"version":"9555a2d83e46b47c5b72de5637b2afad68b28670deacdb3b514267d780b5423c","impliedFormat":1},{"version":"3e717eef40648a7d8895219063b1e5cb5bcc404bc1d41a22b91f3140b83bce1d","impliedFormat":1},{"version":"9b61c06ab1e365e5b32f50a56c0f3bb2491329bb3cd2a46e8caa30edcf0281cc","impliedFormat":1},{"version":"8f91df3614625daa000bffe84a5c1939b4da0254db9d7c62764f916ebb93dcdc","impliedFormat":1},{"version":"ee745db646de4c5cf019e495ff5d800ed6f4ee9d9b3aaa7b2c5ca836928bc80e","impliedFormat":1},{"version":"d8d808ab0c5c550fb715641e1f5813dededa9b657e7ed3c3a6665ce7f629273d","impliedFormat":1},{"version":"059a7dfc70b0e875ef87a961d1e9b69917a32a6eea1c3950a5aad8c62d8274aa","impliedFormat":1},{"version":"cf575b64fadf5f646c0f715730c490f317f856f5b3bbe06493638576bad711d9","impliedFormat":1},{"version":"d260a7eae2f0f643fe2de133cfa3e7d035e9e787cb88119f9628099d4039609c","impliedFormat":1},{"version":"6306621db4fbb1c1e79883599912c32da2c5974402531b47a2cf2c19ce61200e","impliedFormat":1},{"version":"a4f50263cd9ef27fcb0ab56c7214ffca3a0871f93ddd3dfb486bfa07aeed55ef","impliedFormat":1},{"version":"f263db23ce0b198ab373032126d83eb6bcd9a70c1f08048e7770dac32297d9b5","impliedFormat":1},{"version":"f6ff0d0ac0bf324dd366aadf72c5458da333fbd44aa1dae825507be3b3b6ccdc","impliedFormat":1},{"version":"aa8f659712fd02d08bdf17d3a93865d33bd1ee3b5bcf2120b2aa5e9374a74157","impliedFormat":1},{"version":"5a06765319ef887a78dd42ca5837e2e46723525b0eaa53dd31b36ba9b9d33b56","impliedFormat":1},{"version":"27bf29df603ae9c123ffd3d3cfd3b047b1fa9898bf04e6ab3b05db95beebb017","impliedFormat":1},{"version":"acd5aa42ea02c570be5f7fa35451cc9844b3b8c1d66d3e94aa4875ec868ac86e","impliedFormat":1},{"version":"4278526ea26849feb706bbc4cda029b6fd99dd8875fb58daeeca02b346bbdbb4","impliedFormat":1},{"version":"9d1c3fe1639a48bfd9b086b8ae333071f7da60759344916600b979b7ed6ffaa6","impliedFormat":1},{"version":"8b3d89d08a132d7a2549ac0a972af3773f10902908a96590b3fe702c325a80ec","impliedFormat":1},{"version":"450040775fe198d9bf87cf57ca398d1d2e74b4f84bca6e5dbf0b73217cf9004b","impliedFormat":1},{"version":"98ee8fe92810ad706b1bfb06441bee284b62c07175ae9ba875589043d0836086","impliedFormat":1},{"version":"49cfd2c983594c18fe36f64c82d5e1282fd5d42168e925937345ef927b07f073","impliedFormat":1},{"version":"310cb56898b50696ce10cff66102aca94c85833bf24effa10c434673c2d57f4c","impliedFormat":1},{"version":"ad62415a113c9a3556e3dc4557a5389735ab8a6b7c7835b11be9b7ae8ada0561","impliedFormat":1},{"version":"8f46cccec5c65f65525d6753c441bdacec11294a63ed05fe251266b51ba81a07","impliedFormat":1},{"version":"6af2b769f0cf81e0af97e428e3b007488c5f8ffd0c055cfc6ea0affe01cb3f26","impliedFormat":1},{"version":"c9c9ff79fc57622fbe6ee5a6311535d1a4e45f7d7bd6a09d68f77758e1563ab0","impliedFormat":1},{"version":"4507eb375ee3a0816f012d84c4bc0171974c862642975e37c2c9cb9c89bd49e4","impliedFormat":1},{"version":"5eefc69318cd391f726df9920ae75e1a4397d779e5cacd446804eb409731ae4b","impliedFormat":1},{"version":"6454633c474931a9b7ff26a0ba11efde4b6bbdc0affa9cb4dede58a4afd3a33d","impliedFormat":1},{"version":"561245d869462531843ff822d91cb0946d1c5d908184b2a9984321a25cad660c","impliedFormat":1},{"version":"be190c89dfc7816db3b8ce05cf9cb439a788b1a2ec52368a21e1c640b88edfee","impliedFormat":1},{"version":"3fbf81d3e7bd2b2fb1a3c94520d288e7ab2967425e927541ce7cf86be4cc2c70","impliedFormat":1},{"version":"1844945d0161178148f2f82e19c726a1f6b6f3b93ae9593fdd13615f1677bee5","impliedFormat":1},{"version":"acf7c4e29a0ea8cce0549393d869330dbe2e24901757e65dd71cb8408387385d","impliedFormat":1},{"version":"d71cdcdb40fef282cd7cab18807c0316660cd7aef26521a1f17883f3fd538fe8","impliedFormat":1},{"version":"dd4f68c0cb17bdc8dc390af94a519510bf6d048b8e093a43b307be384978342b","impliedFormat":1},{"version":"1669d352f1ddfaf5fbed076b17fbd0be5fd7d5524a79d1d27986e6f23c4c30a4","impliedFormat":1},{"version":"9d56b6f06fc6c282de36229cd00fdee2df6a3261044224ee8bb0766965fe6d74","impliedFormat":1},{"version":"4a47c898db15ac283e46fcfb148b968c67a837f45a1c41f6163bc396ca313bb3","impliedFormat":1},{"version":"be0ae1993ee15b7e25b5808a8d34b88c7443e1c2730bae38b2c4642099591eaa","impliedFormat":1},{"version":"b41b52206d064032437936a3708a1ccd5022f524d73ebdd54650b197cd9c5c5d","impliedFormat":1},{"version":"c2b3e96c52ed37ba06e006bfc4655ac89fb2769b5c605149237c8865314b08ab","impliedFormat":1},{"version":"53f751014cc08afeae6c3199b89b0ab0718e4f97da8b7845c5b2333748277938","impliedFormat":1},{"version":"730bc59b59a58a530d2ed0b995776db32a983aa8e1729724ea3e227e8b273133","impliedFormat":1},{"version":"e39514fc08fdedd95766643609b0ede54386156196d79a2d9d49247fb4406dcd","impliedFormat":1},{"version":"e4a4e40e8bc24425e03de8f002c62448dbaefe284278c0a1d93af2bfd2b528c2","impliedFormat":1},{"version":"4e6fc96724557945de42c1c5d64912ebd90d181358e1e58cce4bbf7b7b24d422","impliedFormat":1},{"version":"12ff538504c374dfa9f554c03d19b2a39ae1816a18b32c1a0549d17b2450d493","impliedFormat":1},{"version":"41ca214cf922678daa4dbfbe0f72cc9ac9c9858baced90041a64d4b29430fb25","impliedFormat":1},{"version":"f1541e57cf058caf3c95fab65b55c7dc2de1c960d866123d43c1deb5531dd25e","impliedFormat":1},{"version":"793b9f1b275af203f9751081adfe2dc11d17690fd5863d97bd90b539fa38c948","impliedFormat":1},{"version":"015b9253293cee33a84af9a93ac69e0df829fa7f4fa7e73e13bb247e68875d90","impliedFormat":1},{"version":"e017ece383491a42beefcf762344e98c7203c03993168b5b3ebb183a2b2f8602","impliedFormat":99},{"version":"b3105fad266021c1e297b5799931d87bb398dc277c65f8351d703c20fae0a5ad","impliedFormat":99},{"version":"49def90724c7b946566b2fa044703a269482befb3f86c5301423ccd87b2577fa","impliedFormat":99},{"version":"6777c666af08ea025f5906ffeacf0985f54b8f51b1bb47fff9cf7327d63e3ee8","impliedFormat":99},{"version":"153e0f456246ddbfcdf96b396196223f61e822f322181aa7f9743f335b345c2e","impliedFormat":99},{"version":"641ad1cf893d65bdc0c824dd3df204de60f714c80371986d83002e2045dfdb0e","impliedFormat":99},{"version":"bda1b258b774dbb246ec54308fdce2c89ffd6e9738d9d3fd37dceecbc86dce74","impliedFormat":99},{"version":"01feaae3ce24ca01593f6f8ebd6ee56772d084454a7ca64c45c4fa0e0cb47cb7","impliedFormat":99},{"version":"d2d264f396b4f688df90eed2c6ca34a0184f441d19a95db71f0f3663eff880cf","impliedFormat":99},{"version":"741180bb4da5b643527c1ad33fa5a7258dc95bcd3fa0101eafdc8c22c5671986","impliedFormat":99},{"version":"bd52e1f4cda69c2627f8bba50d26cdc61baaba5161fe7f9c6f80da13ca0d8be6","impliedFormat":99},{"version":"5d932f5561a979964fce8f93e5eae98884d4bc8b819497dfceb8a9d4d5f46d0a","impliedFormat":99},{"version":"5e379df3d61561c2ed7789b5995b9ba2143bbba21a905e2381e16efe7d1fa424","impliedFormat":1},{"version":"0bdb6455151d1d89a6a9337cb12f34bec8bfc1bab9767d5a7aa45b8703642ef0","impliedFormat":1}],"root":[61,[75,102],[151,178],181,182,[193,208],[301,314],316,317,[325,328],[436,439],[465,467],[469,481],[654,665]],"options":{"alwaysStrict":true,"composite":true,"downlevelIteration":true,"emitDecoratorMetadata":false,"esModuleInterop":true,"experimentalDecorators":false,"isolatedDeclarations":false,"jsx":2,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":false,"noUnusedParameters":false,"removeComments":false,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":9,"verbatimModuleSyntax":false},"fileIdsList":[[185,186,187],[183,184,185,186,187,188,189,190],[184,185],[150],[184],[185,186],[150,183],[109],[112],[117,119],[105,109,121,122],[132,135,141,143],[104,109],[103],[104],[111],[114],[104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,149],[120],[116],[117],[108,109,115],[116,117],[123],[144],[108],[109,126,129],[125],[126],[124,126],[109,129,131,132,133],[132,133,135],[109,124,127,130,137],[124,125],[106,107,124,126,127,128],[126,129],[107,124,127,130],[109,129,131],[132,133],[150,509],[509],[506,507,508,509,510,511,512,513,514,515,516,520,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543],[514],[525],[516],[517,518,519,521,522,523,524],[390,417],[520],[417],[640],[639],[638],[559,628,637],[644],[643],[642],[592,628,637],[210],[209,210,211,217,218,219,220],[150,191,209],[209],[216],[214,215],[209,212,213],[389],[150,191],[560,561,635,636],[544,560],[632,633],[560,561,628],[560],[631,634],[562,629,630],[382,384,417,560,561,562,628],[382,384,417,560],[382,384,417,560,562,629,631],[150,563],[563,564,565,566,567,568,593,623,624,625,626,627],[559,566,567,568,592,622,625],[191,559,563,568],[563,565],[563,566,622],[563],[563,567,592],[484],[482,483],[482,483,484],[497,498,499,500,501],[496],[482,484,485],[489,490,491,492,493,494,495],[482,483,484,485,488,502,503],[487],[486],[483,484],[150,482,483],[505,547,548,551],[544,545,551],[544,545],[150,545,548],[150,191,504,544],[547,548,551],[505,545,547,548,549,550,551,552,553,554,558],[191,504,505,548],[191,505,548],[150,191,504,544,545,546],[150,547],[557],[505,555],[556],[504],[150,598,599,600,612],[150,598,599,600,603,604,612],[600,601,602,605,606,607],[150,598,599,612],[598,609,611],[544,598,611,612,613,614],[544,598,611,612,614],[150,504,544,598,600,611],[544,598,609,611,612],[612],[598,609,611,612,613,615,616],[614,615,617],[598,599,600,609,610,611,612,613,614,615,617,618,619,620,621],[150,610],[150,504,610,616,617],[150,544],[599,600,608,611],[595,611],[595],[594,596,597,609,611],[150,504,571,574,592],[150,571,573,574,576,577],[544,573,574],[150,573,576,577],[150,504,544,572],[150,573,574,576,577],[544,573],[569,570,571,572,573,574,575,576,577,578,583,584,585,586,587,588,589,590,591],[582],[571,579],[580,581],[569],[570],[150,570],[150,504,544,572,573,578],[150,573,576],[150,504,544,571,575,577],[150,504,569,570],[592],[592,646,647],[592,646],[650,652],[651],[649],[382,417],[330],[366],[367,372,401],[368,373,379,380,387,398,409],[368,369,379,387],[370,410],[371,372,380,388],[372,398,406],[373,375,379,387],[366,374],[375,376],[379],[377,379],[366,379],[379,380,381,398,409],[379,380,381,394,398,401],[364,367,414],[375,379,382,387,398,409],[379,380,382,383,387,398,406,409],[382,384,398,406,409],[330,331,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416],[379,385],[386,409,414],[375,379,387,398],[388],[366,390],[387,388,391,408,414],[392],[393],[379,394,395],[394,396,410,412],[367,379,398,399,400,401],[367,398,400],[398,399],[401],[402],[398],[379,404,405],[404,405],[372,387,398,406],[407],[387,408],[367,382,393,409],[372,410],[398,411],[386,412],[413],[367,372,379,381,390,398,409,412,414],[398,415],[398,417,666],[422,423,427,428,429,430],[329,421,422],[329,421,423],[424,425,426],[422],[421,422],[443],[401,417,443,444,445],[418],[417,418,419,420],[442,446,447,451,452,453],[379,382,398,417,440,441],[379,382,417,446,447],[379,382,417,446],[448,449,450],[382,417,447],[447],[442],[367,368,398],[458],[379,417],[458,459],[432,433,434],[329,431,432,433],[329,432,434],[329],[456,460,462],[382,417,454,455,456,462,464],[382,383,384,417,454,455,456,460,461,462,463],[456,457,460,461,462,464],[382,393,417,454,455,456,457,460,461,463],[320,321],[320],[320,321,322,323],[318,324],[324],[318,319],[226],[233],[264,265],[224],[290],[230,269],[225],[225,263],[225,230],[225,253,263],[225,229,253,263],[225,253],[230,244],[281],[229],[224,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,258,259,260,261,262,263,264,265,266,267,268,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299],[232,256],[252],[232,258],[232,261],[237],[230],[225,229,244],[246],[292],[257],[278],[270,271],[270,273],[229,230],[224,229,250],[247,253],[341,345,409],[341,398,409],[336],[338,341,406,409],[387,406],[336,417],[338,341,387,409],[333,334,337,340,367,379,398,409],[333,339],[337,341,367,401,409,417],[367,417],[357,367,417],[335,336,417],[341],[335,336,337,338,339,340,341,342,343,345,346,347,348,349,350,351,352,353,354,355,356,358,359,360,361,362,363],[341,348,349],[339,341,349,350],[340],[333,336,341],[341,345,349,350],[345],[339,341,344,409],[333,338,339,341,345,348],[367,398],[336,341,357,367,414,417],[179],[74],[73],[64,65],[62,63,64,66,67,71],[63,64],[72],[64],[62,63,64,67,68,69,70],[62,63,73],[367],[75],[76,77,95,96,97,98,99,100,101],[150,367,391],[95],[76,88],[74,75,77,78,79,80,81,82,83,84,85,86,87,88],[74,87],[74,75,77,88,89],[75,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94],[74,75,77],[74,77,79,84,86,89],[74,81,87],[74,81,82],[74,75,82,83],[74,150,167,176,180,181,182,199,201,202],[74,150,152,167,178,182,203,204],[167,202],[168,207],[168,175,205,206],[205],[405],[372,468,469],[382],[467,469,470,471,472,473,474],[468],[156,157,162,382,405,437,438,469,471,472,473],[161,222,301],[301,302,476],[155,161,223,300,327],[161,389,409],[194],[169,175,193],[169,192],[155,156,221,302,304,326],[169,176,191,195,200,303,410],[480],[74,156,159,161,162],[191],[76,152,155,167,176,178,181,182,195,198,199,200,201,202,203,204,205,208,304,305,306,308,311,314,316,317,325,327],[307],[150,175,304],[150,169,176,191,195,199,200,303],[150,655],[150,152,176,191,206,221,306,504,559,641,645,648,653,654],[657],[310],[167,170,479],[167,170,175,198,309],[167],[167,170],[167,170,195,439],[74,156,157,158],[74,157,160],[74,155,157,164],[153,156,157,158,159,160,161,162,163,164,165,166],[74,156,157,158,161],[74,156,157],[74,155,156],[313],[155,167],[155,167,171,175,312],[155,167,171],[177],[150,167,172,175,176],[150,176,178,200,559,592],[150,176,178,191,195,198],[154,167],[197],[173,175,196],[169,173,195],[173],[173,405,661],[208],[315],[168,169,170,171,172,173,174],[150,176,199,200,208,306,324],[97,167],[150,167,176,200],[170,198,206,304,328,478,654,656,659,660,662,664],[150,152,155,167,173,176,178,181,182,199,201,305,325,326,328,656],[182,202,203],[74,162,372,410,437,438],[74,436],[74,436,437,438,464],[74,180,435,436,437]],"referencedMap":[[190,1],[191,2],[188,3],[189,1],[183,4],[185,5],[186,4],[187,6],[184,7],[111,8],[114,9],[120,10],[123,11],[144,12],[122,13],[104,14],[105,15],[145,16],[110,8],[146,17],[113,9],[150,18],[147,19],[117,20],[119,21],[116,22],[118,23],[115,20],[148,24],[121,8],[149,25],[124,26],[143,27],[140,28],[142,29],[127,30],[134,31],[136,32],[138,33],[137,34],[129,35],[126,28],[141,36],[131,37],[132,38],[135,39],[506,4],[515,4],[508,4],[510,40],[511,41],[512,4],[509,4],[544,42],[543,43],[526,44],[517,45],[525,46],[522,47],[521,48],[524,49],[527,4],[529,4],[530,4],[531,4],[532,4],[533,4],[534,4],[535,4],[528,4],[516,4],[540,41],[641,50],[640,51],[639,52],[638,53],[645,54],[644,55],[643,56],[642,57],[211,58],[221,59],[213,60],[218,61],[219,61],[217,62],[216,63],[214,64],[215,65],[209,66],[210,60],[220,61],[637,67],[561,68],[634,69],[632,70],[633,71],[635,72],[631,73],[629,74],[562,75],[630,76],[564,77],[628,78],[627,79],[624,80],[568,81],[623,82],[566,81],[626,79],[565,83],[593,84],[567,81],[482,85],[503,86],[498,87],[500,87],[499,87],[501,87],[502,88],[497,89],[489,87],[490,90],[496,91],[491,87],[492,90],[493,87],[494,87],[495,90],[504,92],[483,85],[488,93],[487,94],[485,95],[484,96],[555,97],[552,98],[554,98],[551,99],[550,100],[545,101],[553,102],[559,103],[546,104],[549,105],[547,106],[548,107],[558,108],[556,109],[557,110],[505,111],[601,112],[605,113],[602,112],[608,114],[606,112],[607,112],[600,115],[613,116],[620,117],[619,118],[612,119],[614,120],[615,121],[617,122],[618,123],[622,124],[611,125],[621,126],[616,4],[599,127],[609,128],[594,4],[596,129],[597,130],[610,131],[575,132],[579,133],[584,134],[585,134],[587,135],[573,136],[586,137],[574,138],[592,139],[583,140],[580,141],[582,142],[581,143],[570,4],[588,144],[589,144],[590,145],[591,144],[576,146],[577,147],[572,4],[578,148],[571,149],[646,150],[648,151],[647,152],[653,153],[652,154],[650,155],[441,156],[330,157],[331,157],[366,158],[367,159],[368,160],[369,161],[370,162],[371,163],[372,164],[373,165],[374,166],[375,167],[376,167],[378,168],[377,169],[379,170],[380,171],[381,172],[365,173],[382,174],[383,175],[384,176],[417,177],[385,178],[386,179],[387,180],[388,181],[389,65],[390,182],[391,183],[392,184],[393,185],[394,186],[395,186],[396,187],[398,188],[400,189],[399,190],[401,191],[402,192],[403,193],[404,194],[405,195],[406,196],[407,197],[408,198],[409,199],[410,200],[411,201],[412,202],[413,203],[414,204],[415,205],[667,206],[431,207],[423,208],[422,209],[427,210],[424,208],[425,211],[426,212],[445,213],[444,213],[446,214],[420,215],[419,215],[421,216],[454,217],[442,218],[453,219],[447,220],[451,221],[448,222],[449,223],[450,223],[452,224],[468,225],[459,226],[458,227],[460,228],[435,229],[434,230],[433,231],[455,232],[432,232],[461,233],[457,234],[464,235],[463,236],[462,237],[456,227],[322,238],[323,239],[324,240],[319,241],[318,242],[320,243],[230,244],[234,245],[266,246],[225,247],[291,248],[270,249],[267,250],[268,251],[271,252],[264,253],[273,252],[275,254],[276,251],[277,251],[265,255],[235,244],[281,256],[297,257],[285,258],[300,259],[257,260],[253,261],[259,262],[262,263],[238,264],[282,265],[245,266],[279,267],[293,268],[258,269],[280,270],[248,244],[272,271],[274,272],[231,273],[288,258],[251,274],[261,269],[254,275],[348,276],[355,277],[347,276],[362,278],[339,279],[338,280],[361,49],[356,281],[359,282],[341,283],[340,284],[336,285],[335,286],[358,287],[337,288],[342,289],[346,289],[364,290],[363,289],[350,291],[351,292],[353,293],[349,294],[352,295],[357,49],[344,296],[345,297],[354,298],[334,299],[360,300],[180,301],[179,302],[74,303],[66,304],[72,305],[67,306],[70,303],[73,307],[65,308],[71,309],[64,310],[61,311],[76,312],[102,313],[151,314],[98,315],[100,316],[97,315],[89,317],[79,302],[75,302],[92,318],[91,319],[95,320],[80,302],[94,302],[81,302],[90,302],[82,302],[93,302],[88,321],[87,322],[83,302],[86,323],[84,324],[85,325],[96,315],[203,326],[205,327],[204,328],[208,329],[207,330],[168,331],[467,332],[470,333],[471,334],[475,335],[469,336],[474,337],[302,338],[477,339],[301,340],[476,341],[195,342],[194,343],[478,344],[193,344],[327,345],[328,346],[481,347],[305,348],[303,349],[326,350],[306,4],[308,351],[307,352],[304,353],[656,354],[655,355],[658,356],[311,357],[480,358],[310,359],[170,360],[309,361],[657,362],[159,363],[161,364],[156,302],[160,302],[164,302],[165,365],[167,366],[162,367],[166,302],[158,368],[157,369],[163,302],[153,302],[314,370],[171,371],[313,372],[312,373],[659,373],[178,374],[177,375],[654,376],[172,360],[199,377],[155,378],[198,379],[197,380],[660,381],[196,382],[662,383],[661,384],[316,385],[200,4],[175,386],[325,387],[181,388],[663,158],[201,389],[479,332],[665,390],[664,391],[466,392],[439,393],[437,394],[465,395],[438,396]],"affectedFilesPendingEmit":[61,76,102,151,98,100,97,78,89,79,75,92,91,95,80,94,81,90,82,93,88,87,83,86,84,85,99,77,96,203,182,205,202,204,208,207,168,467,470,471,475,469,472,473,474,302,477,301,476,195,169,194,478,193,327,328,481,305,303,326,306,308,307,304,656,655,658,311,480,310,170,309,657,159,161,156,160,164,165,167,162,166,158,157,163,153,176,314,171,313,312,659,178,177,654,172,199,155,154,198,197,660,196,662,173,661,316,200,206,175,325,317,174,181,663,436,201,479,665,664,466,439,437,465,438,152,101],"emitSignatures":[61,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,181,182,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,301,302,303,304,305,306,307,308,309,310,311,312,313,314,316,317,325,326,327,328,436,437,438,439,465,466,467,469,470,471,472,473,474,475,476,477,478,479,480,481,654,655,656,657,658,659,660,661,662,663,664,665]},"version":"5.5.4"} \ No newline at end of file diff --git a/packages/database/prisma/migrations/20240920085046_add_task_hierarchy_columns_without_parent_task_run_id_index/migration.sql b/packages/database/prisma/migrations/20240920085046_add_task_hierarchy_columns_without_parent_task_run_id_index/migration.sql new file mode 100644 index 000000000..337d139a7 --- /dev/null +++ b/packages/database/prisma/migrations/20240920085046_add_task_hierarchy_columns_without_parent_task_run_id_index/migration.sql @@ -0,0 +1,19 @@ +-- AlterTable +ALTER TABLE "TaskRun" ADD COLUMN "batchId" TEXT, +ADD COLUMN "depth" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "parentTaskRunAttemptId" TEXT, +ADD COLUMN "parentTaskRunId" TEXT, +ADD COLUMN "resumeParentOnCompletion" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "rootTaskRunId" TEXT; + +-- AddForeignKey +ALTER TABLE "TaskRun" ADD CONSTRAINT "TaskRun_rootTaskRunId_fkey" FOREIGN KEY ("rootTaskRunId") REFERENCES "TaskRun"("id") ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE "TaskRun" ADD CONSTRAINT "TaskRun_parentTaskRunId_fkey" FOREIGN KEY ("parentTaskRunId") REFERENCES "TaskRun"("id") ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE "TaskRun" ADD CONSTRAINT "TaskRun_parentTaskRunAttemptId_fkey" FOREIGN KEY ("parentTaskRunAttemptId") REFERENCES "TaskRunAttempt"("id") ON DELETE SET NULL ON UPDATE NO ACTION; + +-- AddForeignKey +ALTER TABLE "TaskRun" ADD CONSTRAINT "TaskRun_batchId_fkey" FOREIGN KEY ("batchId") REFERENCES "BatchTaskRun"("id") ON DELETE SET NULL ON UPDATE NO ACTION; diff --git a/packages/database/prisma/migrations/20240920085226_add_parent_task_run_id_index_concurrently/migration.sql b/packages/database/prisma/migrations/20240920085226_add_parent_task_run_id_index_concurrently/migration.sql new file mode 100644 index 000000000..951e2a3c8 --- /dev/null +++ b/packages/database/prisma/migrations/20240920085226_add_parent_task_run_id_index_concurrently/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE INDEX CONCURRENTLY IF NOT EXISTS "TaskRun_parentTaskRunId_idx" ON "TaskRun"("parentTaskRunId"); \ No newline at end of file diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma index 92c370fef..1a3db9e45 100644 --- a/packages/database/prisma/schema.prisma +++ b/packages/database/prisma/schema.prisma @@ -1720,7 +1720,37 @@ model TaskRun { logsDeletedAt DateTime? + /// This represents the original task that that was triggered outside of a Trigger.dev task + rootTaskRun TaskRun? @relation("TaskRootRun", fields: [rootTaskRunId], references: [id], onDelete: SetNull, onUpdate: NoAction) + rootTaskRunId String? + + /// The root run will have a list of all the descendant runs, children, grand children, etc. + descendantRuns TaskRun[] @relation("TaskRootRun") + + /// The immediate parent run of this task run + parentTaskRun TaskRun? @relation("TaskParentRun", fields: [parentTaskRunId], references: [id], onDelete: SetNull, onUpdate: NoAction) + parentTaskRunId String? + + /// The immediate child runs of this task run + childRuns TaskRun[] @relation("TaskParentRun") + + /// The immediate parent attempt of this task run + parentTaskRunAttempt TaskRunAttempt? @relation("TaskParentRunAttempt", fields: [parentTaskRunAttemptId], references: [id], onDelete: SetNull, onUpdate: NoAction) + parentTaskRunAttemptId String? + + /// The batch run that this task run is a part of + batch BatchTaskRun? @relation(fields: [batchId], references: [id], onDelete: SetNull, onUpdate: NoAction) + batchId String? + + /// whether or not the task run was created because of a triggerAndWait for batchTriggerAndWait + resumeParentOnCompletion Boolean @default(false) + + /// The depth of this task run in the task run hierarchy + depth Int @default(0) + @@unique([runtimeEnvironmentId, taskIdentifier, idempotencyKey]) + // Finding child runs + @@index([parentTaskRunId]) // Task activity graph @@index([projectId, createdAt, taskIdentifier]) //Runs list @@ -1881,6 +1911,7 @@ model TaskRunAttempt { batchTaskRunItems BatchTaskRunItem[] CheckpointRestoreEvent CheckpointRestoreEvent[] alerts ProjectAlert[] + childRuns TaskRun[] @relation("TaskParentRunAttempt") @@unique([taskRunId, number]) @@index([taskRunId]) @@ -2071,8 +2102,9 @@ model BatchTaskRun { items BatchTaskRunItem[] runDependencies TaskRunDependency[] @relation("dependentBatchRun") - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + TaskRun TaskRun[] @@unique([runtimeEnvironmentId, taskIdentifier, idempotencyKey]) } diff --git a/packages/trigger-sdk/src/v3/shared.ts b/packages/trigger-sdk/src/v3/shared.ts index 029436648..d97cd7a1b 100644 --- a/packages/trigger-sdk/src/v3/shared.ts +++ b/packages/trigger-sdk/src/v3/shared.ts @@ -791,6 +791,7 @@ async function trigger_internal( ttl: options?.ttl, tags: options?.tags, maxAttempts: options?.maxAttempts, + parentAttempt: taskContext.ctx?.attempt.id, }, }, { @@ -861,6 +862,7 @@ async function batchTrigger_internal( ttl: item.options?.ttl, tags: item.options?.tags, maxAttempts: item.options?.maxAttempts, + parentAttempt: taskContext.ctx?.attempt.id, }, }; }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca0e051fa..5a763fc89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5999,7 +5999,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.6 + debug: 4.3.7 espree: 9.6.0 globals: 13.19.0 ignore: 5.2.4 @@ -6230,7 +6230,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.6 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -17679,7 +17679,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: false /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -19209,7 +19208,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.0 diff --git a/references/v3-catalog/src/trigger/taskHierarchy.ts b/references/v3-catalog/src/trigger/taskHierarchy.ts new file mode 100644 index 000000000..9cda1c923 --- /dev/null +++ b/references/v3-catalog/src/trigger/taskHierarchy.ts @@ -0,0 +1,101 @@ +import { runs, task } from "@trigger.dev/sdk/v3"; +import { setTimeout } from "node:timers/promises"; + +export const rootTask = task({ + id: "task-hierarchy/root-task", + run: async ( + { useWaits = true, useBatch = false }: { useWaits: boolean; useBatch: boolean }, + { ctx } + ) => { + console.log("root-task"); + + if (useWaits) { + if (useBatch) { + await childTask.batchTriggerAndWait([{ payload: { useWaits, useBatch } }]); + } else { + await childTask.triggerAndWait({ useWaits, useBatch }); + } + } else { + if (useBatch) { + await childTask.batchTrigger([{ payload: { useWaits, useBatch } }]); + } else { + await childTask.trigger({ useWaits, useBatch }); + } + } + + if (!useWaits) { + await setTimeout(10_000); // Wait for 10 seconds, all the runs will be finished by then + } + + await logRunHierarchy(ctx.run.id); + }, +}); + +export const childTask = task({ + id: "task-hierarchy/child-task", + run: async ({ useWaits = true, useBatch = false }: { useWaits: boolean; useBatch: boolean }) => { + console.log("child-task"); + + if (useWaits) { + if (useBatch) { + await grandChildTask.batchTriggerAndWait([{ payload: { useWaits, useBatch } }]); + } else { + await grandChildTask.triggerAndWait({ useWaits, useBatch }); + } + } else { + if (useBatch) { + await grandChildTask.batchTrigger([{ payload: { useWaits, useBatch } }]); + } else { + await grandChildTask.trigger({ useWaits, useBatch }); + } + } + }, +}); + +export const grandChildTask = task({ + id: "task-hierarchy/grand-child-task", + run: async ({ useWaits = true, useBatch = false }: { useWaits: boolean; useBatch: boolean }) => { + console.log("grand-child-task"); + + if (useWaits) { + if (useBatch) { + await greatGrandChildTask.batchTriggerAndWait([{ payload: { useWaits, useBatch } }]); + } else { + await greatGrandChildTask.triggerAndWait({ useWaits, useBatch }); + } + } else { + if (useBatch) { + await greatGrandChildTask.batchTrigger([{ payload: { useWaits, useBatch } }]); + } else { + await greatGrandChildTask.trigger({ useWaits, useBatch }); + } + } + }, +}); + +export const greatGrandChildTask = task({ + id: "task-hierarchy/great-grand-child-task", + run: async ({ useWaits = true, useBatch = false }: { useWaits: boolean; useBatch: boolean }) => { + console.log("great-grand-child-task"); + }, +}); + +async function logRunHierarchy( + runId: string, + parentTaskIdentifier?: string, + triggerFunction?: string +) { + const runData = await runs.retrieve(runId); + + const indent = " ".repeat(runData.depth * 2); + const triggerInfo = triggerFunction ? ` (triggered by ${triggerFunction})` : ""; + const parentInfo = parentTaskIdentifier ? ` (parent task: ${parentTaskIdentifier})` : ""; + + console.log( + `${indent}Level ${runData.depth}: [${runData.taskIdentifier}] run ${runData.id}${triggerInfo}${parentInfo}` + ); + + for (const childRun of runData.relatedRuns.children ?? []) { + await logRunHierarchy(childRun.id, runData.taskIdentifier, childRun.triggerFunction); + } +} From e79f0cc84793fc5f2e5e361c4147048c0951c259 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 20 Sep 2024 11:13:20 +0100 Subject: [PATCH 45/55] Add forgotten changeset for task hierarchy PR --- .changeset/orange-plums-deliver.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/orange-plums-deliver.md diff --git a/.changeset/orange-plums-deliver.md b/.changeset/orange-plums-deliver.md new file mode 100644 index 000000000..2a7ac73ed --- /dev/null +++ b/.changeset/orange-plums-deliver.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +runs.retrieve() now includes details about related runs (root, parent, and children) as well how how the runs were triggered and if they are in a batch From b999c86e2330cc106928c12c5cb4c95406cdbe10 Mon Sep 17 00:00:00 2001 From: Matt Aitken Date: Fri, 20 Sep 2024 11:14:04 +0100 Subject: [PATCH 46/55] Fix for missing logs when triggering without a `trigger-version` (#1331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * No longer require “trigger-version” to be passed for the traceContext to be populated * Remove empty string --- .../route.tsx | 1 - apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts | 8 +++++++- apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts | 9 +++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx index 349bad884..94bbe3cd8 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.v3.$projectParam.runs.$runParam/route.tsx @@ -420,7 +420,6 @@ function NoLogsView({ run, resizable }: LoaderData) { min={resizableSettings.parent.inspector.min} isStaticAtRest > - {" "} diff --git a/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts b/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts index 34e84d707..088b3227a 100644 --- a/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts +++ b/apps/webapp/app/routes/api.v1.tasks.$taskId.batch.ts @@ -39,6 +39,7 @@ export async function action({ request, params }: ActionFunctionArgs) { "idempotency-key": idempotencyKey, "trigger-version": triggerVersion, "x-trigger-span-parent-as-link": spanParentAsLink, + "x-trigger-worker": isFromWorker, traceparent, tracestate, } = headers.data; @@ -86,11 +87,16 @@ export async function action({ request, params }: ActionFunctionArgs) { const service = new BatchTriggerTaskService(); + const traceContext = + traceparent ?? isFromWorker // If the request is from a worker, we should pass the trace context + ? { traceparent, tracestate } + : undefined; + try { const result = await service.call(taskId, authenticationResult.environment, body.data, { idempotencyKey: idempotencyKey ?? undefined, triggerVersion: triggerVersion ?? undefined, - traceContext: traceparent ? { traceparent, tracestate } : undefined, + traceContext, spanParentAsLink: spanParentAsLink === 1, }); diff --git a/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts b/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts index 08b9d1756..7a1a590bc 100644 --- a/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts +++ b/apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts @@ -79,13 +79,10 @@ export async function action({ request, params }: ActionFunctionArgs) { const service = new TriggerTaskService(); try { - const traceContext = traceparent - ? !triggerVersion // If the trigger version is NOT set, we are in an older version of the SDK + const traceContext = + traceparent ?? isFromWorker /// If the request is from a worker, we should pass the trace context ? { traceparent, tracestate } - : isFromWorker // If the trigger version is set, and the request is from a worker, we should pass the trace context - ? { traceparent, tracestate } - : undefined - : undefined; + : undefined; logger.debug("Triggering task", { taskId, From 764f03a3c50b1d0bb21a02e32a72a51823b62fba Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 20 Sep 2024 13:23:43 +0100 Subject: [PATCH 47/55] Fixed schema types for the runs.retrieve() SDK function --- packages/core/src/v3/schemas/api.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/src/v3/schemas/api.ts b/packages/core/src/v3/schemas/api.ts index b81fbe862..d29aa1396 100644 --- a/packages/core/src/v3/schemas/api.ts +++ b/packages/core/src/v3/schemas/api.ts @@ -507,15 +507,17 @@ const CommonRunFields = { durationMs: z.number(), }; -export const RelatedRunDetails = z.object({ +const RetrieveRunCommandFields = { ...CommonRunFields, depth: z.number(), triggerFunction: z.enum(["triggerAndWait", "trigger", "batchTriggerAndWait", "batchTrigger"]), batchId: z.string().optional(), -}); +}; + +export const RelatedRunDetails = z.object(RetrieveRunCommandFields); export const RetrieveRunResponse = z.object({ - ...CommonRunFields, + ...RetrieveRunCommandFields, payload: z.any().optional(), payloadPresignedUrl: z.string().optional(), output: z.any().optional(), From 9d1398f2d98ed88a6a79d5f9c7f6df047ed86da0 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Fri, 20 Sep 2024 15:08:21 +0100 Subject: [PATCH 48/55] Much better Remix guide, including Edge functions --- docs/guides/frameworks/remix.mdx | 138 ++++++++++++++++++++ docs/snippets/add-environment-variables.mdx | 11 ++ docs/snippets/deplopying-your-task.mdx | 37 ++++++ docs/snippets/trigger-tasks-remix.mdx | 47 +++++++ 4 files changed, 233 insertions(+) create mode 100644 docs/snippets/add-environment-variables.mdx create mode 100644 docs/snippets/deplopying-your-task.mdx create mode 100644 docs/snippets/trigger-tasks-remix.mdx diff --git a/docs/guides/frameworks/remix.mdx b/docs/guides/frameworks/remix.mdx index 1876520e9..bc3571c90 100644 --- a/docs/guides/frameworks/remix.mdx +++ b/docs/guides/frameworks/remix.mdx @@ -11,6 +11,9 @@ import CliDevStep from '/snippets/step-cli-dev.mdx'; import CliRunTestStep from '/snippets/step-run-test.mdx'; import CliViewRunStep from '/snippets/step-view-run.mdx'; import UsefulNextSteps from '/snippets/useful-next-steps.mdx'; +import TriggerTaskRemix from "/snippets/trigger-tasks-remix.mdx"; +import AddEnvironmentVariables from "/snippets/add-environment-variables.mdx"; +import DeployingYourTask from "/snippets/deplopying-your-task.mdx"; @@ -23,4 +26,139 @@ import UsefulNextSteps from '/snippets/useful-next-steps.mdx'; +## Set your secret key locally + +Set your `TRIGGER_SECRET_KEY` environment variable in your `.env` file. This key is used to authenticate with Trigger.dev, so you can trigger runs from your Remix app. Visit the API Keys page in the dashboard and select the DEV secret key. + +![How to find your secret key](/images/api-keys.png) + +For more information on authenticating with Trigger.dev, see the [API keys page](/apikeys). + +## Triggering your task in Remix + + + + + + Create a new file called `api.trigger.ts` (or `api.trigger.js`) in the `app/routes` directory like this: `app/routes/api.trigger.ts`. + + + + + + Add this code to your `api.trigger.ts` file which imports your task: + + ```ts + import type { helloWorldTask } from "../../src/trigger/example"; + import { tasks } from "@trigger.dev/sdk/v3"; + + export async function loader() { + const handle = await tasks.trigger( + "hello-world", + "James" + ); + + return new Response(JSON.stringify(handle), { + headers: { "Content-Type": "application/json" }, + }); +} +``` + + + + + + + + + + + + + + + +## Deploying Remix to Vercel Edge Functions + +There are a few extra steps to follow to deploy your Remix app to Vercel Edge Functions. + + + + + +Create or update the `vercel.json` file with the following: + +```json vercel.json +{ + "buildCommand": "npm run vercel-build", + "devCommand": "npm run dev", + "framework": "remix", + "installCommand": "npm install", + "outputDirectory": "build/client" +} +``` + + + + + +Update your `package.json` to include the following scripts: + +```json package.json +"scripts": { + "build": "remix vite:build", + "dev": "remix vite:dev", + "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .", + "start": "remix-serve ./build/server/index.js", + "typecheck": "tsc", + "vercel-build": "remix vite:build && cp -r ./public ./build/client" +}, +``` + + + + + +Push your code to a Git repository and create a new project in the Vercel dashboard. Select your repository and follow the prompts to complete the deployment. + + + + + + +In the Vercel project settings, add your Trigger.dev secret key: + +```bash +TRIGGER_SECRET_KEY=your-secret-key +``` + +You can find this key in the Trigger.dev dashboard under API Keys and select the environment key you want to use. + +![How to find your secret key](/images/api-keys.png) + + + + + +Once you've added the environment variable, deploy your project to Vercel. + +Ensure you have also deployed your Trigger.dev task. See [deploy your task step](/guides/frameworks/remix#deploying-your-task-to-trigger-dev). + + + + + +After deployment, visit your Vercel deployment URL followed by `/api/trigger` (e.g., `https://your-app.vercel.app/api/trigger`) to test the Trigger.dev task in production. + + + + + +### Additional notes + +The `vercel-build` script in `package.json` is specific to Remix projects on Vercel, ensuring that static assets are correctly copied to the build output. + +The `runtime: "edge"` configuration in the API route allows for better performance on Vercel's Edge Network. + + diff --git a/docs/snippets/add-environment-variables.mdx b/docs/snippets/add-environment-variables.mdx new file mode 100644 index 000000000..b82a6c56f --- /dev/null +++ b/docs/snippets/add-environment-variables.mdx @@ -0,0 +1,11 @@ +## Add your environment variables (optional) + +If you have any environment variables in your tasks, be sure to add them in the dashboard so deployed code runs successfully. In Node.js, these environment variables are accessed in your code using `process.env.MY_ENV_VAR`. + +In the sidebar select the "Environment Variables" page, then press the "New environment variable" +button. ![Environment variables page](/images/environment-variables-page.jpg) + +You can add values for your local dev environment, staging and prod. ![Environment variables +page](/images/environment-variables-panel.jpg) + +You can also add environment variables in code by following the steps on the [Environment Variables page](/deploy-environment-variables#in-your-code). \ No newline at end of file diff --git a/docs/snippets/deplopying-your-task.mdx b/docs/snippets/deplopying-your-task.mdx new file mode 100644 index 000000000..5414fc576 --- /dev/null +++ b/docs/snippets/deplopying-your-task.mdx @@ -0,0 +1,37 @@ +## Deploying your task to Trigger.dev + +For this guide, we'll manually deploy your task by running the [CLI deploy command](/cli-deploy) below. Other ways to deploy are listed in the next section. + + + +```bash npm +npx trigger.dev@latest deploy +``` + +```bash pnpm +pnpm dlx trigger.dev@latest deploy +``` + +```bash yarn +yarn dlx trigger.dev@latest deploy +``` + + + +### Other ways to deploy + + + + + +Use GitHub Actions to automatically deploy your tasks whenever new code is pushed and when the `trigger` directory has changes in it. Follow [this guide](/github-actions) to set up GitHub Actions. + + + + + +We're working on adding an official [Vercel integration](/vercel-integration) which you can follow the progress of [here](https://feedback.trigger.dev/p/vercel-integration-3). + + + + \ No newline at end of file diff --git a/docs/snippets/trigger-tasks-remix.mdx b/docs/snippets/trigger-tasks-remix.mdx new file mode 100644 index 000000000..499a6ce6e --- /dev/null +++ b/docs/snippets/trigger-tasks-remix.mdx @@ -0,0 +1,47 @@ +Run your Remix app: + + + + ```bash npm + npm run dev + ``` + + ```bash pnpm + pnpm run dev + ``` + + ```bash yarn + yarn dev + ``` + + + + Run the dev server from Step 2. of the [Initial Setup](/guides/frameworks/remix#initial-setup) section above if it's not already running: + + + + ```bash npm + npx trigger.dev@latest dev + ``` + + ```bash pnpm + pnpm dlx trigger.dev@latest dev + ``` + + ```bash yarn + yarn dlx trigger.dev@latest dev + ``` + + + + Now visit the URL in your browser to trigger the task. Ensure the port number is the same as the one you're running your Remix app on. For example, if you're running your Remix app on port 3000, visit: + + ```bash + http://localhost:3000/api/trigger + ``` + + You should see the CLI log the task run with a link to view the logs in the dashboard. + + ![Trigger.dev CLI showing a successful run](/images/trigger-cli-run-success.png) + + Visit the [Trigger.dev dashboard](https://cloud.trigger.dev) to see your run. From 35c8e35674c9776381eedfe6d1e25c4edd8ca12b Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Fri, 20 Sep 2024 15:08:33 +0100 Subject: [PATCH 49/55] Added snippets to the nextjs guide --- docs/guides/frameworks/nextjs.mdx | 54 +++---------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/docs/guides/frameworks/nextjs.mdx b/docs/guides/frameworks/nextjs.mdx index 50c96fbce..36d8b1b50 100644 --- a/docs/guides/frameworks/nextjs.mdx +++ b/docs/guides/frameworks/nextjs.mdx @@ -15,6 +15,8 @@ import TriggerTaskNextjs from "/snippets/trigger-tasks-nextjs.mdx"; import NextjsTroubleshootingMissingApiKey from "/snippets/nextjs-missing-api-key.mdx"; import NextjsTroubleshootingButtonSyntax from "/snippets/nextjs-button-syntax.mdx"; import WorkerFailedToStartWhenRunningDevCommand from "/snippets/worker-failed-to-start.mdx"; +import AddEnvironmentVariables from "/snippets/add-environment-variables.mdx"; +import DeployingYourTask from "/snippets/deplopying-your-task.mdx"; This guide can be followed for both App and Pages router as well as Server Actions. @@ -66,7 +68,7 @@ Here are the steps to trigger your task in the Next.js App and Pages router and //tasks.trigger also works with the edge runtime //export const runtime = "edge"; - export async function GET(request: Request) { + export async function GET() { const handle = await tasks.trigger( "hello-world", "James" @@ -242,55 +244,9 @@ Here are the steps to trigger your task in the Next.js App and Pages router and -## Add your environment variables (optional) + -If you have any environment variables in your tasks, be sure to add them in the dashboard so deployed code runs successfully. In Node.js, these environment variables are accessed in your code using `process.env.MY_ENV_VAR`. - -In the sidebar select the "Environment Variables" page, then press the "New environment variable" -button. ![Environment variables page](/images/environment-variables-page.jpg) - -You can add values for your local dev environment, staging and prod. ![Environment variables -page](/images/environment-variables-panel.jpg) - -You can also add environment variables in code by following the steps on the [Environment Variables page](/deploy-environment-variables#in-your-code). - -## Deploying your task in Next.js - -For this guide, we'll manually deploy your task by running the [CLI deploy command](/cli-deploy) below. Other ways to deploy are listed in the next section. - - - -```bash npm -npx trigger.dev@latest deploy -``` - -```bash pnpm -pnpm dlx trigger.dev@latest deploy -``` - -```bash yarn -yarn dlx trigger.dev@latest deploy -``` - - - -### Other ways to deploy - - - - - -Use GitHub Actions to automatically deploy your tasks whenever new code is pushed and when the `trigger` directory has changes in it. Follow [this guide](/github-actions) to set up GitHub Actions. - - - - - -We're working on adding an official [Vercel integration](/vercel-integration) which you can follow the progress of [here](https://feedback.trigger.dev/p/vercel-integration-3). - - - - + ## Troubleshooting From 1f5bcc73b5014c41b9cccafb004d152e41ff4304 Mon Sep 17 00:00:00 2001 From: Thibaut Cuchet Date: Fri, 20 Sep 2024 17:09:47 +0200 Subject: [PATCH 50/55] fix: audiowaveform extension (#1335) * fix: audiowaveform extension * Create lovely-dolphins-chew.md --------- Co-authored-by: Eric Allam --- .changeset/lovely-dolphins-chew.md | 5 +++++ packages/build/src/extensions/audioWaveform.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/lovely-dolphins-chew.md diff --git a/.changeset/lovely-dolphins-chew.md b/.changeset/lovely-dolphins-chew.md new file mode 100644 index 000000000..fc45c4f7f --- /dev/null +++ b/.changeset/lovely-dolphins-chew.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +fix: audiowaveform extension diff --git a/packages/build/src/extensions/audioWaveform.ts b/packages/build/src/extensions/audioWaveform.ts index 22bd1661e..03d4f68e9 100644 --- a/packages/build/src/extensions/audioWaveform.ts +++ b/packages/build/src/extensions/audioWaveform.ts @@ -46,6 +46,7 @@ class AudioWaveformExtension implements BuildExtension { }-1-12_amd64.deb .`, `RUN dpkg -i audiowaveform_${opts.version}-1-12_amd64.deb || true`, `RUN rm audiowaveform*.deb`, + `RUN apt-get install -y --fix-broken`, ]; context.addLayer({ From fd9a748553c0561815bece6cd4daeaedd73e7379 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 20 Sep 2024 16:12:14 +0100 Subject: [PATCH 51/55] Fixes #1337 - update docs for triggerdev -> trigger bin name change --- .vscode/launch.json | 12 ++++++------ CONTRIBUTING.md | 12 ++++++------ docs/upgrading-packages.mdx | 4 ++-- references/bun-catalog/README.md | 6 +++--- references/bun-catalog/package.json | 4 ++-- references/v3-catalog/README.md | 6 +++--- references/v3-catalog/package.json | 4 ++-- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 8fd69a9b4..d70f6bdd9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -24,7 +24,7 @@ "type": "node-terminal", "request": "launch", "name": "Debug V3 init CLI", - "command": "pnpm exec triggerdev init", + "command": "pnpm exec trigger init", "cwd": "${workspaceFolder}/references/init-shell", "sourceMaps": true }, @@ -32,7 +32,7 @@ "type": "node-terminal", "request": "launch", "name": "Debug V3 Dev CLI", - "command": "pnpm exec triggerdev dev", + "command": "pnpm exec trigger dev", "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, @@ -48,7 +48,7 @@ "type": "node-terminal", "request": "launch", "name": "Debug V3 Deploy CLI", - "command": "pnpm exec triggerdev deploy --self-hosted --load-image", + "command": "pnpm exec trigger deploy --self-hosted --load-image", "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, @@ -56,7 +56,7 @@ "type": "node-terminal", "request": "launch", "name": "Debug V3 list-profiles CLI", - "command": "pnpm exec triggerdev list-profiles --log-level debug", + "command": "pnpm exec trigger list-profiles --log-level debug", "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, @@ -64,7 +64,7 @@ "type": "node-terminal", "request": "launch", "name": "Debug V3 update CLI", - "command": "pnpm exec triggerdev update", + "command": "pnpm exec trigger update", "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, @@ -96,7 +96,7 @@ "type": "node-terminal", "request": "launch", "name": "debug v3 hello-world dev", - "command": "pnpm exec triggerdev dev", + "command": "pnpm exec trigger dev", "cwd": "${workspaceFolder}/references/hello-world", "sourceMaps": true } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a5ca12fc1..c4fc0445e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,7 +114,7 @@ pnpm i ```sh cd references/v3-catalog cp .env.example .env -pnpm exec triggerdev login -a http://localhost:3030 +pnpm exec trigger login -a http://localhost:3030 ``` This will open a new browser window and authorize the CLI against your local user account. @@ -123,10 +123,10 @@ You can optionally pass a `--profile` flag to the `login` command, which will al ```sh cd references/v3-catalog -pnpm exec triggerdev login -a http://localhost:3030 --profile local +pnpm exec trigger login -a http://localhost:3030 --profile local # later when you run the dev or deploy command: -pnpm exec triggerdev dev --profile local -pnpm exec triggerdev deploy --profile local +pnpm exec trigger dev --profile local +pnpm exec trigger deploy --profile local ``` ### Running @@ -155,14 +155,14 @@ Note: You do not need to do the same for `@trigger.dev/sdk`, just core. ```sh # in /references/v3-catalog -pnpm exec triggerdev dev +pnpm exec trigger dev ``` If you want additional debug logging, you can use the `--log-level debug` flag: ```sh # in /references/v3-catalog -pnpm exec triggerdev dev --log-level debug +pnpm exec trigger dev --log-level debug ``` 5. If you make any changes in the CLI/Core/SDK, you'll need to `CTRL+C` to exit the `dev` command and restart it to pickup changes. Any changes to the files inside of the `v3-catalog/src/trigger` dir will automatically be rebuilt by the `dev` command. diff --git a/docs/upgrading-packages.mdx b/docs/upgrading-packages.mdx index 197c19f22..e2a84ad3a 100644 --- a/docs/upgrading-packages.mdx +++ b/docs/upgrading-packages.mdx @@ -71,8 +71,8 @@ But we recommend adding your dev and deploy commands to the `scripts` section of ```json { "scripts": { - "dev:trigger": "triggerdev dev", - "deploy:trigger": "triggerdev deploy" + "dev:trigger": "trigger dev", + "deploy:trigger": "trigger deploy" } } ``` diff --git a/references/bun-catalog/README.md b/references/bun-catalog/README.md index 37c0a04e9..b3e0768da 100644 --- a/references/bun-catalog/README.md +++ b/references/bun-catalog/README.md @@ -35,13 +35,13 @@ cd references/v3-catalog 4. If you've never logged in to the CLI you'll see an error telling you to login. Do this: ```bash -pnpm exec triggerdev login -a http://localhost:3030 +pnpm exec trigger login -a http://localhost:3030 ``` If this fails because you already are logged in you can create a new profile: ```bash -pnpm exec triggerdev login -a http://localhost:3030 --profile local +pnpm exec trigger login -a http://localhost:3030 --profile local ``` Note: if you use a profile then you'll need to append `--profile local` to all commands, like `dev`. @@ -49,7 +49,7 @@ Note: if you use a profile then you'll need to append `--profile local` to all c 5. Run the v3 CLI ```bash -pnpm exec triggerdev dev +pnpm exec trigger dev ``` 6. You should see the v3 dev command spitting out messages, including that it's started a background worker. diff --git a/references/bun-catalog/package.json b/references/bun-catalog/package.json index 653d5b2be..483cfe2c5 100644 --- a/references/bun-catalog/package.json +++ b/references/bun-catalog/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "scripts": { - "dev:trigger": "triggerdev dev", - "deploy": "triggerdev deploy" + "dev:trigger": "trigger dev", + "deploy": "trigger deploy" }, "dependencies": { "@trigger.dev/sdk": "workspace:*" diff --git a/references/v3-catalog/README.md b/references/v3-catalog/README.md index 37c0a04e9..b3e0768da 100644 --- a/references/v3-catalog/README.md +++ b/references/v3-catalog/README.md @@ -35,13 +35,13 @@ cd references/v3-catalog 4. If you've never logged in to the CLI you'll see an error telling you to login. Do this: ```bash -pnpm exec triggerdev login -a http://localhost:3030 +pnpm exec trigger login -a http://localhost:3030 ``` If this fails because you already are logged in you can create a new profile: ```bash -pnpm exec triggerdev login -a http://localhost:3030 --profile local +pnpm exec trigger login -a http://localhost:3030 --profile local ``` Note: if you use a profile then you'll need to append `--profile local` to all commands, like `dev`. @@ -49,7 +49,7 @@ Note: if you use a profile then you'll need to append `--profile local` to all c 5. Run the v3 CLI ```bash -pnpm exec triggerdev dev +pnpm exec trigger dev ``` 6. You should see the v3 dev command spitting out messages, including that it's started a background worker. diff --git a/references/v3-catalog/package.json b/references/v3-catalog/package.json index fdbf5c09d..ff1c63c5d 100644 --- a/references/v3-catalog/package.json +++ b/references/v3-catalog/package.json @@ -6,8 +6,8 @@ "schema": "./prisma/schema.zmodel" }, "scripts": { - "dev:trigger": "triggerdev dev", - "deploy": "triggerdev deploy", + "dev:trigger": "trigger dev", + "deploy": "trigger deploy", "management": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/management.ts", "queues": "ts-node -r dotenv/config -r tsconfig-paths/register ./src/queues.ts", "build:client": "tsup-node ./src/clientUsage.ts --format esm,cjs", From 09aaa807a67d92f9c1c447033d2369bc591911b4 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Fri, 20 Sep 2024 16:19:42 +0100 Subject: [PATCH 52/55] Improvements to the Remix guide --- docs/guides/frameworks/remix.mdx | 54 +++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/docs/guides/frameworks/remix.mdx b/docs/guides/frameworks/remix.mdx index bc3571c90..b8b6d0704 100644 --- a/docs/guides/frameworks/remix.mdx +++ b/docs/guides/frameworks/remix.mdx @@ -40,15 +40,15 @@ For more information on authenticating with Trigger.dev, see the [API keys page] - Create a new file called `api.trigger.ts` (or `api.trigger.js`) in the `app/routes` directory like this: `app/routes/api.trigger.ts`. + Create a new file called `api.hello-world.ts` (or `api.hello-world.js`) in the `app/routes` directory like this: `app/routes/api.hello-world.ts`. - Add this code to your `api.trigger.ts` file which imports your task: + Add this code to your `api.hello-world.ts` file which imports your task: - ```ts + ```ts app/routes/api.hello-world.ts import type { helloWorldTask } from "../../src/trigger/example"; import { tasks } from "@trigger.dev/sdk/v3"; @@ -78,12 +78,44 @@ For more information on authenticating with Trigger.dev, see the [API keys page] -## Deploying Remix to Vercel Edge Functions +## Deploying to Vercel Edge Functions -There are a few extra steps to follow to deploy your Remix app to Vercel Edge Functions. +Before we start, it's important to note that: +- We'll be using a type-only import for the task to ensure compatibility with the edge runtime. +- The `@trigger.dev/sdk/v3` package supports the edge runtime out of the box. + +There are a few extra steps to follow to deploy your `/api/hello-world` API endpoint to Vercel Edge Functions. + + +Update your API route to use the `runtime: "edge"` option and change it to an `action()` so we can trigger the task from a curl request later on. + +```ts app/routes/api.hello-world.ts +import { tasks } from "@trigger.dev/sdk/v3"; +import type { helloWorldTask } from "../../src/trigger/example"; +// 👆 **type-only** import + +// include this at the top of your API route file +export const config = { + runtime: "edge", +}; +export async function action({ request }: { request: Request }) { + // This is where you'd authenticate the request + const payload = await request.json(); + const handle = await tasks.trigger( + "hello-world", + payload + ); + return new Response(JSON.stringify(handle), { + headers: { "Content-Type": "application/json" }, + }); +} +``` + + + Create or update the `vercel.json` file with the following: @@ -100,7 +132,7 @@ Create or update the `vercel.json` file with the following: - + Update your `package.json` to include the following scripts: @@ -148,7 +180,15 @@ Once you've added the environment variable, deploy your project to Vercel. -After deployment, visit your Vercel deployment URL followed by `/api/trigger` (e.g., `https://your-app.vercel.app/api/trigger`) to test the Trigger.dev task in production. +After deployment, you can test your task in production by running this curl command: + +```bash +curl -X POST https://your-app.vercel.app/api/hello-world \ +-H "Content-Type: application/json" \ +-d '{"name": "James"}' +``` + +This sends a POST request to your API endpoint with a JSON payload. From e47b6cf166aa36094236105144353abc10478e1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 16:24:45 +0100 Subject: [PATCH 53/55] chore: Update version for release (#1328) Co-authored-by: github-actions[bot] --- .changeset/four-buttons-run.md | 5 ----- .changeset/friendly-brooms-cry.md | 6 ------ .changeset/healthy-donkeys-grab.md | 5 ----- .changeset/little-donkeys-protect.md | 5 ----- .changeset/lovely-dolphins-chew.md | 5 ----- .changeset/orange-plums-deliver.md | 5 ----- packages/build/CHANGELOG.md | 10 ++++++++++ packages/build/package.json | 4 ++-- packages/cli-v3/CHANGELOG.md | 13 +++++++++++++ packages/cli-v3/package.json | 6 +++--- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/trigger-sdk/CHANGELOG.md | 8 ++++++++ packages/trigger-sdk/package.json | 4 ++-- 14 files changed, 45 insertions(+), 39 deletions(-) delete mode 100644 .changeset/four-buttons-run.md delete mode 100644 .changeset/friendly-brooms-cry.md delete mode 100644 .changeset/healthy-donkeys-grab.md delete mode 100644 .changeset/little-donkeys-protect.md delete mode 100644 .changeset/lovely-dolphins-chew.md delete mode 100644 .changeset/orange-plums-deliver.md diff --git a/.changeset/four-buttons-run.md b/.changeset/four-buttons-run.md deleted file mode 100644 index e89c4f7d8..000000000 --- a/.changeset/four-buttons-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"trigger.dev": patch ---- - -Ignore OTEL_EXPORTER_OTLP_ENDPOINT environment variable from `.env` files, to prevent the internal OTEL_EXPORTER_OTLP_ENDPOINT being overwritten with a user-supplied value. diff --git a/.changeset/friendly-brooms-cry.md b/.changeset/friendly-brooms-cry.md deleted file mode 100644 index aa7fff9a7..000000000 --- a/.changeset/friendly-brooms-cry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"trigger.dev": patch -"@trigger.dev/build": patch ---- - -prismaExtension fixes for #1325 and #1327 diff --git a/.changeset/healthy-donkeys-grab.md b/.changeset/healthy-donkeys-grab.md deleted file mode 100644 index 903a50d9c..000000000 --- a/.changeset/healthy-donkeys-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Add support for Buffer in payloads and outputs diff --git a/.changeset/little-donkeys-protect.md b/.changeset/little-donkeys-protect.md deleted file mode 100644 index 479f7a0da..000000000 --- a/.changeset/little-donkeys-protect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -Feat: puppeteer build extension diff --git a/.changeset/lovely-dolphins-chew.md b/.changeset/lovely-dolphins-chew.md deleted file mode 100644 index fc45c4f7f..000000000 --- a/.changeset/lovely-dolphins-chew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/build": patch ---- - -fix: audiowaveform extension diff --git a/.changeset/orange-plums-deliver.md b/.changeset/orange-plums-deliver.md deleted file mode 100644 index 2a7ac73ed..000000000 --- a/.changeset/orange-plums-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -runs.retrieve() now includes details about related runs (root, parent, and children) as well how how the runs were triggered and if they are in a batch diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 41189422f..0364bc2cf 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,15 @@ # @trigger.dev/build +## 3.0.6 + +### Patch Changes + +- b4be73655: prismaExtension fixes for #1325 and #1327 +- c65d4822b: Feat: puppeteer build extension +- 1f5bcc73b: fix: audiowaveform extension +- Updated dependencies [4e0bc485a] + - @trigger.dev/core@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index bef0f199f..a902cfb62 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "3.0.5", + "version": "3.0.6", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -65,7 +65,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:3.0.5", + "@trigger.dev/core": "workspace:3.0.6", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 9784fbec1..018a13b15 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,18 @@ # trigger.dev +## 3.0.6 + +### Patch Changes + +- 64862db84: Ignore OTEL_EXPORTER_OTLP_ENDPOINT environment variable from `.env` files, to prevent the internal OTEL_EXPORTER_OTLP_ENDPOINT being overwritten with a user-supplied value. +- b4be73655: prismaExtension fixes for #1325 and #1327 +- Updated dependencies [b4be73655] +- Updated dependencies [4e0bc485a] +- Updated dependencies [c65d4822b] +- Updated dependencies [1f5bcc73b] + - @trigger.dev/build@3.0.6 + - @trigger.dev/core@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index 84efabf2d..21733b13a 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "3.0.5", + "version": "3.0.6", "description": "A Command-Line Interface for Trigger.dev (v3) projects", "type": "module", "license": "MIT", @@ -87,8 +87,8 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/build": "workspace:3.0.5", - "@trigger.dev/core": "workspace:3.0.5", + "@trigger.dev/build": "workspace:3.0.6", + "@trigger.dev/core": "workspace:3.0.6", "c12": "^1.11.1", "chalk": "^5.2.0", "cli-table3": "^0.6.3", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 285be2b2f..d6f6ee1c5 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # internal-platform +## 3.0.6 + +### Patch Changes + +- 4e0bc485a: Add support for Buffer in payloads and outputs + ## 3.0.5 ## 3.0.4 diff --git a/packages/core/package.json b/packages/core/package.json index 08907cfda..75d7af01e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "3.0.5", + "version": "3.0.6", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index 8014e6141..36d166781 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,13 @@ # @trigger.dev/sdk +## 3.0.6 + +### Patch Changes + +- e79f0cc84: runs.retrieve() now includes details about related runs (root, parent, and children) as well how how the runs were triggered and if they are in a batch +- Updated dependencies [4e0bc485a] + - @trigger.dev/core@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 2fc132238..8e52cc5a2 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "3.0.5", + "version": "3.0.6", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -48,7 +48,7 @@ "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", - "@trigger.dev/core": "workspace:3.0.5", + "@trigger.dev/core": "workspace:3.0.6", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", From 04645e83293ab8a04a094a84697b20b2b08d6142 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Fri, 20 Sep 2024 16:25:19 +0100 Subject: [PATCH 54/55] Release 3.0.6 --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a763fc89..3ec416886 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -823,7 +823,7 @@ importers: packages/build: dependencies: '@trigger.dev/core': - specifier: workspace:3.0.5 + specifier: workspace:3.0.6 version: link:../core pkg-types: specifier: ^1.1.3 @@ -902,10 +902,10 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/build': - specifier: workspace:3.0.5 + specifier: workspace:3.0.6 version: link:../build '@trigger.dev/core': - specifier: workspace:3.0.5 + specifier: workspace:3.0.6 version: link:../core c12: specifier: ^1.11.1 @@ -1246,7 +1246,7 @@ importers: specifier: 1.25.1 version: 1.25.1 '@trigger.dev/core': - specifier: workspace:3.0.5 + specifier: workspace:3.0.6 version: link:../core chalk: specifier: ^5.2.0 From 9ce3f790f9b13090d3720f0c1c1ef33c1b9423ca Mon Sep 17 00:00:00 2001 From: Harsh Shrikant Bhat <90265455+harshsbhat@users.noreply.github.com> Date: Sat, 21 Sep 2024 13:42:48 +0530 Subject: [PATCH 55/55] fix: Added dev.vars into dotEnv file (#1340) * Added dev.vars into dotEnv file * Added changes * Update yellow-knives-attack.md --------- Co-authored-by: Eric Allam --- .changeset/yellow-knives-attack.md | 5 +++++ packages/cli-v3/src/utilities/dotEnv.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/yellow-knives-attack.md diff --git a/.changeset/yellow-knives-attack.md b/.changeset/yellow-knives-attack.md new file mode 100644 index 000000000..f69481ef0 --- /dev/null +++ b/.changeset/yellow-knives-attack.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Add the "dev.vars" file to the list of auto-loaded dotenv files in the dev CLI command diff --git a/packages/cli-v3/src/utilities/dotEnv.ts b/packages/cli-v3/src/utilities/dotEnv.ts index 7b5bfbcf6..f50b26f50 100644 --- a/packages/cli-v3/src/utilities/dotEnv.ts +++ b/packages/cli-v3/src/utilities/dotEnv.ts @@ -2,7 +2,7 @@ import dotenv from "dotenv"; import { resolve } from "node:path"; import { env } from "std-env"; -const ENVVAR_FILES = [".env", ".env.development", ".env.local", ".env.development.local"]; +const ENVVAR_FILES = [".env", ".env.development", ".env.local", ".env.development.local", "dev.vars"]; export function resolveDotEnvVars(cwd?: string, envFile?: string) { const result: { [key: string]: string } = {};