diff --git a/apps/webapp/app/routes/api.v1.waitpoints.tokens.$waitpointFriendlyId.complete.ts b/apps/webapp/app/routes/api.v1.waitpoints.tokens.$waitpointFriendlyId.complete.ts index 1a13324f60..afd6885013 100644 --- a/apps/webapp/app/routes/api.v1.waitpoints.tokens.$waitpointFriendlyId.complete.ts +++ b/apps/webapp/app/routes/api.v1.waitpoints.tokens.$waitpointFriendlyId.complete.ts @@ -13,14 +13,20 @@ import { logger } from "~/services/logger.server"; import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; import { engine } from "~/v3/runEngine.server"; -const { action } = createActionApiRoute( +const { action, loader } = createActionApiRoute( { params: z.object({ waitpointFriendlyId: z.string(), }), body: CompleteWaitpointTokenRequestBody, maxContentLength: env.TASK_PAYLOAD_MAXIMUM_SIZE, - method: "POST", + allowJWT: true, + authorization: { + action: "write", + resource: (params) => ({ waitpoints: params.waitpointFriendlyId }), + superScopes: ["write:waitpoints", "admin"], + }, + corsStrategy: "all", }, async ({ authentication, body, params }) => { // Resume tokens are actually just waitpoints @@ -39,6 +45,12 @@ const { action } = createActionApiRoute( throw json({ error: "Waitpoint not found" }, { status: 404 }); } + if (waitpoint.status === "COMPLETED") { + return json({ + success: true, + }); + } + const stringifiedData = await stringifyIO(body.data); const finalData = await conditionallyExportPacket( stringifiedData, @@ -65,4 +77,4 @@ const { action } = createActionApiRoute( } ); -export { action }; +export { action, loader }; diff --git a/apps/webapp/app/routes/api.v1.waitpoints.tokens.ts b/apps/webapp/app/routes/api.v1.waitpoints.tokens.ts index 296c006f45..7e49de8f40 100644 --- a/apps/webapp/app/routes/api.v1.waitpoints.tokens.ts +++ b/apps/webapp/app/routes/api.v1.waitpoints.tokens.ts @@ -13,6 +13,7 @@ import { createActionApiRoute, createLoaderApiRoute, } from "~/services/routeBuilders/apiBuilder.server"; +import { AuthenticatedEnvironment } from "~/services/apiAuth.server"; import { parseDelay } from "~/utils/delays"; import { resolveIdempotencyKeyTTL } from "~/utils/idempotencyKeys.server"; import { engine } from "~/v3/runEngine.server"; @@ -77,12 +78,14 @@ const { action } = createActionApiRoute( tags: bodyTags, }); + const $responseHeaders = await responseHeaders(authentication.environment); + return json( { id: WaitpointId.toFriendlyId(result.waitpoint.id), isCached: result.isCached, }, - { status: 200 } + { status: 200, headers: $responseHeaders } ); } catch (error) { if (error instanceof ServiceValidationError) { @@ -96,4 +99,17 @@ const { action } = createActionApiRoute( } ); +async function responseHeaders( + environment: AuthenticatedEnvironment +): Promise> { + const claimsHeader = JSON.stringify({ + sub: environment.id, + pub: true, + }); + + return { + "x-trigger-jwt-claims": claimsHeader, + }; +} + export { action }; diff --git a/apps/webapp/app/services/authorization.server.ts b/apps/webapp/app/services/authorization.server.ts index 315b6094e0..a7a3101165 100644 --- a/apps/webapp/app/services/authorization.server.ts +++ b/apps/webapp/app/services/authorization.server.ts @@ -1,6 +1,6 @@ export type AuthorizationAction = "read" | "write" | string; // Add more actions as needed -const ResourceTypes = ["tasks", "tags", "runs", "batch"] as const; +const ResourceTypes = ["tasks", "tags", "runs", "batch", "waitpoints"] as const; export type AuthorizationResources = { [key in (typeof ResourceTypes)[number]]?: string | string[]; diff --git a/internal-packages/run-engine/src/engine/errors.ts b/internal-packages/run-engine/src/engine/errors.ts index e1dd34eac4..3f26e8033f 100644 --- a/internal-packages/run-engine/src/engine/errors.ts +++ b/internal-packages/run-engine/src/engine/errors.ts @@ -49,8 +49,6 @@ export function runStatusFromError(error: TaskRunError): TaskRunStatus { case "TASK_EXECUTION_ABORTED": case "TASK_EXECUTION_FAILED": case "TASK_PROCESS_SIGTERM": - case "TASK_DEQUEUED_INVALID_RETRY_CONFIG": - case "TASK_DEQUEUED_NO_RETRY_CONFIG": case "TASK_DID_CONCURRENT_WAIT": return "SYSTEM_FAILURE"; default: diff --git a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts index 1d08154d65..c49484b3ca 100644 --- a/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/dequeueSystem.ts @@ -307,41 +307,9 @@ export class DequeueSystem { task: result.task.id, rawRetryConfig: retryConfig, }); - - await this.runAttemptSystem.systemFailure({ - runId, - error: { - type: "INTERNAL_ERROR", - code: "TASK_DEQUEUED_INVALID_RETRY_CONFIG", - message: `Invalid retry config: ${retryConfig}`, - }, - tx: prisma, - }); - - return null; - } - - if (!parsedConfig.data) { - this.$.logger.error("RunEngine.dequeueFromMasterQueue(): No retry config", { - runId, - task: result.task.id, - rawRetryConfig: retryConfig, - }); - - await this.runAttemptSystem.systemFailure({ - runId, - error: { - type: "INTERNAL_ERROR", - code: "TASK_DEQUEUED_NO_RETRY_CONFIG", - message: `No retry config found`, - }, - tx: prisma, - }); - - return null; } - maxAttempts = parsedConfig.data.maxAttempts; + maxAttempts = parsedConfig.data?.maxAttempts; } //update the run const lockedTaskRun = await prisma.taskRun.update({ diff --git a/internal-packages/run-engine/src/engine/systems/waitpointSystem.ts b/internal-packages/run-engine/src/engine/systems/waitpointSystem.ts index e27de73a28..669fcf0e26 100644 --- a/internal-packages/run-engine/src/engine/systems/waitpointSystem.ts +++ b/internal-packages/run-engine/src/engine/systems/waitpointSystem.ts @@ -1,4 +1,4 @@ -import { timeoutError } from "@trigger.dev/core/v3"; +import { timeoutError, tryCatch } from "@trigger.dev/core/v3"; import { WaitpointId } from "@trigger.dev/core/v3/isomorphic"; import { $transaction, @@ -66,65 +66,51 @@ export class WaitpointSystem { isError: boolean; }; }): Promise { - const result = await $transaction( - this.$.prisma, - async (tx) => { - // 1. Find the TaskRuns blocked by this waitpoint - const affectedTaskRuns = await tx.taskRunWaitpoint.findMany({ - where: { waitpointId: id }, - select: { taskRunId: true, spanIdToComplete: true, createdAt: true }, - }); + // 1. Find the TaskRuns blocked by this waitpoint + const affectedTaskRuns = await this.$.prisma.taskRunWaitpoint.findMany({ + where: { waitpointId: id }, + select: { taskRunId: true, spanIdToComplete: true, createdAt: true }, + }); - if (affectedTaskRuns.length === 0) { - this.$.logger.warn(`completeWaitpoint: No TaskRunWaitpoints found for waitpoint`, { - waitpointId: id, - }); - } + if (affectedTaskRuns.length === 0) { + this.$.logger.debug(`completeWaitpoint: No TaskRunWaitpoints found for waitpoint`, { + waitpointId: id, + }); + } - // 2. Update the waitpoint to completed (only if it's pending) - let waitpoint: Waitpoint | null = null; - try { - waitpoint = await tx.waitpoint.update({ - where: { id, status: "PENDING" }, - data: { - status: "COMPLETED", - completedAt: new Date(), - output: output?.value, - outputType: output?.type, - outputIsError: output?.isError, - }, - }); - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2025") { - waitpoint = await tx.waitpoint.findFirst({ - where: { id }, - }); - } else { - this.$.logger.log("completeWaitpoint: error updating waitpoint:", { error }); - throw error; - } - } + let [waitpointError, waitpoint] = await tryCatch( + this.$.prisma.waitpoint.update({ + where: { id, status: "PENDING" }, + data: { + status: "COMPLETED", + completedAt: new Date(), + output: output?.value, + outputType: output?.type, + outputIsError: output?.isError, + }, + }) + ); - return { waitpoint, affectedTaskRuns }; - }, - (error) => { - this.$.logger.error(`completeWaitpoint: Error completing waitpoint ${id}, retrying`, { - error, + if (waitpointError) { + if ( + waitpointError instanceof Prisma.PrismaClientKnownRequestError && + waitpointError.code === "P2025" + ) { + waitpoint = await this.$.prisma.waitpoint.findFirst({ + where: { id }, }); - throw error; + } else { + this.$.logger.log("completeWaitpoint: error updating waitpoint:", { waitpointError }); + throw waitpointError; } - ); - - if (!result) { - throw new Error(`Waitpoint couldn't be updated`); } - if (!result.waitpoint) { + if (!waitpoint) { throw new Error(`Waitpoint ${id} not found`); } //schedule trying to continue the runs - for (const run of result.affectedTaskRuns) { + for (const run of affectedTaskRuns) { await this.$.worker.enqueue({ //this will debounce the call id: `continueRunIfUnblocked:${run.taskRunId}`, @@ -148,7 +134,7 @@ export class WaitpointSystem { } } - return result.waitpoint; + return waitpoint; } /** diff --git a/packages/cli-v3/src/entryPoints/dev-run-worker.ts b/packages/cli-v3/src/entryPoints/dev-run-worker.ts index 8553e36057..0ebabb42e7 100644 --- a/packages/cli-v3/src/entryPoints/dev-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/dev-run-worker.ts @@ -378,6 +378,8 @@ const zodIpc = new ZodIpcConnection({ return; } + runMetadataManager.runId = execution.run.id; + const executor = new TaskExecutor(task, { tracer, tracingSDK, diff --git a/packages/cli-v3/src/entryPoints/managed-run-worker.ts b/packages/cli-v3/src/entryPoints/managed-run-worker.ts index fa4f426bac..6c2ef1a674 100644 --- a/packages/cli-v3/src/entryPoints/managed-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/managed-run-worker.ts @@ -376,6 +376,8 @@ const zodIpc = new ZodIpcConnection({ return; } + runMetadataManager.runId = execution.run.id; + const executor = new TaskExecutor(task, { tracer, tracingSDK, diff --git a/packages/core/src/v3/apiClient/core.ts b/packages/core/src/v3/apiClient/core.ts index d07e50711a..60979ba498 100644 --- a/packages/core/src/v3/apiClient/core.ts +++ b/packages/core/src/v3/apiClient/core.ts @@ -5,7 +5,7 @@ import { calculateNextRetryDelay } from "../utils/retries.js"; import { ApiConnectionError, ApiError, ApiSchemaValidationError } from "./errors.js"; import { Attributes, context, propagation, Span } from "@opentelemetry/api"; -import {suppressTracing} from "@opentelemetry/core" +import { suppressTracing } from "@opentelemetry/core"; import { SemanticInternalAttributes } from "../semanticInternalAttributes.js"; import type { TriggerTracer } from "../tracer.js"; import { accessoryAttributes } from "../utils/styleAttributes.js"; @@ -27,14 +27,14 @@ export const defaultRetryOptions = { randomize: false, } satisfies RetryOptions; -export type ZodFetchOptions = { +export type ZodFetchOptions = { retry?: RetryOptions; tracer?: TriggerTracer; name?: string; attributes?: Attributes; icon?: string; - onResponseBody?: (body: T, span: Span) => void; - prepareData?: (data: T) => Promise | T; + onResponseBody?: (body: TData, span: Span) => void; + prepareData?: (data: TData, response: Response) => Promise | TData; }; export type AnyZodFetchOptions = ZodFetchOptions; @@ -144,7 +144,14 @@ export function zodfetchOffsetLimitPage( const fetchResult = _doZodFetch(offsetLimitPageSchema, $url.href, requestInit, options); - return new OffsetLimitPagePromise(fetchResult, schema, url, params, requestInit, options); + return new OffsetLimitPagePromise( + fetchResult as Promise>>>, + schema, + url, + params, + requestInit, + options + ); } type ZodFetchResult = { @@ -188,7 +195,7 @@ async function _doZodFetch( schema: TResponseBodySchema, url: string, requestInit?: PromiseOrValue, - options?: ZodFetchOptions + options?: ZodFetchOptions> ): Promise>> { let $requestInit = await requestInit; @@ -202,7 +209,7 @@ async function _doZodFetch( } if (options?.prepareData) { - result.data = await options.prepareData(result.data); + result.data = await options.prepareData(result.data, result.response); } return result; diff --git a/packages/core/src/v3/apiClient/index.ts b/packages/core/src/v3/apiClient/index.ts index 94dc718a9a..fdeb1e48e6 100644 --- a/packages/core/src/v3/apiClient/index.ts +++ b/packages/core/src/v3/apiClient/index.ts @@ -76,6 +76,13 @@ import { UpdateEnvironmentVariableParams, } from "./types.js"; import { AsyncIterableStream } from "../streams/asyncIterableStream.js"; +import { Prettify } from "../types/utils.js"; + +export type CreateWaitpointTokenResponse = Prettify< + CreateWaitpointTokenResponseBody & { + publicAccessToken: string; + } +>; export type { CreateEnvironmentVariableParams, @@ -217,7 +224,7 @@ export class ApiClient { mergeRequestOptions(this.defaultRequestOptions, requestOptions) ) .withResponse() - .then(async ({ response, data }) => { + .then(async ({ data, response }) => { const jwtHeader = response.headers.get("x-trigger-jwt"); if (typeof jwtHeader === "string") { @@ -264,7 +271,7 @@ export class ApiClient { mergeRequestOptions(this.defaultRequestOptions, requestOptions) ) .withResponse() - .then(async ({ response, data }) => { + .then(async ({ data, response }) => { const claimsHeader = response.headers.get("x-trigger-jwt-claims"); const claims = claimsHeader ? JSON.parse(claimsHeader) : undefined; @@ -669,8 +676,37 @@ export class ApiClient { headers: this.#getHeaders(false), body: JSON.stringify(options), }, - mergeRequestOptions(this.defaultRequestOptions, requestOptions) - ); + { + ...mergeRequestOptions(this.defaultRequestOptions, requestOptions), + prepareData: async (data, response) => { + const jwtHeader = response.headers.get("x-trigger-jwt"); + + if (typeof jwtHeader === "string") { + return { + ...data, + publicAccessToken: jwtHeader, + }; + } + + const claimsHeader = response.headers.get("x-trigger-jwt-claims"); + const claims = claimsHeader ? JSON.parse(claimsHeader) : undefined; + + const jwt = await generateJWT({ + secretKey: this.accessToken, + payload: { + ...claims, + scopes: [`write:waitpoints:${data.id}`], + }, + expirationTime: "24h", + }); + + return { + ...data, + publicAccessToken: jwt, + }; + }, + } + ) as ApiPromise; } listWaitpointTokens( @@ -721,7 +757,9 @@ export class ApiClient { headers: this.#getHeaders(false), body: JSON.stringify(options), }, - mergeRequestOptions(this.defaultRequestOptions, requestOptions) + { + ...mergeRequestOptions(this.defaultRequestOptions, requestOptions), + } ); } diff --git a/packages/core/src/v3/errors.ts b/packages/core/src/v3/errors.ts index bf9776d1c2..ef16d3d16a 100644 --- a/packages/core/src/v3/errors.ts +++ b/packages/core/src/v3/errors.ts @@ -140,6 +140,20 @@ export class TaskPayloadParsedError extends Error { } } +export class CompleteTaskWithOutput extends Error { + public readonly output: unknown; + + constructor(output?: unknown) { + super("Complete task with output"); + this.name = "CompleteTaskWithOutput"; + this.output = output; + } +} + +export function isCompleteTaskWithOutput(error: unknown): error is CompleteTaskWithOutput { + return error instanceof Error && error.name === "CompleteTaskWithOutput"; +} + export function parseError(error: unknown): TaskRunError { if (isInternalError(error)) { return { @@ -291,8 +305,6 @@ export function shouldRetryError(error: TaskRunError): boolean { // run engine errors case "TASK_DEQUEUED_INVALID_STATE": case "TASK_DEQUEUED_QUEUE_NOT_FOUND": - case "TASK_DEQUEUED_INVALID_RETRY_CONFIG": - case "TASK_DEQUEUED_NO_RETRY_CONFIG": case "TASK_HAS_N0_EXECUTION_SNAPSHOT": case "TASK_RUN_DEQUEUED_MAX_RETRIES": return false; diff --git a/packages/core/src/v3/logger/index.ts b/packages/core/src/v3/logger/index.ts index b569a2869f..22027d5736 100644 --- a/packages/core/src/v3/logger/index.ts +++ b/packages/core/src/v3/logger/index.ts @@ -1,6 +1,6 @@ -import { NoopTaskLogger, TaskLogger } from "./taskLogger.js"; +import { NoopTaskLogger, TaskLogger, TraceOptions } from "./taskLogger.js"; import { getGlobal, registerGlobal, unregisterGlobal } from "../utils/globals.js"; -import { Span, SpanOptions } from "@opentelemetry/api"; +import { Span } from "@opentelemetry/api"; const API_NAME = "logger"; @@ -47,11 +47,15 @@ export class LoggerAPI implements TaskLogger { this.#getTaskLogger().error(message, metadata); } - public trace(name: string, fn: (span: Span) => Promise, options?: SpanOptions): Promise { + public trace( + name: string, + fn: (span: Span) => Promise, + options?: TraceOptions + ): Promise { return this.#getTaskLogger().trace(name, fn, options); } - public startSpan(name: string, options?: SpanOptions): Span { + public startSpan(name: string, options?: TraceOptions): Span { return this.#getTaskLogger().startSpan(name, options); } diff --git a/packages/core/src/v3/logger/taskLogger.ts b/packages/core/src/v3/logger/taskLogger.ts index 48d7968cad..8fbfd19cc6 100644 --- a/packages/core/src/v3/logger/taskLogger.ts +++ b/packages/core/src/v3/logger/taskLogger.ts @@ -6,6 +6,7 @@ import { TriggerTracer } from "../tracer.js"; import { flattenAttributes } from "../utils/flattenAttributes.js"; import { ClockTime } from "../clock/clock.js"; import { clock } from "../clock-api.js"; +import { Prettify } from "../types/utils.js"; export type LogLevel = "none" | "error" | "warn" | "info" | "debug" | "log"; @@ -17,14 +18,20 @@ export type TaskLoggerConfig = { level: LogLevel; }; +export type TraceOptions = Prettify< + SpanOptions & { + icon?: string; + } +>; + export interface TaskLogger { debug(message: string, properties?: Record): void; log(message: string, properties?: Record): void; info(message: string, properties?: Record): void; warn(message: string, properties?: Record): void; error(message: string, properties?: Record): void; - trace(name: string, fn: (span: Span) => Promise, options?: SpanOptions): Promise; - startSpan(name: string, options?: SpanOptions): Span; + trace(name: string, fn: (span: Span) => Promise, options?: TraceOptions): Promise; + startSpan(name: string, options?: TraceOptions): Span; } export class OtelTaskLogger implements TaskLogger { @@ -87,12 +94,28 @@ export class OtelTaskLogger implements TaskLogger { }); } - trace(name: string, fn: (span: Span) => Promise, options?: SpanOptions): Promise { - return this._config.tracer.startActiveSpan(name, fn, options); + trace(name: string, fn: (span: Span) => Promise, options?: TraceOptions): Promise { + const spanOptions = { + ...options, + attributes: { + ...options?.attributes, + ...(options?.icon ? { [SemanticInternalAttributes.STYLE_ICON]: options.icon } : {}), + }, + }; + + return this._config.tracer.startActiveSpan(name, fn, spanOptions); } - startSpan(name: string, options?: SpanOptions): Span { - return this._config.tracer.startSpan(name, options); + startSpan(name: string, options?: TraceOptions): Span { + const spanOptions = { + ...options, + attributes: { + ...options?.attributes, + ...(options?.icon ? { [SemanticInternalAttributes.STYLE_ICON]: options.icon } : {}), + }, + }; + + return this._config.tracer.startSpan(name, spanOptions); } #getTimestampInHrTime(): ClockTime { diff --git a/packages/core/src/v3/schemas/common.ts b/packages/core/src/v3/schemas/common.ts index 5467603e9d..030dd4dcee 100644 --- a/packages/core/src/v3/schemas/common.ts +++ b/packages/core/src/v3/schemas/common.ts @@ -177,8 +177,6 @@ export const TaskRunInternalError = z.object({ "TASK_HAS_N0_EXECUTION_SNAPSHOT", "TASK_DEQUEUED_INVALID_STATE", "TASK_DEQUEUED_QUEUE_NOT_FOUND", - "TASK_DEQUEUED_INVALID_RETRY_CONFIG", - "TASK_DEQUEUED_NO_RETRY_CONFIG", "TASK_RUN_DEQUEUED_MAX_RETRIES", "TASK_RUN_STALLED_EXECUTING", "TASK_RUN_STALLED_EXECUTING_WITH_WAITPOINTS", diff --git a/packages/core/src/v3/tracer.ts b/packages/core/src/v3/tracer.ts index 42bc2f249e..2077e3772f 100644 --- a/packages/core/src/v3/tracer.ts +++ b/packages/core/src/v3/tracer.ts @@ -17,6 +17,7 @@ import { clock } from "./clock-api.js"; import { usage } from "./usage-api.js"; import { taskContext } from "./task-context-api.js"; import { recordSpanException } from "./otel/utils.js"; +import { isCompleteTaskWithOutput } from "./errors.js"; export type TriggerTracerConfig = | { @@ -131,6 +132,14 @@ export class TriggerTracer { try { return await fn(span); } catch (e) { + if (isCompleteTaskWithOutput(e)) { + if (!spanEnded) { + span.end(clock.preciseNow()); + } + + throw e; + } + if (!spanEnded) { if (typeof e === "string" || e instanceof Error) { span.recordException(e); diff --git a/packages/core/src/v3/workers/taskExecutor.ts b/packages/core/src/v3/workers/taskExecutor.ts index 98e6b1e575..ce7a9f8246 100644 --- a/packages/core/src/v3/workers/taskExecutor.ts +++ b/packages/core/src/v3/workers/taskExecutor.ts @@ -4,6 +4,7 @@ import { ApiError, RateLimitError } from "../apiClient/errors.js"; import { ConsoleInterceptor } from "../consoleInterceptor.js"; import { InternalError, + isCompleteTaskWithOutput, isInternalError, parseError, sanitizeError, @@ -150,7 +151,15 @@ export class TaskExecutor { await this.#callOnStartFunctions(payload, ctx, initOutput, signal); } - return await this.#callRun(payload, ctx, initOutput, signal); + try { + return await this.#callRun(payload, ctx, initOutput, signal); + } catch (error) { + if (isCompleteTaskWithOutput(error)) { + return error.output; + } + + throw error; + } })() ); diff --git a/packages/react-hooks/src/hooks/useWaitToken.ts b/packages/react-hooks/src/hooks/useWaitToken.ts new file mode 100644 index 0000000000..b79c2f7b64 --- /dev/null +++ b/packages/react-hooks/src/hooks/useWaitToken.ts @@ -0,0 +1,74 @@ +"use client"; + +import useSWRMutation from "swr/mutation"; +import { useApiClient, UseApiClientOptions } from "./useApiClient.js"; + +/** + * Base interface for task trigger instances. + * + * @template TOutput - The type of the output + */ +export interface WaitTokenInstance { + /** Function to complete the waitpoint with an output */ + complete: (output: TOutput) => void; + /** Whether the waitpoint is currently being completed */ + isLoading: boolean; + /** Whether the waitpoint has been completed */ + isCompleted: boolean; + /** Any error that occurred during completion */ + error?: Error; + /** Whether the waitpoint is ready to be completed */ + isReady: boolean; +} + +/** + * Hook to complete a waitpoint and manage its completion state. + * + * @template TOutput - The type of the output + * @param {string} waitpointId - The identifier of the waitpoint to complete + * @returns {WaitTokenInstance} An object containing the complete function, loading state, isCompleted, and any errors + * + * @example + * ```ts + * import type { myTask } from './path/to/task'; + * const { complete, isLoading, isCompleted, error } = useWaitToken('waitpoint-id'); + * + * // Complete the waitpoint with an output + * complete({ foo: 'bar' }); + * ``` + */ +export function useWaitToken( + waitpointId?: string, + options?: UseApiClientOptions +): WaitTokenInstance { + const apiClient = useApiClient(options); + + async function completeWaitpoint(id: string, { arg: { output } }: { arg: { output: TOutput } }) { + if (!apiClient) { + throw new Error("Could not complete waitpoint in useWaitToken: Missing access token"); + } + + if (!waitpointId) { + throw new Error("Could not complete waitpoint in useWaitToken: Missing waitpoint ID"); + } + + const result = await apiClient.completeWaitpointToken(waitpointId, { + data: output, + }); + + return result; + } + + const mutation = useSWRMutation(waitpointId, completeWaitpoint); + + return { + complete: (output) => { + // trigger the task with the given payload + mutation.trigger({ output }); + }, + isLoading: mutation.isMutating, + isCompleted: !!mutation.data?.success, + isReady: !!waitpointId, + error: mutation.error, + }; +} diff --git a/packages/react-hooks/src/index.ts b/packages/react-hooks/src/index.ts index 7a3a0ae200..bc20cf837d 100644 --- a/packages/react-hooks/src/index.ts +++ b/packages/react-hooks/src/index.ts @@ -3,3 +3,4 @@ export * from "./hooks/useApiClient.js"; export * from "./hooks/useRun.js"; export * from "./hooks/useRealtime.js"; export * from "./hooks/useTaskTrigger.js"; +export * from "./hooks/useWaitToken.js"; diff --git a/packages/trigger-sdk/src/v3/auth.ts b/packages/trigger-sdk/src/v3/auth.ts index 8d45cbb180..1cfcb08741 100644 --- a/packages/trigger-sdk/src/v3/auth.ts +++ b/packages/trigger-sdk/src/v3/auth.ts @@ -53,14 +53,16 @@ type PublicTokenPermissionProperties = { * Grant access to specific batch runs */ batch?: string | string[]; + + /** + * Grant access to specific waitpoints + */ + waitpoints?: string | string[]; }; export type PublicTokenPermissions = { read?: PublicTokenPermissionProperties; - /** - * @deprecated use trigger instead - */ write?: PublicTokenPermissionProperties; /** diff --git a/packages/trigger-sdk/src/v3/index.ts b/packages/trigger-sdk/src/v3/index.ts index 4837525734..4527cd6d01 100644 --- a/packages/trigger-sdk/src/v3/index.ts +++ b/packages/trigger-sdk/src/v3/index.ts @@ -33,6 +33,7 @@ export { UnprocessableEntityError, AbortTaskRunError, OutOfMemoryError, + CompleteTaskWithOutput, logger, type LogLevel, } from "@trigger.dev/core/v3"; diff --git a/packages/trigger-sdk/src/v3/wait.ts b/packages/trigger-sdk/src/v3/wait.ts index 0fee01e13f..fe5c16e93b 100644 --- a/packages/trigger-sdk/src/v3/wait.ts +++ b/packages/trigger-sdk/src/v3/wait.ts @@ -19,6 +19,7 @@ import { WaitpointListTokenItem, WaitpointTokenStatus, WaitpointRetrieveTokenResponse, + CreateWaitpointTokenResponse, } from "@trigger.dev/core/v3"; import { tracer } from "./tracer.js"; import { conditionallyImportAndParsePacket } from "@trigger.dev/core/v3/utils/ioSerialization"; @@ -51,7 +52,7 @@ import { SpanStatusCode } from "@opentelemetry/api"; function createToken( options?: CreateWaitpointTokenRequestBody, requestOptions?: ApiRequestOptions -): ApiPromise { +): ApiPromise { const apiClient = apiClientManager.clientOrThrow(); const $requestOptions = mergeRequestOptions( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0765b84ec..bfd146dbab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1718,6 +1718,70 @@ importers: specifier: 3.23.8 version: 3.23.8 + references/agent-loop: + dependencies: + '@ai-sdk/openai': + specifier: 1.3.3 + version: 1.3.3(zod@3.23.8) + '@trigger.dev/react-hooks': + specifier: workspace:* + version: link:../../packages/react-hooks + '@trigger.dev/sdk': + specifier: workspace:* + version: link:../../packages/trigger-sdk + ai: + specifier: 4.2.5 + version: 4.2.5(react@19.0.0)(zod@3.23.8) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.484.0 + version: 0.484.0(react@19.0.0) + next: + specifier: 15.2.4 + version: 15.2.4(@playwright/test@1.37.0)(react-dom@19.0.0)(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + tailwind-merge: + specifier: ^3.0.2 + version: 3.0.2 + tw-animate-css: + specifier: ^1.2.4 + version: 1.2.4 + zod: + specifier: 3.23.8 + version: 3.23.8 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4 + version: 4.0.17 + '@types/node': + specifier: ^20 + version: 20.14.14 + '@types/react': + specifier: ^19 + version: 19.0.12 + '@types/react-dom': + specifier: ^19 + version: 19.0.4(@types/react@19.0.12) + tailwindcss: + specifier: ^4.0.17 + version: 4.0.17 + trigger.dev: + specifier: workspace:* + version: link:../../packages/cli-v3 + typescript: + specifier: ^5 + version: 5.5.4 + references/bun-catalog: dependencies: '@trigger.dev/sdk': @@ -2117,6 +2181,17 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/openai@1.3.3(zod@3.23.8): + resolution: {integrity: sha512-CH57tonLB4DwkwqwnMmTCoIOR7cNW3bP5ciyloI7rBGJS/Bolemsoo+vn5YnwkyT9O1diWJyvYeTh7A4UfiYOw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + zod: 3.23.8 + dev: false + /@ai-sdk/provider-utils@1.0.17(zod@3.23.8): resolution: {integrity: sha512-2VyeTH5DQ6AxqvwdyytKIeiZyYTyJffpufWjE67zM2sXMIHgYl7fivo8m5wVl6Cbf1dFPSGKq//C9s+lz+NHrQ==} engines: {node: '>=18'} @@ -2181,6 +2256,18 @@ packages: zod: 3.23.8 dev: true + /@ai-sdk/provider-utils@2.2.1(zod@3.23.8): + resolution: {integrity: sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + dependencies: + '@ai-sdk/provider': 1.1.0 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/provider@0.0.22: resolution: {integrity: sha512-smZ1/2jL/JSKnbhC6ama/PxI2D/psj+YAe0c0qpd5ComQCNFltg72VFf0rpUSFMmFuj1pCCNoBOCrvyl8HTZHQ==} engines: {node: '>=18'} @@ -2201,6 +2288,13 @@ packages: dependencies: json-schema: 0.4.0 + /@ai-sdk/provider@1.1.0: + resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + /@ai-sdk/react@0.0.53(react@19.0.0-rc.0)(zod@3.23.8): resolution: {integrity: sha512-sIsmTFoR/QHvUUkltmHwP4bPjwy2vko6j/Nj8ayxLhEHs04Ug+dwXQyfA7MwgimEE3BcDQpWL8ikVj0m3ZILWQ==} engines: {node: '>=18'} @@ -2280,6 +2374,24 @@ packages: zod: 3.23.8 dev: true + /@ai-sdk/react@1.2.2(react@19.0.0)(zod@3.23.8): + resolution: {integrity: sha512-rxyNTFjUd3IilVOJFuUJV5ytZBYAIyRi50kFS2gNmSEiG4NHMBBm31ddrxI/i86VpY8gzZVp1/igtljnWBihUA==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.1(zod@3.23.8) + react: 19.0.0 + swr: 2.2.5(react@19.0.0) + throttleit: 2.1.0 + zod: 3.23.8 + dev: false + /@ai-sdk/solid@0.0.43(zod@3.23.8): resolution: {integrity: sha512-7PlPLaeMAu97oOY2gjywvKZMYHF+GDfUxYNcuJ4AZ3/MRBatzs/U2r4ClT1iH8uMOcMg02RX6UKzP5SgnUBjVw==} engines: {node: '>=18'} @@ -2408,6 +2520,18 @@ packages: zod-to-json-schema: 3.23.5(zod@3.23.8) dev: true + /@ai-sdk/ui-utils@1.2.1(zod@3.23.8): + resolution: {integrity: sha512-BzvMbYm7LHBlbWuLlcG1jQh4eu14MGpz7L+wrGO1+F4oQ+O0fAjgUSNwPWGlZpKmg4NrcVq/QLmxiVJrx2R4Ew==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.24.3(zod@3.23.8) + dev: false + /@ai-sdk/vue@0.0.45(vue@3.4.38)(zod@3.23.8): resolution: {integrity: sha512-bqeoWZqk88TQmfoPgnFUKkrvhOIcOcSH5LMPgzZ8XwDqz5tHHrMHzpPfHCj7XyYn4ROTFK/2kKdC/ta6Ko0fMw==} engines: {node: '>=18'} @@ -2603,7 +2727,7 @@ packages: /@aws-crypto/supports-web-crypto@5.2.0: resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/util@3.0.0: @@ -2619,7 +2743,7 @@ packages: dependencies: '@aws-sdk/types': 3.714.0 '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/client-ses@3.716.0: @@ -2810,7 +2934,7 @@ packages: '@smithy/util-endpoints': 1.0.5 '@smithy/util-retry': 2.0.7 '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -2856,7 +2980,7 @@ packages: '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -2989,7 +3113,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/property-provider': 2.0.15 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-env@3.716.0: @@ -3000,7 +3124,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-http@3.716.0: @@ -3016,7 +3140,7 @@ packages: '@smithy/smithy-client': 3.5.1 '@smithy/types': 3.7.2 '@smithy/util-stream': 3.3.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-ini@3.451.0: @@ -3032,7 +3156,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/shared-ini-file-loader': 2.2.5 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3055,7 +3179,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt @@ -3110,7 +3234,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/shared-ini-file-loader': 2.2.5 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-process@3.716.0: @@ -3122,7 +3246,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-sso@3.451.0: @@ -3135,7 +3259,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/shared-ini-file-loader': 2.2.5 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3151,7 +3275,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt @@ -3164,7 +3288,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/property-provider': 2.0.15 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-web-identity@3.716.0(@aws-sdk/client-sts@3.716.0): @@ -3178,7 +3302,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-host-header@3.451.0: @@ -3257,7 +3381,7 @@ packages: '@aws-sdk/middleware-signing': 3.451.0 '@aws-sdk/types': 3.451.0 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-signing@3.451.0: @@ -3360,7 +3484,7 @@ packages: '@smithy/util-endpoints': 1.0.5 '@smithy/util-retry': 2.0.7 '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3376,7 +3500,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/types@3.451.0: @@ -3418,7 +3542,7 @@ packages: resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-browser@3.451.0: @@ -3473,7 +3597,7 @@ packages: /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@babel/code-frame@7.22.13: @@ -5905,6 +6029,14 @@ packages: use-sync-external-store: 1.2.2(react@18.2.0) dev: false + /@emnapi/runtime@1.3.1: + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: false + optional: true + /@emotion/hash@0.9.0: resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} dev: true @@ -7735,13 +7867,13 @@ packages: resolution: {integrity: sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==} dependencies: '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/fast-memoize@2.2.0: resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/icu-messageformat-parser@2.7.3: @@ -7749,20 +7881,20 @@ packages: dependencies: '@formatjs/ecma402-abstract': 1.18.0 '@formatjs/icu-skeleton-parser': 1.7.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/icu-skeleton-parser@1.7.0: resolution: {integrity: sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==} dependencies: '@formatjs/ecma402-abstract': 1.18.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/intl-localematcher@0.5.2: resolution: {integrity: sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@fullhuman/postcss-purgecss@2.3.0: @@ -7802,7 +7934,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.7 - '@types/node': 18.19.20 + '@types/node': 20.14.14 /@grpc/proto-loader@0.7.13: resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} @@ -7933,6 +8065,186 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.3.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@infisical/sdk-android-arm-eabi@2.3.5: resolution: {integrity: sha512-7KGWJ5X/RV6sIHWt3mjNg+zykzYvbHIKmNKBHTTAOuULKpTIAoQyFD1q3XMylP2AaVh8BJtgVOODO4/Uxexlug==} engines: {node: '>= 10'} @@ -8467,6 +8779,10 @@ packages: resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} dev: false + /@next/env@15.2.4: + resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} + dev: false + /@next/swc-darwin-arm64@14.1.0: resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} engines: {node: '>= 10'} @@ -8494,6 +8810,15 @@ packages: dev: false optional: true + /@next/swc-darwin-arm64@15.2.4: + resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@14.1.0: resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} engines: {node: '>= 10'} @@ -8521,6 +8846,15 @@ packages: dev: false optional: true + /@next/swc-darwin-x64@15.2.4: + resolution: {integrity: sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu@14.1.0: resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} engines: {node: '>= 10'} @@ -8548,6 +8882,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-gnu@15.2.4: + resolution: {integrity: sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@14.1.0: resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} engines: {node: '>= 10'} @@ -8575,6 +8918,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-musl@15.2.4: + resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@14.1.0: resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} engines: {node: '>= 10'} @@ -8602,6 +8954,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-gnu@15.2.4: + resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@14.1.0: resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} engines: {node: '>= 10'} @@ -8629,6 +8990,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-musl@15.2.4: + resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@14.1.0: resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} engines: {node: '>= 10'} @@ -8656,6 +9026,15 @@ packages: dev: false optional: true + /@next/swc-win32-arm64-msvc@15.2.4: + resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@14.1.0: resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} engines: {node: '>= 10'} @@ -8710,6 +9089,15 @@ packages: dev: false optional: true + /@next/swc-win32-x64-msvc@15.2.4: + resolution: {integrity: sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -9814,7 +10202,7 @@ packages: open: 8.4.0 picocolors: 1.1.1 tiny-glob: 0.2.9 - tslib: 2.6.2 + tslib: 2.8.1 dev: true /@playwright/test@1.37.0: @@ -9822,7 +10210,7 @@ packages: engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 playwright-core: 1.37.0 optionalDependencies: fsevents: 2.3.2 @@ -15947,7 +16335,7 @@ packages: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: false /@slack/types@2.8.0: @@ -15979,7 +16367,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/abort-controller@3.1.9: @@ -15987,7 +16375,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/config-resolver@2.0.19: @@ -16034,7 +16422,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/types': 2.6.0 '@smithy/url-parser': 2.0.14 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/credential-provider-imds@3.2.8: @@ -16045,7 +16433,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-codec@2.0.14: @@ -16054,7 +16442,7 @@ packages: '@aws-crypto/crc32': 3.0.0 '@smithy/types': 2.6.0 '@smithy/util-hex-encoding': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/fetch-http-handler@2.2.7: @@ -16115,14 +16503,14 @@ packages: resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/is-array-buffer@3.0.0: resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/md5-js@2.0.16: @@ -16286,7 +16674,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/property-provider@3.1.11: @@ -16294,7 +16682,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/protocol-http@3.0.10: @@ -16319,7 +16707,7 @@ packages: dependencies: '@smithy/types': 2.6.0 '@smithy/util-uri-escape': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/querystring-builder@3.0.11: @@ -16328,7 +16716,7 @@ packages: dependencies: '@smithy/types': 3.7.2 '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/querystring-parser@2.0.14: @@ -16336,7 +16724,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/querystring-parser@3.0.11: @@ -16344,7 +16732,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/service-error-classification@2.0.7: @@ -16366,7 +16754,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/shared-ini-file-loader@3.1.12: @@ -16374,7 +16762,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/signature-v4@2.0.16: @@ -16388,7 +16776,7 @@ packages: '@smithy/util-middleware': 2.0.7 '@smithy/util-uri-escape': 2.0.0 '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/signature-v4@4.2.4: @@ -16402,7 +16790,7 @@ packages: '@smithy/util-middleware': 3.0.11 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/smithy-client@2.1.16: @@ -16506,7 +16894,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/is-array-buffer': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-buffer-from@3.0.0: @@ -16514,21 +16902,21 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-config-provider@2.0.0: resolution: {integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-config-provider@3.0.0: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-browser@2.0.20: @@ -16601,14 +16989,14 @@ packages: resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-hex-encoding@3.0.0: resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-middleware@2.0.7: @@ -16616,7 +17004,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-middleware@3.0.11: @@ -16656,7 +17044,7 @@ packages: '@smithy/util-buffer-from': 2.0.0 '@smithy/util-hex-encoding': 2.0.0 '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-stream@3.3.2: @@ -16670,21 +17058,21 @@ packages: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-uri-escape@2.0.0: resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-uri-escape@3.0.0: resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-utf8@2.0.2: @@ -16975,6 +17363,12 @@ packages: dependencies: tslib: 2.4.1 + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: false + /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: @@ -17027,49 +17421,184 @@ packages: zod: 3.23.8 dev: false - /@t3-oss/env-nextjs@0.10.1(typescript@5.5.4)(zod@3.23.8): - resolution: {integrity: sha512-iy2qqJLnFh1RjEWno2ZeyTu0ufomkXruUsOZludzDIroUabVvHsrSjtkHqwHp1/pgPUzN3yBRHMILW162X7x2Q==} - peerDependencies: - typescript: '>=5.0.0' - zod: ^3.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@t3-oss/env-core': 0.10.1(typescript@5.5.4)(zod@3.23.8) - typescript: 5.5.4 - zod: 3.23.8 - dev: false + /@t3-oss/env-nextjs@0.10.1(typescript@5.5.4)(zod@3.23.8): + resolution: {integrity: sha512-iy2qqJLnFh1RjEWno2ZeyTu0ufomkXruUsOZludzDIroUabVvHsrSjtkHqwHp1/pgPUzN3yBRHMILW162X7x2Q==} + peerDependencies: + typescript: '>=5.0.0' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@t3-oss/env-core': 0.10.1(typescript@5.5.4)(zod@3.23.8) + typescript: 5.5.4 + zod: 3.23.8 + dev: false + + /@tabler/icons-react@2.40.0(react@18.2.0): + resolution: {integrity: sha512-C+dDOZowFbwI3LGQP0fdua+hOPkGkW7XeMcRXTSdEKc5fD75W6zRO5nXnWivIMRKsi/Y26EDmnQo15N8JX378w==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + '@tabler/icons': 2.40.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@tabler/icons@2.40.0: + resolution: {integrity: sha512-VqKsBSX159cLFTnCzkCmGhZtSPJHNN0lM2sC4xe0HPOfPUnjiex7rDHDdut4oe4iKRecDDpwXwM9BcU6xCPlCg==} + dev: false + + /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.1): + resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} + peerDependencies: + tailwindcss: '>=3.2.0' + dependencies: + tailwindcss: 3.4.1(ts-node@10.9.1) + dev: false + + /@tailwindcss/forms@0.5.3(tailwindcss@3.4.1): + resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.1(ts-node@10.9.1) + dev: true + + /@tailwindcss/node@4.0.17: + resolution: {integrity: sha512-LIdNwcqyY7578VpofXyqjH6f+3fP4nrz7FBLki5HpzqjYfXdF2m/eW18ZfoKePtDGg90Bvvfpov9d2gy5XVCbg==} + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + tailwindcss: 4.0.17 + dev: true + + /@tailwindcss/oxide-android-arm64@4.0.17: + resolution: {integrity: sha512-3RfO0ZK64WAhop+EbHeyxGThyDr/fYhxPzDbEQjD2+v7ZhKTb2svTWy+KK+J1PHATus2/CQGAGp7pHY/8M8ugg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-darwin-arm64@4.0.17: + resolution: {integrity: sha512-e1uayxFQCCDuzTk9s8q7MC5jFN42IY7nzcr5n0Mw/AcUHwD6JaBkXnATkD924ZsHyPDvddnusIEvkgLd2CiREg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-darwin-x64@4.0.17: + resolution: {integrity: sha512-d6z7HSdOKfXQ0HPlVx1jduUf/YtBuCCtEDIEFeBCzgRRtDsUuRtofPqxIVaSCUTOk5+OfRLonje6n9dF6AH8wQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-freebsd-x64@4.0.17: + resolution: {integrity: sha512-EjrVa6lx3wzXz3l5MsdOGtYIsRjgs5Mru6lDv4RuiXpguWeOb3UzGJ7vw7PEzcFadKNvNslEQqoAABeMezprxQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm-gnueabihf@4.0.17: + resolution: {integrity: sha512-65zXfCOdi8wuaY0Ye6qMR5LAXokHYtrGvo9t/NmxvSZtCCitXV/gzJ/WP5ksXPhff1SV5rov0S+ZIZU+/4eyCQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm64-gnu@4.0.17: + resolution: {integrity: sha512-+aaq6hJ8ioTdbJV5IA1WjWgLmun4T7eYLTvJIToiXLHy5JzUERRbIZjAcjgK9qXMwnvuu7rqpxzej+hGoEcG5g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-arm64-musl@4.0.17: + resolution: {integrity: sha512-/FhWgZCdUGAeYHYnZKekiOC0aXFiBIoNCA0bwzkICiMYS5Rtx2KxFfMUXQVnl4uZRblG5ypt5vpPhVaXgGk80w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tailwindcss/oxide-linux-x64-gnu@4.0.17: + resolution: {integrity: sha512-gELJzOHK6GDoIpm/539Golvk+QWZjxQcbkKq9eB2kzNkOvrP0xc5UPgO9bIMNt1M48mO8ZeNenCMGt6tfkvVBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@tabler/icons-react@2.40.0(react@18.2.0): - resolution: {integrity: sha512-C+dDOZowFbwI3LGQP0fdua+hOPkGkW7XeMcRXTSdEKc5fD75W6zRO5nXnWivIMRKsi/Y26EDmnQo15N8JX378w==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - dependencies: - '@tabler/icons': 2.40.0 - prop-types: 15.8.1 - react: 18.2.0 - dev: false + /@tailwindcss/oxide-linux-x64-musl@4.0.17: + resolution: {integrity: sha512-68NwxcJrZn94IOW4TysMIbYv5AlM6So1luTlbYUDIGnKma1yTFGBRNEJ+SacJ3PZE2rgcTBNRHX1TB4EQ/XEHw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@tabler/icons@2.40.0: - resolution: {integrity: sha512-VqKsBSX159cLFTnCzkCmGhZtSPJHNN0lM2sC4xe0HPOfPUnjiex7rDHDdut4oe4iKRecDDpwXwM9BcU6xCPlCg==} - dev: false + /@tailwindcss/oxide-win32-arm64-msvc@4.0.17: + resolution: {integrity: sha512-AkBO8efP2/7wkEXkNlXzRD4f/7WerqKHlc6PWb5v0jGbbm22DFBLbIM19IJQ3b+tNewQZa+WnPOaGm0SmwMNjw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.1): - resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} - peerDependencies: - tailwindcss: '>=3.2.0' - dependencies: - tailwindcss: 3.4.1(ts-node@10.9.1) - dev: false + /@tailwindcss/oxide-win32-x64-msvc@4.0.17: + resolution: {integrity: sha512-7/DTEvXcoWlqX0dAlcN0zlmcEu9xSermuo7VNGX9tJ3nYMdo735SHvbrHDln1+LYfF6NhJ3hjbpbjkMOAGmkDg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@tailwindcss/forms@0.5.3(tailwindcss@3.4.1): - resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + /@tailwindcss/oxide@4.0.17: + resolution: {integrity: sha512-B4OaUIRD2uVrULpAD1Yksx2+wNarQr2rQh65nXqaqbLY1jCd8fO+3KLh/+TH4Hzh2NTHQvgxVbPdUDOtLk7vAw==} + engines: {node: '>= 10'} + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.17 + '@tailwindcss/oxide-darwin-arm64': 4.0.17 + '@tailwindcss/oxide-darwin-x64': 4.0.17 + '@tailwindcss/oxide-freebsd-x64': 4.0.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.17 + '@tailwindcss/oxide-linux-x64-musl': 4.0.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.17 + dev: true + + /@tailwindcss/postcss@4.0.17: + resolution: {integrity: sha512-qeJbRTB5FMZXmuJF+eePd235EGY6IyJZF0Bh0YM6uMcCI4L9Z7dy+lPuLAhxOJzxnajsbjPoDAKOuAqZRtf1PQ==} dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.1(ts-node@10.9.1) + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.0.17 + '@tailwindcss/oxide': 4.0.17 + lightningcss: 1.29.2 + postcss: 8.4.44 + tailwindcss: 4.0.17 dev: true /@tailwindcss/typography@0.5.9(tailwindcss@3.4.1): @@ -17226,7 +17755,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/bun@1.1.6: @@ -17262,7 +17791,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/cookie@0.4.1: @@ -17278,12 +17807,12 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/d3-array@3.0.8: @@ -17418,7 +17947,7 @@ packages: /@types/fluent-ffmpeg@2.1.26: resolution: {integrity: sha512-0JVF3wdQG+pN0ImwWD0bNgJiKF2OHg/7CDBHw5UIbRTvlnkgGHK6V5doE54ltvhud4o31/dEiHm23CAlxFiUQg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/gensync@1.0.4: @@ -17444,7 +17973,7 @@ packages: /@types/interpret@1.1.3: resolution: {integrity: sha512-uBaBhj/BhilG58r64mtDb/BEdH51HIQLgP5bmWzc5qCtFMja8dCk/IOJmk36j0lbi9QHwI6sbtUNGuqXdKCAtQ==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: false /@types/invariant@2.2.37: @@ -17460,7 +17989,7 @@ packages: /@types/is-stream@1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: false /@types/js-cookie@2.2.7: @@ -17488,7 +18017,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/lodash.omit@4.5.7: @@ -17542,7 +18071,7 @@ packages: /@types/mute-stream@0.0.4: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: false /@types/node-fetch@2.6.12: @@ -17562,14 +18091,14 @@ packages: /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 form-data: 3.0.1 dev: false /@types/node-forge@1.3.10: resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: false /@types/node@12.20.55: @@ -17623,7 +18152,7 @@ packages: /@types/pg@8.11.6: resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 pg-protocol: 1.6.1 pg-types: 4.0.2 dev: false @@ -17669,6 +18198,14 @@ packages: dependencies: '@types/react': 18.2.69 + /@types/react-dom@19.0.4(@types/react@19.0.12): + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 + dependencies: + '@types/react': 19.0.12 + dev: true + /@types/react@18.2.48: resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} dependencies: @@ -17690,6 +18227,12 @@ packages: '@types/prop-types': 15.7.5 csstype: 3.1.3 + /@types/react@19.0.12: + resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} + dependencies: + csstype: 3.1.3 + dev: true + /@types/readable-stream@4.0.14: resolution: {integrity: sha512-xZn/AuUbCMShGsqH/ehZtGDwQtbx00M9rZ2ENLe4tOjFZ/JFeWMhEZkk2fEe1jAUqqEAURIkFJ7Az/go8mM1/w==} dependencies: @@ -17705,7 +18248,7 @@ packages: resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: '@types/caseless': 0.12.5 - '@types/node': 18.19.20 + '@types/node': 20.14.14 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 dev: false @@ -17717,7 +18260,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/retry@0.12.0: @@ -17752,7 +18295,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/shimmer@1.0.2: @@ -17775,13 +18318,13 @@ packages: /@types/ssh2-streams@0.1.12: resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 '@types/ssh2-streams': 0.1.12 dev: true @@ -17806,7 +18349,7 @@ packages: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 18.19.20 + '@types/node': 20.14.14 form-data: 4.0.0 dev: true @@ -17849,7 +18392,7 @@ packages: /@types/webpack@5.28.5(@swc/core@1.3.101)(esbuild@0.19.11): resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 tapable: 2.2.1 webpack: 5.88.2(@swc/core@1.3.101)(esbuild@0.19.11) transitivePeerDependencies: @@ -17866,7 +18409,7 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 /@types/ws@8.5.12: resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} @@ -18951,6 +19494,26 @@ packages: zod-to-json-schema: 3.23.5(zod@3.23.8) dev: true + /ai@4.2.5(react@19.0.0)(zod@3.23.8): + resolution: {integrity: sha512-URJEslI3cgF/atdTJHtz+Sj0W1JTmiGmD3znw9KensL3qV605odktDim+GTazNJFPR4QaIu1lUio5b8RymvOjA==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + '@ai-sdk/react': 1.2.2(react@19.0.0)(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.1(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + react: 19.0.0 + zod: 3.23.8 + dev: false + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -19333,7 +19896,7 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /astral-regex@2.0.0: @@ -20015,7 +20578,7 @@ packages: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: debug: 4.4.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - supports-color dev: false @@ -20266,6 +20829,12 @@ packages: clsx: 2.0.0 dev: false + /class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + dependencies: + clsx: 2.1.1 + dev: false + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -20453,6 +21022,16 @@ packages: color-string: 1.9.1 dev: false + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + requiresBuild: true + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + optional: true + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -21327,6 +21906,10 @@ packages: hasBin: true dev: true + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -21683,6 +22266,14 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 + /enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -24570,7 +25161,7 @@ packages: '@formatjs/ecma402-abstract': 1.18.0 '@formatjs/fast-memoize': 2.2.0 '@formatjs/icu-messageformat-parser': 2.7.3 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /intl-parse-accept-language@1.0.0: @@ -25069,7 +25660,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -25082,6 +25673,11 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + /jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + dev: true + /joi@17.7.0: resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==} dependencies: @@ -25385,102 +25981,210 @@ packages: dev: true optional: true - /lefthook-darwin-x64@1.11.3: - resolution: {integrity: sha512-z/Wp7UMjE1Vyl+x9sjN3NvN6qKdwgHl+cDf98MKKDg/WyPE5XnzqLm9rLLJgImjyClfH7ptTfZxEyhTG3M3XvQ==} + /lefthook-darwin-x64@1.11.3: + resolution: {integrity: sha512-z/Wp7UMjE1Vyl+x9sjN3NvN6qKdwgHl+cDf98MKKDg/WyPE5XnzqLm9rLLJgImjyClfH7ptTfZxEyhTG3M3XvQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lefthook-freebsd-arm64@1.11.3: + resolution: {integrity: sha512-QevwQ7lrv5wBCkk7LLTzT5KR3Bk/5nttSxT1UH2o0EsgirS/c2K5xSgQmV6m3CiZYuCe2Pja4BSIwN3zt17SMw==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-freebsd-x64@1.11.3: + resolution: {integrity: sha512-PYbcyNgdJJ4J2pEO9Ss4oYo5yq4vmQGTKm3RTYbRx4viSWR65hvKCP0C4LnIqspMvmR05SJi2bqe7UBP2t60EA==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-linux-arm64@1.11.3: + resolution: {integrity: sha512-0pBMBAoafOAEg345eOPozsmRjWR0zCr6k+m5ZxwRBZbZx1bQFDqBakQ3TpFCphhcykmgFyaa1KeZJZUOrEsezA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lefthook-linux-x64@1.11.3: + resolution: {integrity: sha512-eiezheZ/bisBCMB2Ur0mctug/RDFyu39B5wzoE8y4z0W1yw6jHGrWMJ4Y8+5qKZ7fmdZg+7YPuMHZ2eFxOnhQA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lefthook-openbsd-arm64@1.11.3: + resolution: {integrity: sha512-DRLTzXdtCj/TizpLcGSqXcnrqvgxeXgn/6nqzclIGqNdKCsNXDzpI0D3sP13Vwwmyoqv2etoTak2IHqZiXZDqg==} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-openbsd-x64@1.11.3: + resolution: {integrity: sha512-l7om+ZjWpYrVZyDuElwnucZhEqa7YfwlRaKBenkBxEh2zMje8O6Zodeuma1KmyDbSFvnvEjARo/Ejiot4gLXEw==} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /lefthook-windows-arm64@1.11.3: + resolution: {integrity: sha512-X0iTrql2gfPAkU2dzRwuHWgW5RcqCPbzJtKQ41X6Y/F7iQacRknmuYUGyC81funSvzGAsvlusMVLUvaFjIKnbA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lefthook-windows-x64@1.11.3: + resolution: {integrity: sha512-F+ORMn6YJXoS0EXU5LtN1FgV4QX9rC9LucZEkRmK6sKmS7hcb9IHpyb7siRGytArYzJvXVjPbxPBNSBdN4egZQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lefthook@1.11.3: + resolution: {integrity: sha512-HJp37y62j3j8qzAOODWuUJl4ysLwsDvCTBV6odr3jIRHR/a5e+tI14VQGIBcpK9ysqC3pGWyW5Rp9Jv1YDubyw==} + hasBin: true + requiresBuild: true + optionalDependencies: + lefthook-darwin-arm64: 1.11.3 + lefthook-darwin-x64: 1.11.3 + lefthook-freebsd-arm64: 1.11.3 + lefthook-freebsd-x64: 1.11.3 + lefthook-linux-arm64: 1.11.3 + lefthook-linux-x64: 1.11.3 + lefthook-openbsd-arm64: 1.11.3 + lefthook-openbsd-x64: 1.11.3 + lefthook-windows-arm64: 1.11.3 + lefthook-windows-x64: 1.11.3 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /lefthook-freebsd-arm64@1.11.3: - resolution: {integrity: sha512-QevwQ7lrv5wBCkk7LLTzT5KR3Bk/5nttSxT1UH2o0EsgirS/c2K5xSgQmV6m3CiZYuCe2Pja4BSIwN3zt17SMw==} - cpu: [arm64] + /lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] os: [freebsd] requiresBuild: true dev: true optional: true - /lefthook-freebsd-x64@1.11.3: - resolution: {integrity: sha512-PYbcyNgdJJ4J2pEO9Ss4oYo5yq4vmQGTKm3RTYbRx4viSWR65hvKCP0C4LnIqspMvmR05SJi2bqe7UBP2t60EA==} - cpu: [x64] - os: [freebsd] + /lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] requiresBuild: true dev: true optional: true - /lefthook-linux-arm64@1.11.3: - resolution: {integrity: sha512-0pBMBAoafOAEg345eOPozsmRjWR0zCr6k+m5ZxwRBZbZx1bQFDqBakQ3TpFCphhcykmgFyaa1KeZJZUOrEsezA==} + /lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /lefthook-linux-x64@1.11.3: - resolution: {integrity: sha512-eiezheZ/bisBCMB2Ur0mctug/RDFyu39B5wzoE8y4z0W1yw6jHGrWMJ4Y8+5qKZ7fmdZg+7YPuMHZ2eFxOnhQA==} - cpu: [x64] + /lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /lefthook-openbsd-arm64@1.11.3: - resolution: {integrity: sha512-DRLTzXdtCj/TizpLcGSqXcnrqvgxeXgn/6nqzclIGqNdKCsNXDzpI0D3sP13Vwwmyoqv2etoTak2IHqZiXZDqg==} - cpu: [arm64] - os: [openbsd] + /lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] requiresBuild: true dev: true optional: true - /lefthook-openbsd-x64@1.11.3: - resolution: {integrity: sha512-l7om+ZjWpYrVZyDuElwnucZhEqa7YfwlRaKBenkBxEh2zMje8O6Zodeuma1KmyDbSFvnvEjARo/Ejiot4gLXEw==} + /lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} cpu: [x64] - os: [openbsd] + os: [linux] requiresBuild: true dev: true optional: true - /lefthook-windows-arm64@1.11.3: - resolution: {integrity: sha512-X0iTrql2gfPAkU2dzRwuHWgW5RcqCPbzJtKQ41X6Y/F7iQacRknmuYUGyC81funSvzGAsvlusMVLUvaFjIKnbA==} + /lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /lefthook-windows-x64@1.11.3: - resolution: {integrity: sha512-F+ORMn6YJXoS0EXU5LtN1FgV4QX9rC9LucZEkRmK6sKmS7hcb9IHpyb7siRGytArYzJvXVjPbxPBNSBdN4egZQ==} + /lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /lefthook@1.11.3: - resolution: {integrity: sha512-HJp37y62j3j8qzAOODWuUJl4ysLwsDvCTBV6odr3jIRHR/a5e+tI14VQGIBcpK9ysqC3pGWyW5Rp9Jv1YDubyw==} - hasBin: true - requiresBuild: true + /lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 2.0.3 optionalDependencies: - lefthook-darwin-arm64: 1.11.3 - lefthook-darwin-x64: 1.11.3 - lefthook-freebsd-arm64: 1.11.3 - lefthook-freebsd-x64: 1.11.3 - lefthook-linux-arm64: 1.11.3 - lefthook-linux-x64: 1.11.3 - lefthook-openbsd-arm64: 1.11.3 - lefthook-openbsd-x64: 1.11.3 - lefthook-windows-arm64: 1.11.3 - lefthook-windows-x64: 1.11.3 + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -25748,6 +26452,14 @@ packages: react: 18.3.1 dev: false + /lucide-react@0.484.0(react@19.0.0): + resolution: {integrity: sha512-oZy8coK9kZzvqhSgfbGkPtTgyjpBvs3ukLgDPv14dSOZtBtboryWF5o8i3qen7QbGg7JhiJBz5mK1p8YoMZTLQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 19.0.0 + dev: false + /luxon@3.2.1: resolution: {integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==} engines: {node: '>=12'} @@ -26771,6 +27483,12 @@ packages: stylis: 4.3.0 dev: false + /nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -26960,6 +27678,52 @@ packages: - babel-plugin-macros dev: false + /next@15.2.4(@playwright/test@1.37.0)(react-dom@19.0.0)(react@19.0.0): + resolution: {integrity: sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.2.4 + '@playwright/test': 1.37.0 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001699 + postcss: 8.4.31 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.2.4 + '@next/swc-darwin-x64': 15.2.4 + '@next/swc-linux-arm64-gnu': 15.2.4 + '@next/swc-linux-arm64-musl': 15.2.4 + '@next/swc-linux-x64-gnu': 15.2.4 + '@next/swc-linux-x64-musl': 15.2.4 + '@next/swc-win32-arm64-msvc': 15.2.4 + '@next/swc-win32-x64-msvc': 15.2.4 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -28687,7 +29451,7 @@ packages: react: '>=16.0.0' dependencies: '@types/prismjs': 1.26.0 - clsx: 2.1.0 + clsx: 2.1.1 react: 18.2.0 dev: false @@ -29180,6 +29944,15 @@ packages: scheduler: 0.23.0 dev: false + /react-dom@19.0.0(react@19.0.0): + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + dev: false + /react-dom@19.0.0-rc.1(react@19.0.0-rc.1): resolution: {integrity: sha512-k8MfDX+4G+eaa1cXXI9QF4d+pQtYol3nx8vauqRWUEOPqC7NQn2qmEqUsLoSd28rrZUL+R3T2VC+kZ2Hyx1geQ==} peerDependencies: @@ -29350,7 +30123,7 @@ packages: '@types/react': 18.2.69 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.69)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-remove-scroll-bar@2.3.4(@types/react@18.3.1)(react@18.3.1): @@ -29366,7 +30139,7 @@ packages: '@types/react': 18.3.1 react: 18.3.1 react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-remove-scroll@2.5.5(@types/react@18.2.69)(react@18.2.0): @@ -29383,7 +30156,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.69)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.69)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.1 use-callback-ref: 1.3.0(@types/react@18.2.69)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.69)(react@18.2.0) dev: false @@ -29402,7 +30175,7 @@ packages: react: 18.3.1 react-remove-scroll-bar: 2.3.4(@types/react@18.3.1)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) - tslib: 2.6.2 + tslib: 2.8.1 use-callback-ref: 1.3.0(@types/react@18.3.1)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) dev: false @@ -29496,7 +30269,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-style-singleton@2.2.1(@types/react@18.3.1)(react@18.3.1): @@ -29513,7 +30286,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): @@ -29598,6 +30371,11 @@ packages: dependencies: loose-envify: 1.4.0 + /react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + dev: false + /react@19.0.0-rc.0: resolution: {integrity: sha512-8nrDCl5uE54FHeKqKrEO0TS+10bT4cxutJGb2okiJc0FHMQ6I3FeItaqly/1nbijlhSO3HmAVyPIexIQQWYAtQ==} engines: {node: '>=0.10.0'} @@ -29709,7 +30487,7 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - clsx: 2.0.0 + clsx: 2.1.1 eventemitter3: 4.0.7 lodash: 4.17.21 react: 18.2.0 @@ -30404,6 +31182,10 @@ packages: dependencies: loose-envify: 1.4.0 + /scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + dev: false + /scheduler@0.25.0-rc.1: resolution: {integrity: sha512-fVinv2lXqYpKConAMdergOl5owd0rY1O4P/QTe0aWKCqGtu7VsCt1iqQFxSJtqK4Lci/upVSBpGwVC7eWcuS9Q==} dev: false @@ -30592,6 +31374,37 @@ packages: safe-buffer: 5.2.1 dev: false + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + optional: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -31317,7 +32130,7 @@ packages: resolution: {integrity: sha512-cYjgBM2SY/dTm8Lr6eMyyONaHTZHA/QjHxFUIW5WH8FevSRIGAVtXEmBkUXF1fsqe7QvvRgQSGSJZmjDacegGg==} engines: {node: '>=12.*'} dependencies: - '@types/node': 18.19.20 + '@types/node': 20.14.14 qs: 6.11.0 dev: false @@ -31379,6 +32192,23 @@ packages: react: 18.3.1 dev: false + /styled-jsx@5.1.6(react@19.0.0): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 19.0.0 + dev: false + /stylis@4.3.0: resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} dev: false @@ -31522,6 +32352,16 @@ packages: react: 18.3.1 use-sync-external-store: 1.2.2(react@18.3.1) + /swr@2.2.5(react@19.0.0): + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + dependencies: + client-only: 0.0.1 + react: 19.0.0 + use-sync-external-store: 1.2.2(react@19.0.0) + dev: false + /swr@2.2.5(react@19.0.0-rc.0): resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} peerDependencies: @@ -31576,6 +32416,10 @@ packages: resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==} dev: false + /tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + dev: false + /tailwind-scrollbar-hide@1.1.7: resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==} dev: false @@ -31701,6 +32545,10 @@ packages: transitivePeerDependencies: - ts-node + /tailwindcss@4.0.17: + resolution: {integrity: sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==} + dev: true + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -32390,6 +33238,9 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + /tsup@8.4.0(postcss@8.4.44)(tsx@4.17.0)(typescript@5.5.4): resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} @@ -32558,6 +33409,10 @@ packages: turbo-windows-arm64: 1.10.3 dev: true + /tw-animate-css@1.2.4: + resolution: {integrity: sha512-yt+HkJB41NAvOffe4NweJU6fLqAlVx/mBX6XmHRp15kq0JxTtOKaIw8pVSWM1Z+n2nXtyi7cW6C9f0WG/F/QAQ==} + dev: false + /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -33106,7 +33961,7 @@ packages: dependencies: '@types/react': 18.2.69 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-callback-ref@1.3.0(@types/react@18.3.1)(react@18.3.1): @@ -33121,7 +33976,7 @@ packages: dependencies: '@types/react': 18.3.1 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.69)(react@18.2.0): @@ -33150,7 +34005,7 @@ packages: '@types/react': 18.2.69 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-sidecar@1.1.2(@types/react@18.3.1)(react@18.3.1): @@ -33166,7 +34021,7 @@ packages: '@types/react': 18.3.1 detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-sync-external-store@1.2.2(react@18.2.0): @@ -33184,6 +34039,14 @@ packages: dependencies: react: 18.3.1 + /use-sync-external-store@1.2.2(react@19.0.0): + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 19.0.0 + dev: false + /use-sync-external-store@1.2.2(react@19.0.0-rc.0): resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -33337,30 +34200,6 @@ packages: d3-timer: 3.0.1 dev: false - /vite-node@0.28.5(@types/node@18.19.20): - resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.4.0 - mlly: 1.7.1 - pathe: 1.1.2 - picocolors: 1.1.1 - source-map: 0.6.1 - source-map-support: 0.5.21 - vite: 4.4.9(@types/node@18.19.20) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite-node@0.28.5(@types/node@20.14.14): resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} @@ -33480,40 +34319,6 @@ packages: - typescript dev: true - /vite@4.1.4(@types/node@18.19.20): - resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.19.20 - esbuild: 0.16.17 - postcss: 8.4.44 - resolve: 1.22.8 - rollup: 3.10.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.1.4(@types/node@20.14.14): resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -33548,42 +34353,6 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.4.9(@types/node@18.19.20): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.19.20 - esbuild: 0.18.11 - postcss: 8.4.44 - rollup: 3.29.1 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.4.9(@types/node@20.14.14): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -33680,7 +34449,7 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 18.19.20 + '@types/node': 20.14.14 '@vitest/expect': 0.28.5 '@vitest/runner': 0.28.5 '@vitest/spy': 0.28.5 @@ -33699,8 +34468,8 @@ packages: tinybench: 2.3.1 tinypool: 0.3.1 tinyspy: 1.0.2 - vite: 4.1.4(@types/node@18.19.20) - vite-node: 0.28.5(@types/node@18.19.20) + vite: 4.1.4(@types/node@20.14.14) + vite-node: 0.28.5(@types/node@20.14.14) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/references/agent-loop/.gitignore b/references/agent-loop/.gitignore new file mode 100644 index 0000000000..5ef6a52078 --- /dev/null +++ b/references/agent-loop/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/references/agent-loop/README.md b/references/agent-loop/README.md new file mode 100644 index 0000000000..e215bc4ccf --- /dev/null +++ b/references/agent-loop/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/references/agent-loop/components.json b/references/agent-loop/components.json new file mode 100644 index 0000000000..ffe928f5b6 --- /dev/null +++ b/references/agent-loop/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/references/agent-loop/next.config.ts b/references/agent-loop/next.config.ts new file mode 100644 index 0000000000..e9ffa3083a --- /dev/null +++ b/references/agent-loop/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/references/agent-loop/package.json b/references/agent-loop/package.json new file mode 100644 index 0000000000..ade8dc4d25 --- /dev/null +++ b/references/agent-loop/package.json @@ -0,0 +1,37 @@ +{ + "name": "references-agent-loop", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "dev:trigger": "trigger dev", + "deploy": "trigger deploy" + }, + "dependencies": { + "@ai-sdk/openai": "1.3.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.484.0", + "next": "15.2.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^3.0.2", + "tw-animate-css": "^1.2.4", + "@trigger.dev/react-hooks": "workspace:*", + "@trigger.dev/sdk": "workspace:*", + "ai": "4.2.5", + "zod": "3.23.8" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4.0.17", + "typescript": "^5", + "trigger.dev": "workspace:*" + } +} \ No newline at end of file diff --git a/references/agent-loop/postcss.config.mjs b/references/agent-loop/postcss.config.mjs new file mode 100644 index 0000000000..c7bcb4b1ee --- /dev/null +++ b/references/agent-loop/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/references/agent-loop/public/file.svg b/references/agent-loop/public/file.svg new file mode 100644 index 0000000000..004145cddf --- /dev/null +++ b/references/agent-loop/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/agent-loop/public/globe.svg b/references/agent-loop/public/globe.svg new file mode 100644 index 0000000000..567f17b0d7 --- /dev/null +++ b/references/agent-loop/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/agent-loop/public/next.svg b/references/agent-loop/public/next.svg new file mode 100644 index 0000000000..5174b28c56 --- /dev/null +++ b/references/agent-loop/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/agent-loop/public/vercel.svg b/references/agent-loop/public/vercel.svg new file mode 100644 index 0000000000..7705396033 --- /dev/null +++ b/references/agent-loop/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/agent-loop/public/window.svg b/references/agent-loop/public/window.svg new file mode 100644 index 0000000000..b2b2a44f6e --- /dev/null +++ b/references/agent-loop/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/agent-loop/src/app/favicon.ico b/references/agent-loop/src/app/favicon.ico new file mode 100644 index 0000000000..718d6fea48 Binary files /dev/null and b/references/agent-loop/src/app/favicon.ico differ diff --git a/references/agent-loop/src/app/globals.css b/references/agent-loop/src/app/globals.css new file mode 100644 index 0000000000..dc98be74c4 --- /dev/null +++ b/references/agent-loop/src/app/globals.css @@ -0,0 +1,122 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/references/agent-loop/src/app/layout.tsx b/references/agent-loop/src/app/layout.tsx new file mode 100644 index 0000000000..f7fa87eb87 --- /dev/null +++ b/references/agent-loop/src/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/references/agent-loop/src/app/page.tsx b/references/agent-loop/src/app/page.tsx new file mode 100644 index 0000000000..058c75c9f1 --- /dev/null +++ b/references/agent-loop/src/app/page.tsx @@ -0,0 +1,8 @@ +import MainApp from "@/components/main-app"; +import { auth } from "@trigger.dev/sdk"; + +export default async function Home() { + const publicAccessToken = await auth.createTriggerPublicToken("agent-loop-example"); + + return ; +} diff --git a/references/agent-loop/src/components/chat-interface.tsx b/references/agent-loop/src/components/chat-interface.tsx new file mode 100644 index 0000000000..75f2cc5b35 --- /dev/null +++ b/references/agent-loop/src/components/chat-interface.tsx @@ -0,0 +1,32 @@ +import { cn } from "@/lib/utils" + +interface Message { + role: "user" | "assistant" + content: string +} + +interface ChatInterfaceProps { + messages: Message[] +} + +export default function ChatInterface({ messages }: ChatInterfaceProps) { + return ( +
+ {messages.map((message, index) => ( +
+
+ {message.content} +
+
+ ))} +
+ ) +} + diff --git a/references/agent-loop/src/components/initial-prompt.tsx b/references/agent-loop/src/components/initial-prompt.tsx new file mode 100644 index 0000000000..bf76b6ff18 --- /dev/null +++ b/references/agent-loop/src/components/initial-prompt.tsx @@ -0,0 +1,15 @@ +export default function InitialPrompt() { + return ( +
+

Welcome to the Chatbot

+

Start a conversation by typing a message below.

+
+ 💬 +
+

+ This is a simulated chatbot interface. Your messages will receive automated responses. +

+
+ ) +} + diff --git a/references/agent-loop/src/components/main-app.tsx b/references/agent-loop/src/components/main-app.tsx new file mode 100644 index 0000000000..210daf724d --- /dev/null +++ b/references/agent-loop/src/components/main-app.tsx @@ -0,0 +1,131 @@ +"use client"; + +import type React from "react"; + +import { useState } from "react"; +import { Send } from "lucide-react"; +import ChatInterface from "@/components/chat-interface"; +import InitialPrompt from "@/components/initial-prompt"; +import { useRealtimeTaskTriggerWithStreams, useWaitToken } from "@trigger.dev/react-hooks"; +import type { agentLoopExample } from "@/trigger/agent"; +import { AgentLoopMetadata } from "@/trigger/schemas"; +import type { TextStreamPart } from "ai"; + +type ChatConversation = Array<{ role: "user" | "assistant"; content: string }>; + +type ResponseStreams = { + [K in `responses.${number | string}`]: TextStreamPart<{}>; +}; + +export function useAgentLoop({ publicAccessToken }: { publicAccessToken: string }) { + const triggerInstance = useRealtimeTaskTriggerWithStreams< + typeof agentLoopExample, + ResponseStreams + >("agent-loop-example", { + accessToken: publicAccessToken, + baseURL: process.env.NEXT_PUBLIC_TRIGGER_API_URL, + }); + const [conversation, setConversation] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [waitToken, setWaitToken] = useState(null); + + const waitTokenInstance = useWaitToken(waitToken?.waitToken.id, { + enabled: !!waitToken?.waitToken.id, + accessToken: waitToken?.waitToken.publicAccessToken, + baseURL: process.env.NEXT_PUBLIC_TRIGGER_API_URL, + }); + + const waitTokenStream = waitToken?.waitToken.id + ? triggerInstance.streams[`responses.${waitToken?.waitToken.id}`] + : undefined; + + const textStream = waitTokenStream + ?.map((part) => { + if (part.type === "text-delta") { + return part.textDelta; + } + }) + .join(""); + + console.log("textStream", textStream); + + if (triggerInstance.run) { + console.log("run", triggerInstance.run); + + const metadata = AgentLoopMetadata.safeParse(triggerInstance.run.metadata); + + if (!metadata.success) { + console.error("Failed to parse metadata", metadata.error); + } else { + console.log("metadata", metadata.data); + + setWaitToken(metadata.data); + } + } + + return { + continueConversation: (prompt: string) => { + if (waitTokenInstance.isReady) { + waitTokenInstance.complete({ + message: prompt, + }); + } else { + const result = triggerInstance.submit({ + model: "gpt-4o-mini", + prompt, + }); + + setConversation((prev) => [...prev, { role: "user", content: prompt }]); + + return result; + } + }, + conversation, + isLoading, + }; +} + +export default function MainApp({ publicAccessToken }: { publicAccessToken: string }) { + const { continueConversation, conversation, isLoading } = useAgentLoop({ publicAccessToken }); + const [input, setInput] = useState(""); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + if (!input.trim()) return; + + continueConversation(input); + setInput(""); + }; + + return ( +
+
+
+ {conversation.length === 0 ? ( + + ) : ( + + )} +
+ +
+ setInput(e.target.value)} + placeholder="Type a message..." + className="flex-1 p-3 rounded-lg border border-gray-300 focus:outline-none focus:ring-2 focus:ring-primary" + /> + +
+
+
+ ); +} diff --git a/references/agent-loop/src/lib/utils.ts b/references/agent-loop/src/lib/utils.ts new file mode 100644 index 0000000000..bd0c391ddd --- /dev/null +++ b/references/agent-loop/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/references/agent-loop/src/trigger/agent.ts b/references/agent-loop/src/trigger/agent.ts new file mode 100644 index 0000000000..ef59f5bee6 --- /dev/null +++ b/references/agent-loop/src/trigger/agent.ts @@ -0,0 +1,98 @@ +import { openai } from "@ai-sdk/openai"; +import { CompleteTaskWithOutput, logger, metadata, schemaTask, wait } from "@trigger.dev/sdk/v3"; +import { CoreMessage, streamText } from "ai"; +import { z } from "zod"; + +const MAX_STEPS = 10; + +export const agentLoopExample = schemaTask({ + id: "agent-loop-example", + description: "Agent loop example", + schema: z.object({ + model: z.string().default("chatgpt-4o-latest"), + prompt: z.string().default("Hello, how are you?"), + }), + run: async ({ model, prompt }) => { + const aiModel = openai(model); + + let messages: CoreMessage[] = [ + { + role: "system", + content: + "You are a helpful assistant that can answer questions and help with tasks. Please be very concise and to the point.", + }, + { + role: "user", + content: prompt, + }, + ]; + + let step = 0; + + while (step < MAX_STEPS) { + step++; + + await logger.trace( + `Step ${step}`, + async (span) => { + // This token will expire in 1 day + const token = await wait.createToken({ timeout: "1d" }); + + metadata.set("waitToken", token); + await metadata.flush(); + + const result = streamText({ + model: aiModel, + messages, + experimental_telemetry: { + isEnabled: true, + }, + }); + + logger.info("Received result from streamText"); + + const stream = await metadata.stream(`responses.${token.id}`, result.fullStream); + + logger.info("Gathering the text from the stream"); + + let assistantResponse = ""; + + for await (const chunk of stream) { + if (chunk.type === "text-delta") { + assistantResponse += chunk.textDelta; + } + } + + logger.info("Assistant response", { assistantResponse }); + + messages.push({ + role: "assistant", + content: assistantResponse, + }); + + // Now wait for the next message + const nextMessage = await wait.forToken<{ message: string }>(token); + + if (nextMessage.ok) { + logger.info("Next message", { nextMessage: nextMessage.output.message }); + + messages.push({ + role: "user", + content: nextMessage.output.message, + }); + } else { + logger.info("No next message", { nextMessage }); + + throw new CompleteTaskWithOutput({ waitpoint: token.id }); + } + }, + { + attributes: { + step, + }, + icon: "tabler-repeat", + } + ); + } + }, +}); diff --git a/references/agent-loop/src/trigger/schemas.ts b/references/agent-loop/src/trigger/schemas.ts new file mode 100644 index 0000000000..bc45de5d15 --- /dev/null +++ b/references/agent-loop/src/trigger/schemas.ts @@ -0,0 +1,10 @@ +import { z } from "zod"; + +export const AgentLoopMetadata = z.object({ + waitToken: z.object({ + id: z.string(), + publicAccessToken: z.string(), + }), +}); + +export type AgentLoopMetadata = z.infer; diff --git a/references/agent-loop/tailwind.config.ts b/references/agent-loop/tailwind.config.ts new file mode 100644 index 0000000000..555f65867f --- /dev/null +++ b/references/agent-loop/tailwind.config.ts @@ -0,0 +1,81 @@ +import type { Config } from "tailwindcss" + +const config: Config = { + darkMode: ["class"], + content: [ + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", + "*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [], +} + +export default config + diff --git a/references/agent-loop/trigger.config.ts b/references/agent-loop/trigger.config.ts new file mode 100644 index 0000000000..2e6be88c9f --- /dev/null +++ b/references/agent-loop/trigger.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "@trigger.dev/sdk"; + +export default defineConfig({ + project: "proj_hgknlxlflfcemqogujnt", + dirs: ["./src/trigger"], + maxDuration: 3600, +}); diff --git a/references/agent-loop/tsconfig.json b/references/agent-loop/tsconfig.json new file mode 100644 index 0000000000..c1334095f8 --- /dev/null +++ b/references/agent-loop/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/references/hello-world/src/trigger/waits.ts b/references/hello-world/src/trigger/waits.ts index 0617d58a7d..675b852aa6 100644 --- a/references/hello-world/src/trigger/waits.ts +++ b/references/hello-world/src/trigger/waits.ts @@ -1,4 +1,4 @@ -import { logger, wait, task, retry, idempotencyKeys } from "@trigger.dev/sdk/v3"; +import { logger, wait, task, retry, idempotencyKeys, auth } from "@trigger.dev/sdk/v3"; type Token = { status: "approved" | "pending" | "rejected"; @@ -8,6 +8,7 @@ export const waitToken = task({ id: "wait-token", run: async ({ completeBeforeWaiting = false, + completeWithPublicToken = false, idempotencyKey, idempotencyKeyTTL, completionDelay, @@ -15,6 +16,7 @@ export const waitToken = task({ tags, }: { completeBeforeWaiting?: boolean; + completeWithPublicToken?: boolean; idempotencyKey?: string; idempotencyKeyTTL?: string; completionDelay?: number; @@ -39,8 +41,29 @@ export const waitToken = task({ }); logger.log("Token2", token2); + const publicAccessToken = await auth.createPublicToken({ + scopes: { + write: { + waitpoints: token.id, + }, + }, + expirationTime: "1h", + }); + if (completeBeforeWaiting) { - await wait.completeToken(token.id, { status: "approved" }); + if (completeWithPublicToken) { + await auth.withAuth( + { + accessToken: token.publicAccessToken, + }, + async () => { + await wait.completeToken(token.id, { status: "approved" }); + } + ); + } else { + await wait.completeToken(token.id, { status: "approved" }); + } + await wait.for({ seconds: 5 }); } else { await completeWaitToken.trigger({ token: token.id, delay: completionDelay });