From 8b976e415bd719b38d962b472d47711b6f8d9004 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 7 Oct 2025 14:30:54 +0800 Subject: [PATCH 01/25] bruh --- apps/effect-cluster/Dockerfile | 24 + .../package.json | 12 +- apps/effect-cluster/src/health-check.ts | 27 + .../index.ts => effect-cluster/src/runner.ts} | 46 +- .../src/shard-manager.ts} | 0 apps/effect-cluster/tsconfig.json | 0 apps/effect-cluster/tsdown.config.ts | 6 + apps/web/app/api/[[...route]]/route.ts | 13 + apps/web/instrumentation.node.ts | 47 +- apps/web/lib/server.ts | 47 +- apps/web/next.config.mjs | 1 + apps/workflow-manager/package.json | 15 - infra/package.json | 2 +- infra/sst-env.d.ts | 15 +- infra/sst.config.ts | 117 +- package.json | 2 +- packages/config/base.tsconfig.json | 3 +- packages/web-backend/src/Auth.ts | 8 +- packages/web-backend/src/Database.ts | 8 +- packages/web-backend/src/Folders/index.ts | 3 +- packages/web-backend/src/Http/Errors.ts | 14 + packages/web-backend/src/Http/Live.ts | 9 + packages/web-backend/src/Loom/Http.ts | 40 + packages/web-backend/src/Loom/ImportVideo.ts | 123 +- packages/web-backend/src/Loom/index.ts | 2 +- .../src/S3Buckets/S3BucketAccess.ts | 7 +- packages/web-backend/src/S3Buckets/index.ts | 10 +- packages/web-backend/src/Workflows.ts | 5 +- packages/web-backend/src/index.ts | 1 + packages/web-domain/package.json | 6 + .../web-domain/scripts/generate-openapi.ts | 16 + packages/web-domain/src/Database.ts | 6 + packages/web-domain/src/Http/Api.ts | 12 + packages/web-domain/src/Http/Errors.ts | 8 + packages/web-domain/src/Http/index.ts | 2 + packages/web-domain/src/Loom.ts | 94 +- packages/web-domain/src/Policy.ts | 2 + packages/web-domain/src/S3Bucket.ts | 6 +- packages/web-domain/src/Video.ts | 3 +- packages/web-domain/src/index.ts | 6 + packages/web-domain/tsconfig.json | 2 +- pnpm-lock.yaml | 1364 ++++++++++++----- 42 files changed, 1533 insertions(+), 601 deletions(-) create mode 100644 apps/effect-cluster/Dockerfile rename apps/{workflow-runner => effect-cluster}/package.json (65%) create mode 100644 apps/effect-cluster/src/health-check.ts rename apps/{workflow-runner/src/index.ts => effect-cluster/src/runner.ts} (60%) rename apps/{workflow-manager/src/index.ts => effect-cluster/src/shard-manager.ts} (100%) create mode 100644 apps/effect-cluster/tsconfig.json create mode 100644 apps/effect-cluster/tsdown.config.ts create mode 100644 apps/web/app/api/[[...route]]/route.ts delete mode 100644 apps/workflow-manager/package.json create mode 100644 packages/web-backend/src/Http/Errors.ts create mode 100644 packages/web-backend/src/Http/Live.ts create mode 100644 packages/web-backend/src/Loom/Http.ts create mode 100644 packages/web-domain/scripts/generate-openapi.ts create mode 100644 packages/web-domain/src/Database.ts create mode 100644 packages/web-domain/src/Http/Api.ts create mode 100644 packages/web-domain/src/Http/Errors.ts create mode 100644 packages/web-domain/src/Http/index.ts diff --git a/apps/effect-cluster/Dockerfile b/apps/effect-cluster/Dockerfile new file mode 100644 index 0000000000..5b606ec71d --- /dev/null +++ b/apps/effect-cluster/Dockerfile @@ -0,0 +1,24 @@ +FROM node:24-slim AS base +RUN corepack enable + +FROM base AS builder +WORKDIR /app +COPY . . + +RUN corepack enable pnpm +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i --frozen-lockfile + +RUN pnpm run --filter=apps/effect-cluster build + +FROM denoland/deno:2.5.3 AS runner +WORKDIR /app + +COPY --from=builder --chown=deno:deno /app/apps/effect-cluster/dist ./dist + +USER deno + +ENTRYPOINT ["deno", "run", "--allow-all"] + +EXPOSE 8080 +EXPOSE 42069 +EXPOSE 42169 diff --git a/apps/workflow-runner/package.json b/apps/effect-cluster/package.json similarity index 65% rename from apps/workflow-runner/package.json rename to apps/effect-cluster/package.json index 361a7648ab..61c2a1a6a2 100644 --- a/apps/workflow-runner/package.json +++ b/apps/effect-cluster/package.json @@ -1,8 +1,10 @@ { - "name": "@cap/workflow-runner", + "name": "@cap/effect-cluster", "type": "module", "scripts": { - "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/index.ts" + "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/index.ts", + "build": "tsdown", + "build:docker": "cd ../.. && docker build -f apps/effect-cluster/Dockerfile -t cap-effect-cluster ." }, "dependencies": { "@cap/web-backend": "workspace:*", @@ -11,11 +13,15 @@ "@effect/opentelemetry": "^0.56.1", "@effect/platform": "^0.91.1", "@effect/platform-node": "^0.96.1", + "@effect/rpc": "^0.70.0", "@effect/sql-mysql2": "^0.45.1", "@effect/workflow": "^0.10.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", - "effect": "^3.17.14" + "effect": "^3.17.14", + "rolldown": "1.0.0-beta.42", + "tsdown": "^0.15.6", + "tsup": "^8.5.0" }, "devDependencies": { "dotenv-cli": "^10.0.0" diff --git a/apps/effect-cluster/src/health-check.ts b/apps/effect-cluster/src/health-check.ts new file mode 100644 index 0000000000..e09c3d6d8f --- /dev/null +++ b/apps/effect-cluster/src/health-check.ts @@ -0,0 +1,27 @@ +async function checkHealth(): Promise { + try { + const response = await fetch( + `http://127.0.0.1:${process.env.HEALTH_CHECK_PORT}/health`, + ); + return response.status === 200; + } catch (error) { + console.error("Health check failed:", error); + return false; + } +} + +// Run the health check +checkHealth() + .then((isHealthy) => { + if (isHealthy) { + console.log("✅ Service is healthy (200 OK)"); + process.exit(0); + } else { + console.log("❌ Service is not healthy (non-200 response)"); + process.exit(1); + } + }) + .catch((error) => { + console.error("❌ Health check failed:", error); + process.exit(1); + }); diff --git a/apps/workflow-runner/src/index.ts b/apps/effect-cluster/src/runner.ts similarity index 60% rename from apps/workflow-runner/src/index.ts rename to apps/effect-cluster/src/runner.ts index 2a4a8e1121..663fa1406f 100644 --- a/apps/workflow-runner/src/index.ts +++ b/apps/effect-cluster/src/runner.ts @@ -2,12 +2,18 @@ import { createServer } from "node:http"; import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; -import { FetchHttpClient, HttpApiBuilder, HttpServer } from "@effect/platform"; +import { + FetchHttpClient, + HttpApiBuilder, + HttpMiddleware, + HttpRouter, +} from "@effect/platform"; import { NodeClusterRunnerSocket, NodeHttpServer, NodeRuntime, } from "@effect/platform-node"; +import { RpcServer } from "@effect/rpc"; import { MysqlClient } from "@effect/sql-mysql2"; import { WorkflowProxyServer } from "@effect/workflow"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; @@ -35,7 +41,16 @@ const ClusterWorkflowLive = ClusterWorkflowEngine.layer.pipe( Layer.provide(SqlLayer), ); -const WorkflowApiLive = HttpApiBuilder.api(Workflows.Api).pipe( +const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( + Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), + Layer.provide(Workflows.WorkflowsLayer), + Layer.provide(ClusterWorkflowLive), +); +const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( + Layer.provide(Workflows.RpcSerialization), +); + +const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( Layer.provide( WorkflowProxyServer.layerHttpApi( Workflows.Api, @@ -45,7 +60,6 @@ const WorkflowApiLive = HttpApiBuilder.api(Workflows.Api).pipe( ), Layer.provide(Workflows.WorkflowsLayer), Layer.provide(ClusterWorkflowLive), - HttpServer.withLogAddress, ); const TracingLayer = NodeSdk.layer(() => ({ @@ -53,14 +67,18 @@ const TracingLayer = NodeSdk.layer(() => ({ spanProcessor: [new BatchSpanProcessor(new OTLPTraceExporter({}))], })); -HttpApiBuilder.serve().pipe( - Layer.provide(WorkflowApiLive), - Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), - Layer.provide(Videos.Default), - Layer.provide(S3Buckets.Default), - Layer.provide(Database.Default), - Layer.provide(FetchHttpClient.layer), - Layer.provide(TracingLayer), - Layer.launch, - NodeRuntime.runMain, -); +const Main = HttpRouter.Default.serve(HttpMiddleware.logger) + .pipe( + Layer.provide(RpcsLive), + Layer.provide(RpcProtocol), + Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), + ) + .pipe( + Layer.provide(Videos.Default), + Layer.provide(S3Buckets.Default), + Layer.provide(Database.Default), + Layer.provide(FetchHttpClient.layer), + Layer.provide(TracingLayer), + ); + +NodeRuntime.runMain(Layer.launch(Main)); diff --git a/apps/workflow-manager/src/index.ts b/apps/effect-cluster/src/shard-manager.ts similarity index 100% rename from apps/workflow-manager/src/index.ts rename to apps/effect-cluster/src/shard-manager.ts diff --git a/apps/effect-cluster/tsconfig.json b/apps/effect-cluster/tsconfig.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/effect-cluster/tsdown.config.ts b/apps/effect-cluster/tsdown.config.ts new file mode 100644 index 0000000000..9b5e8456dd --- /dev/null +++ b/apps/effect-cluster/tsdown.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/runner.ts", "./src/shard-manager.ts"], + noExternal: [/(.*)/], +}); diff --git a/apps/web/app/api/[[...route]]/route.ts b/apps/web/app/api/[[...route]]/route.ts new file mode 100644 index 0000000000..e0e4bd7732 --- /dev/null +++ b/apps/web/app/api/[[...route]]/route.ts @@ -0,0 +1,13 @@ +import { HttpLive } from "@cap/web-backend"; +import { HttpApiScalar } from "@effect/platform"; +import { Layer } from "effect"; +import { apiToHandler } from "@/lib/server"; + +const handler = apiToHandler( + HttpApiScalar.layer({ path: "/api" }).pipe(Layer.provideMerge(HttpLive)), +); + +export const GET = handler; +export const POST = handler; +export const HEAD = handler; +export const OPTIONS = handler; diff --git a/apps/web/instrumentation.node.ts b/apps/web/instrumentation.node.ts index 4705519020..19af910785 100644 --- a/apps/web/instrumentation.node.ts +++ b/apps/web/instrumentation.node.ts @@ -14,33 +14,36 @@ import { migrate } from "drizzle-orm/mysql2/migrator"; import path from "path"; export async function register() { - console.log("Waiting 5 seconds to run migrations"); + if (process.env.NODE_ENV === "development") { + } else { + console.log("Waiting 5 seconds to run migrations"); - // Function to trigger migrations with retry logic - const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { - try { - await runMigrations(); - } catch (error) { - console.error( - `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, - error, - ); - if (retryCount < maxRetries - 1) { - console.log( - `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, + // Function to trigger migrations with retry logic + const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { + try { + await runMigrations(); + } catch (error) { + console.error( + `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, + error, ); - setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); - } else { - console.error(`🚨 All ${maxRetries} migration attempts failed.`); - process.exit(1); // Exit with error code if all attempts fail + if (retryCount < maxRetries - 1) { + console.log( + `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, + ); + setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); + } else { + console.error(`🚨 All ${maxRetries} migration attempts failed.`); + process.exit(1); // Exit with error code if all attempts fail + } } - } - }; + }; - // Add a timeout to trigger migrations after 5 seconds on server start - setTimeout(() => triggerMigrations(), 5000); + // Add a timeout to trigger migrations after 5 seconds on server start + setTimeout(() => triggerMigrations(), 5000); - setTimeout(() => createS3Bucket(), 5000); + setTimeout(() => createS3Bucket(), 5000); + } } async function createS3Bucket() { diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index f24a657a74..1bfddd9a69 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -11,6 +11,7 @@ import { SpacesPolicy, Videos, VideosPolicy, + Workflows, } from "@cap/web-backend"; import { type HttpAuthMiddleware, Video } from "@cap/web-domain"; import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; @@ -18,12 +19,24 @@ import { FetchHttpClient, type HttpApi, HttpApiBuilder, + HttpApiClient, + HttpClient, HttpMiddleware, HttpServer, } from "@effect/platform"; -import { Cause, Effect, Exit, Layer, ManagedRuntime, Option } from "effect"; +import { RpcClient } from "@effect/rpc"; +import { + Cause, + Config, + Effect, + Exit, + Layer, + ManagedRuntime, + Option, +} from "effect"; import { cookies } from "next/headers"; import { allowedOrigins } from "@/utils/cors"; + import { getTracingConfig } from "./tracing"; export const TracingLayer = NodeSdk.layer(getTracingConfig); @@ -41,6 +54,36 @@ const CookiePasswordAttachmentLive = Layer.effect( }), ); +const WorkflowRpcLive = Layer.scoped( + Workflows.RpcClient, + Effect.gen(function* () { + const url = Option.getOrElse( + yield* Config.option(Config.string("REMOTE_WORKFLOW_URL")), + () => "http://127.0.0.1:42169", + ); + + return yield* RpcClient.make(Workflows.RpcGroup).pipe( + Effect.provide( + RpcClient.layerProtocolHttp({ url }).pipe( + Layer.provide(Workflows.RpcSerialization), + ), + ), + ); + }), +); + +const WorkflowHttpLive = Layer.scoped( + Workflows.HttpClient, + Effect.gen(function* () { + const url = Option.getOrElse( + yield* Config.option(Config.string("REMOTE_WORKFLOW_URL")), + () => "http://127.0.0.1:42169", + ); + + return yield* HttpApiClient.make(Workflows.Api, { baseUrl: url }); + }), +); + export const Dependencies = Layer.mergeAll( S3Buckets.Default, Videos.Default, @@ -49,6 +92,8 @@ export const Dependencies = Layer.mergeAll( SpacesPolicy.Default, OrganisationsPolicy.Default, Spaces.Default, + WorkflowRpcLive, + WorkflowHttpLive, ).pipe( Layer.provideMerge( Layer.mergeAll(Database.Default, TracingLayer, FetchHttpClient.layer), diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index 32067d2c68..124da80bc5 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -31,6 +31,7 @@ const nextConfig = { "@cap/utils", "@cap/web-api-contract", "@cap/web-domain", + "@cap/web-backend", ], }, images: { diff --git a/apps/workflow-manager/package.json b/apps/workflow-manager/package.json deleted file mode 100644 index 8860fa4cbc..0000000000 --- a/apps/workflow-manager/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@cap/workflow-manager", - "type": "module", - "scripts": { - "dev": "dotenv -e ../../.env -- deno --allow-all --watch src/index.ts" - }, - "dependencies": { - "@effect/platform-node": "^0.96.1", - "@effect/sql-mysql2": "^0.45.1", - "effect": "^3.17.14" - }, - "devDependencies": { - "dotenv-cli": "^10.0.0" - } -} diff --git a/infra/package.json b/infra/package.json index 8b04d69644..e7c9233c97 100644 --- a/infra/package.json +++ b/infra/package.json @@ -1,7 +1,7 @@ { "name": "@cap/infra", "devDependencies": { - "sst": "3.10.13" + "sst": "3.17.14" }, "scripts": { "sst": "sst" diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index ba2fdf30c1..a570b0cfe2 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -4,13 +4,14 @@ /* deno-fmt-ignore-file */ declare module "sst" { - export interface Resource { - DATABASE_URL: { - type: "sst.sst.Secret"; - value: string; - }; - } + export interface Resource { + "DATABASE_URL": { + "type": "sst.sst.Secret" + "value": string + } + } } /// -import "sst"; +import "sst" +export {} \ No newline at end of file diff --git a/infra/sst.config.ts b/infra/sst.config.ts index bbaee4ac2c..7594f68741 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -25,6 +25,11 @@ export default $config({ owner: GITHUB_ORG, }, cloudflare: true, + aws: { + profile: "cap-dev", + }, + planetscale: true, + awsx: "2.21.1", }, }; }, @@ -38,10 +43,10 @@ export default $config({ const recordingsBucket = new aws.s3.BucketV2("RecordingsBucket"); - new aws.s3.BucketAccelerateConfigurationV2("RecordingsBucketAcceleration", { - bucket: recordingsBucket.id, - status: "Enabled", - }); + // new aws.s3.BucketAccelerateConfigurationV2("RecordingsBucketAcceleration", { + // bucket: recordingsBucket.id, + // status: "Enabled", + // }); // const cloudfrontDistribution = aws.cloudfront.getDistributionOutput({ // id: "E36XSZEM0VIIYB", @@ -105,9 +110,18 @@ export default $config({ value: recordingsBucket.bucket, }); - const vercelOidc = aws.iam.getOpenIdConnectProviderOutput({ - url: `https://oidc.vercel.com/${VERCEL_TEAM_SLUG}`, - }); + const oidc = (() => { + const aud = `https://vercel.com/${VERCEL_TEAM_SLUG}`; + const url = `oidc.vercel.com/${VERCEL_TEAM_SLUG}`; + return { + aud, + url, + provider: new aws.iam.OpenIdConnectProvider("VercelAWSOIDC", { + url: `https://${url}`, + clientIdLists: [aud], + }), + }; + })(); const awsAccount = aws.getCallerIdentityOutput(); @@ -118,15 +132,15 @@ export default $config({ { Effect: "Allow", Principal: { - Federated: $interpolate`arn:aws:iam::${awsAccount.id}:oidc-provider/oidc.vercel.com/${VERCEL_TEAM_SLUG}`, + Federated: $interpolate`arn:aws:iam::${awsAccount.id}:oidc-provider/${oidc.url}`, }, Action: "sts:AssumeRoleWithWebIdentity", Condition: { StringEquals: { - [`oidc.vercel.com/${VERCEL_TEAM_SLUG}:aud`]: `https://vercel.com/${VERCEL_TEAM_SLUG}`, + [`${oidc.url}:aud`]: oidc.aud, }, StringLike: { - [`oidc.vercel.com/${VERCEL_TEAM_SLUG}:sub`]: [ + [`${oidc.url}:sub`]: [ `owner:${VERCEL_TEAM_SLUG}:project:*:environment:staging`, ], }, @@ -208,3 +222,86 @@ function DiscordBot() { }, }); } + +function WorkflowCluster() { + const vpc = new sst.aws.Vpc("Vpc", { + nat: "ec2", + }); + const privateDnsNamespace = new aws.servicediscovery.PrivateDnsNamespace( + "WorkflowClusterPrivateDnsNamespace", + { + name: "effect-cluster.private", + description: "Private namespace for effect-cluster", + vpc: vpc.id, + }, + ); + + function generateServiceHostname(serviceName: string) { + return $interpolate`${serviceName}.${$app.stage}.${$app.name}.${privateDnsNamespace.name}`; + } + + const securityGroup = new aws.ec2.SecurityGroup( + "WorkflowClusterSecurityGroup", + { + vpcId: vpc.id, + description: "Security group for effect-cluster", + }, + ); + new aws.vpc.SecurityGroupEgressRule("allow_all_traffic_ipv4", { + securityGroupId: securityGroup.id, + cidrIpv4: "0.0.0.0/0", + ipProtocol: "-1", + }); + // allow inbound from vpc + new aws.vpc.SecurityGroupIngressRule("allow_inbound_from_vpc", { + securityGroupId: securityGroup.id, + cidrIpv4: vpc.nodes.vpc.cidrBlock, + ipProtocol: "-1", + }); + const cluster = new sst.aws.Cluster("EffectCluster", { + vpc: { + id: vpc.id, + securityGroups: [securityGroup.id], + containerSubnets: vpc.privateSubnets, + loadBalancerSubnets: vpc.publicSubnets, + cloudmapNamespaceId: privateDnsNamespace.id, + cloudmapNamespaceName: privateDnsNamespace.name, + }, + }); + const commonEnvironment = { + SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + }; + + const repository = new awsx.ecr.Repository("Repository", {}); + const image = new awsx.ecr.Image("image", { + repositoryUrl: repository.url, + // adjust path because sst run on ./sst/platform + context: "../../", + platform: "linux/amd64", + }); + + const shardManager = new sst.aws.Service("ShardManager", { + cluster, + containers: [ + { + name: "shard-manager", + image: image.imageUri, + command: ["dist/shard-manager.js"], + environment: { + ...commonEnvironment, + }, + }, + ], + }); + + new sst.aws.Function("WorkflowClusterProxyLambda", { + vpc, + url: true, + timeout: "5 minutes", + link: [shardManager], + handler: "src/serverless/lambda.handler", + environment: { + SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + }, + }); +} diff --git a/package.json b/package.json index 96ff28d229..6e78a28f92 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "packageManager": "pnpm@10.5.2", "name": "cap", "engines": { - "node": "20" + "node": "24" }, "pnpm": { "overrides": { diff --git a/packages/config/base.tsconfig.json b/packages/config/base.tsconfig.json index c58fc2a476..a96702bfba 100644 --- a/packages/config/base.tsconfig.json +++ b/packages/config/base.tsconfig.json @@ -14,7 +14,8 @@ "strict": true, "noFallthroughCasesInSwitch": true, "declaration": true, - "plugins": [{ "name": "@effect/language-service" }] + "plugins": [{ "name": "@effect/language-service" }], + "incremental": true }, "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/packages/web-backend/src/Auth.ts b/packages/web-backend/src/Auth.ts index e2b008b861..5cdcb8b212 100644 --- a/packages/web-backend/src/Auth.ts +++ b/packages/web-backend/src/Auth.ts @@ -1,11 +1,15 @@ import { getServerSession } from "@cap/database/auth/auth-options"; import * as Db from "@cap/database/schema"; -import { CurrentUser, HttpAuthMiddleware, Policy } from "@cap/web-domain"; +import { + CurrentUser, + type DatabaseError, + HttpAuthMiddleware, +} from "@cap/web-domain"; import { HttpApiError, HttpServerRequest } from "@effect/platform"; import * as Dz from "drizzle-orm"; import { type Cause, Effect, Layer, Option, Schema } from "effect"; -import { Database, type DatabaseError } from "./Database.ts"; +import { Database } from "./Database.ts"; export const getCurrentUser = Effect.gen(function* () { const db = yield* Database; diff --git a/packages/web-backend/src/Database.ts b/packages/web-backend/src/Database.ts index 16e6eb01cb..736be511bf 100644 --- a/packages/web-backend/src/Database.ts +++ b/packages/web-backend/src/Database.ts @@ -1,10 +1,6 @@ import { db } from "@cap/database"; -import { Effect, Schema } from "effect"; - -export class DatabaseError extends Schema.TaggedError()( - "DatabaseError", - { cause: Schema.Unknown }, -) {} +import { DatabaseError } from "@cap/web-domain"; +import { Effect } from "effect"; export class Database extends Effect.Service()("Database", { effect: Effect.gen(function* () { diff --git a/packages/web-backend/src/Folders/index.ts b/packages/web-backend/src/Folders/index.ts index 57dbd2cb75..24fa514b53 100644 --- a/packages/web-backend/src/Folders/index.ts +++ b/packages/web-backend/src/Folders/index.ts @@ -1,6 +1,7 @@ import * as Db from "@cap/database/schema"; import { CurrentUser, + type DatabaseError, Folder, Organisation, Policy, @@ -10,7 +11,7 @@ import { import * as Dz from "drizzle-orm"; import { Effect, Option } from "effect"; -import { Database, type DatabaseError } from "../Database.ts"; +import { Database } from "../Database.ts"; import { FoldersPolicy } from "./FoldersPolicy.ts"; import { FoldersRepo } from "./FoldersRepo.ts"; diff --git a/packages/web-backend/src/Http/Errors.ts b/packages/web-backend/src/Http/Errors.ts new file mode 100644 index 0000000000..f15bd1f9d0 --- /dev/null +++ b/packages/web-backend/src/Http/Errors.ts @@ -0,0 +1,14 @@ +import { DatabaseError, Http, S3Error } from "@cap/web-domain"; +import { Effect, Schema } from "effect"; + +export const handleDomainError = (e: Effect.Effect) => + e.pipe( + Effect.catchIf( + (e) => Schema.is(DatabaseError)(e), + () => new Http.InternalServerError({ cause: "database" }), + ), + Effect.catchIf( + (e) => Schema.is(S3Error)(e), + () => new Http.InternalServerError({ cause: "database" }), + ), + ); diff --git a/packages/web-backend/src/Http/Live.ts b/packages/web-backend/src/Http/Live.ts new file mode 100644 index 0000000000..0ed3b62272 --- /dev/null +++ b/packages/web-backend/src/Http/Live.ts @@ -0,0 +1,9 @@ +import { Http } from "@cap/web-domain"; +import { HttpApiBuilder } from "@effect/platform"; +import { Layer } from "effect"; + +import { LoomHttpLive } from "../Loom/Http.ts"; + +export const HttpLive = HttpApiBuilder.api(Http.ApiContract).pipe( + Layer.provide(LoomHttpLive), +); diff --git a/packages/web-backend/src/Loom/Http.ts b/packages/web-backend/src/Loom/Http.ts new file mode 100644 index 0000000000..69e4664c93 --- /dev/null +++ b/packages/web-backend/src/Loom/Http.ts @@ -0,0 +1,40 @@ +import { CurrentUser, Http, Policy } from "@cap/web-domain"; +import { HttpApiBuilder } from "@effect/platform"; +import { Effect } from "effect"; + +import { handleDomainError } from "../Http/Errors.ts"; +import { OrganisationsPolicy } from "../Organisations/OrganisationsPolicy.ts"; +import * as Workflows from "../Workflows.ts"; + +export const LoomHttpLive = HttpApiBuilder.group( + Http.ApiContract, + "loom", + (handlers) => + Effect.gen(function* () { + const workflows = yield* Workflows.RpcClient; + const orgPolicy = yield* OrganisationsPolicy; + + return handlers.handle("importVideo", ({ payload }) => + Effect.gen(function* () { + const user = yield* CurrentUser; + + const result = yield* workflows + .LoomImportVideo({ + cap: { userId: user.id, orgId: user.activeOrganizationId }, + loom: payload.loom, + }) + .pipe( + Effect.catchTag( + "RpcClientError", + () => new Http.InternalServerError({ cause: "unknown" }), + ), + ); + + return { videoId: result.videoId }; + }).pipe( + Policy.withPolicy(orgPolicy.isMember(payload.cap.orgId)), + handleDomainError, + ), + ); + }), +); diff --git a/packages/web-backend/src/Loom/ImportVideo.ts b/packages/web-backend/src/Loom/ImportVideo.ts index 4800f759f2..204fd332a7 100644 --- a/packages/web-backend/src/Loom/ImportVideo.ts +++ b/packages/web-backend/src/Loom/ImportVideo.ts @@ -1,60 +1,60 @@ -import { Organisation, S3Bucket, User, Video } from "@cap/web-domain"; -import { Headers, HttpClient } from "@effect/platform"; -import { Activity, Workflow } from "@effect/workflow"; +import { DatabaseError, Loom, S3Bucket, S3Error, Video } from "@cap/web-domain"; +import { Headers, HttpClient, HttpClientResponse } from "@effect/platform"; +import { Activity } from "@effect/workflow"; import { Effect, Option, Schedule, Schema, Stream } from "effect"; -import { DatabaseError } from "../Database.ts"; import { S3Buckets } from "../S3Buckets/index.ts"; -import { S3Error } from "../S3Buckets/S3BucketAccess.ts"; import { Videos } from "../Videos/index.ts"; -export class LoomApiError extends Schema.TaggedError( - "LoomApiError", -)("LoomApiError", { cause: Schema.Unknown }) {} - -export const LoomImportVideoError = Schema.Union( - DatabaseError, - Video.NotFoundError, - S3Error, - LoomApiError, -); - -export const LoomImportVideo = Workflow.make({ - name: "LoomImportVideo", - payload: { - cap: Schema.Struct({ - userId: User.UserId, - orgId: Organisation.OrganisationId, - }), - loom: Schema.Struct({ - userId: User.UserId, - orgId: Organisation.OrganisationId, - video: Schema.Struct({ - id: Video.VideoId, - name: Schema.String, - downloadUrl: Schema.String, - width: Schema.OptionFromNullOr(Schema.Number), - height: Schema.OptionFromNullOr(Schema.Number), - fps: Schema.OptionFromNullOr(Schema.Number), - durationSecs: Schema.OptionFromNullOr(Schema.Number), - }), - }), - attempt: Schema.optional(Schema.Number), - }, - error: LoomImportVideoError, - idempotencyKey: (p) => - `${p.cap.userId}-${p.loom.orgId}-${p.loom.video.id}-${p.attempt ?? 0}`, -}); - -export const LoomImportVideoLive = LoomImportVideo.toLayer( +export const LoomImportVideoLive = Loom.ImportVideo.toLayer( Effect.fn(function* (payload) { const videos = yield* Videos; const s3Buckets = yield* S3Buckets; const http = yield* HttpClient.HttpClient; + yield* Effect.log("starting loom import workflow"); + + yield* Activity.make({ + name: "VerifyURLValid", + error: Schema.Union(Loom.VideoURLInvalidError, Loom.ExternalLoomError), + execute: http + .get(payload.loom.video.downloadUrl, { + headers: { range: "bytes=0-0" }, + }) + .pipe( + Effect.flatMap(HttpClientResponse.filterStatus((s) => s < 400)), + Effect.catchIf( + (e) => e._tag === "ResponseError", + ( + cause, + ): Effect.Effect< + never, + Loom.VideoURLInvalidError | Loom.ExternalLoomError + > => { + if (cause.response.status < 500) + return Effect.fail( + new Loom.VideoURLInvalidError({ + status: cause.response.status, + }), + ); + + return Effect.fail( + new Loom.ExternalLoomError({ cause: cause.response }), + ); + }, + ), + Effect.retry({ + schedule: Schedule.exponential("200 millis"), + times: 3, + while: (e) => e._tag !== "VideoURLInvalidError", + }), + Effect.catchTag("RequestError", Effect.die), + ), + }); + const { videoId, customBucketId } = yield* Activity.make({ name: "CreateVideoRecord", - error: LoomImportVideoError, + error: DatabaseError, success: Schema.Struct({ videoId: Video.VideoId, customBucketId: Schema.Option(S3Bucket.S3BucketId), @@ -62,9 +62,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( execute: Effect.gen(function* () { const loomVideo = payload.loom.video; - const [_, customBucket] = yield* s3Buckets - .getBucketAccessForUser(payload.cap.userId) - .pipe(Effect.catchAll(() => Effect.die(null))); + const [_, customBucket] = yield* s3Buckets.getBucketAccessForUser( + payload.cap.userId, + ); const customBucketId = Option.map(customBucket, (b) => b.id); @@ -74,9 +74,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( bucketId: customBucketId, source: { type: "desktopMP4" as const }, name: payload.loom.video.name, - duration: loomVideo.durationSecs, - width: loomVideo.width, - height: loomVideo.height, + duration: Option.fromNullable(loomVideo.durationSecs), + width: Option.fromNullable(loomVideo.width), + height: Option.fromNullable(loomVideo.height), public: true, metadata: Option.none(), folderId: Option.none(), @@ -88,7 +88,12 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( }); return { videoId, customBucketId }; - }), + }).pipe( + Effect.retry({ + schedule: Schedule.exponential("200 millis"), + times: 3, + }), + ), }); const source = new Video.Mp4Source({ @@ -96,16 +101,18 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( ownerId: payload.cap.userId, }); - const { fileKey } = yield* Activity.make({ + yield* Activity.make({ name: "DownloadVideo", - error: LoomImportVideoError, - success: Schema.Struct({ fileKey: Schema.String }), + error: Schema.Union(S3Error, DatabaseError, Loom.ExternalLoomError), execute: Effect.gen(function* () { const [s3Bucket] = yield* s3Buckets.getBucketAccess(customBucketId); + yield* Effect.log(payload.loom.video.downloadUrl); const resp = yield* http .get(payload.loom.video.downloadUrl) - .pipe(Effect.catchAll((cause) => new LoomApiError({ cause }))); + .pipe( + Effect.catchAll((cause) => new Loom.ExternalLoomError({ cause })), + ); const contentLength = Headers.get(resp.headers, "content-length").pipe( Option.map((v) => Number(v)), Option.getOrUndefined, @@ -143,11 +150,9 @@ export const LoomImportVideoLive = LoomImportVideo.toLayer( yield* Effect.log( `Uploaded video for user '${payload.cap.userId}' at key '${key}'`, ); - - return { fileKey: key }; }), }); - return { fileKey, videoId }; + return { videoId }; }), ); diff --git a/packages/web-backend/src/Loom/index.ts b/packages/web-backend/src/Loom/index.ts index 3610e71386..49165269f7 100644 --- a/packages/web-backend/src/Loom/index.ts +++ b/packages/web-backend/src/Loom/index.ts @@ -1 +1 @@ -export { LoomImportVideo, LoomImportVideoLive } from "./ImportVideo.ts"; +export { LoomImportVideoLive } from "./ImportVideo.ts"; diff --git a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts index d153d5739c..55a176b546 100644 --- a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts +++ b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts @@ -5,15 +5,12 @@ import { type PresignedPostOptions, } from "@aws-sdk/s3-presigned-post"; import * as S3Presigner from "@aws-sdk/s3-request-presigner"; +import { S3Error } from "@cap/web-domain"; import type { RequestPresigningArguments } from "@smithy/types"; -import { type Cause, Effect, Option, Schema, Stream } from "effect"; +import { type Cause, Effect, Option, Stream } from "effect"; import { S3BucketClientProvider } from "./S3BucketClientProvider.ts"; -export class S3Error extends Schema.TaggedError()("S3Error", { - cause: Schema.Unknown, -}) {} - const wrapS3Promise = ( promise: Promise | Effect.Effect, Cause.UnknownException>, ): Effect.Effect => diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index 3643374e13..a9badc16cd 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -177,11 +177,13 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { getBucketAccessForUser: Effect.fn("S3Buckets.getProviderForUser")( function* (userId: User.UserId) { - const customBucket = yield* repo + return yield* repo .getForUser(userId) - .pipe(Effect.option, Effect.map(Option.flatten)); - - return yield* getBucketAccess(customBucket); + .pipe( + Effect.option, + Effect.map(Option.flatten), + Effect.flatMap(getBucketAccess), + ); }, ), }; diff --git a/packages/web-backend/src/Workflows.ts b/packages/web-backend/src/Workflows.ts index 33b6c83139..2a2a469f9b 100644 --- a/packages/web-backend/src/Workflows.ts +++ b/packages/web-backend/src/Workflows.ts @@ -1,11 +1,12 @@ +import { Loom } from "@cap/web-domain"; import { HttpApi, type HttpApiClient } from "@effect/platform"; import * as Rpc from "@effect/rpc"; import { WorkflowProxy, WorkflowProxyServer } from "@effect/workflow"; import { Context, Layer } from "effect"; -import { LoomImportVideo, LoomImportVideoLive } from "./Loom/index.ts"; +import { LoomImportVideoLive } from "./Loom/index.ts"; -export const Workflows = [LoomImportVideo] as const; +export const Workflows = [Loom.ImportVideo] as const; export const RpcGroup = WorkflowProxy.toRpcGroup(Workflows); export const RpcSerialization = Rpc.RpcSerialization.layerJson; diff --git a/packages/web-backend/src/index.ts b/packages/web-backend/src/index.ts index 7a1b9449af..fca94d4440 100644 --- a/packages/web-backend/src/index.ts +++ b/packages/web-backend/src/index.ts @@ -1,6 +1,7 @@ export * from "./Auth.ts"; export * from "./Database.ts"; export { Folders } from "./Folders/index.ts"; +export { HttpLive } from "./Http/Live.ts"; export * from "./Loom/index.ts"; export { OrganisationsPolicy } from "./Organisations/OrganisationsPolicy.ts"; export * from "./Rpcs.ts"; diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index de5e6ca82b..076222402b 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -4,10 +4,16 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "scripts": { + "generate-openapi": "node scripts/generate-openapi.ts" + }, "dependencies": { "@effect/platform": "^0.91.1", "@effect/rpc": "^0.70.0", "@effect/workflow": "^0.10.0", "effect": "^3.17.14" + }, + "devDependencies": { + "@effect/platform-node": "^0.96.1" } } diff --git a/packages/web-domain/scripts/generate-openapi.ts b/packages/web-domain/scripts/generate-openapi.ts new file mode 100644 index 0000000000..b3eb9d56eb --- /dev/null +++ b/packages/web-domain/scripts/generate-openapi.ts @@ -0,0 +1,16 @@ +import { FileSystem, OpenApi } from "@effect/platform"; +import { NodeContext, NodeRuntime } from "@effect/platform-node"; +import { Effect } from "effect"; + +import { ApiContract } from "../src/Http/index.ts"; + +Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + + const spec = OpenApi.fromApi(ApiContract); + + yield* fs.writeFileString( + process.argv[2] ?? "openapi.json", + JSON.stringify(spec, null, 2), + ); +}).pipe(Effect.provide(NodeContext.layer), NodeRuntime.runMain); diff --git a/packages/web-domain/src/Database.ts b/packages/web-domain/src/Database.ts new file mode 100644 index 0000000000..987c992195 --- /dev/null +++ b/packages/web-domain/src/Database.ts @@ -0,0 +1,6 @@ +import { Schema } from "effect"; + +export class DatabaseError extends Schema.TaggedError()( + "DatabaseError", + { cause: Schema.Unknown }, +) {} diff --git a/packages/web-domain/src/Http/Api.ts b/packages/web-domain/src/Http/Api.ts new file mode 100644 index 0000000000..e62832f9d4 --- /dev/null +++ b/packages/web-domain/src/Http/Api.ts @@ -0,0 +1,12 @@ +import { HttpApi, OpenApi } from "@effect/platform"; +import { LoomHttpApi } from "../Loom.ts"; + +export class ApiContract extends HttpApi.make("cap-web-api") + .add(LoomHttpApi.prefix("/loom")) + .annotateContext( + OpenApi.annotations({ + title: "Cap HTTP API", + description: "Internal API used by Cap Desktop and external services", + }), + ) + .prefix("/api") {} diff --git a/packages/web-domain/src/Http/Errors.ts b/packages/web-domain/src/Http/Errors.ts new file mode 100644 index 0000000000..60190aba41 --- /dev/null +++ b/packages/web-domain/src/Http/Errors.ts @@ -0,0 +1,8 @@ +import { HttpApiSchema } from "@effect/platform"; +import { Schema } from "effect"; + +export class InternalServerError extends Schema.TaggedError()( + "InternalServerError", + { cause: Schema.Literal("database", "s3", "unknown") }, + HttpApiSchema.annotations({ status: 500 }), +) {} diff --git a/packages/web-domain/src/Http/index.ts b/packages/web-domain/src/Http/index.ts new file mode 100644 index 0000000000..23558b1833 --- /dev/null +++ b/packages/web-domain/src/Http/index.ts @@ -0,0 +1,2 @@ +export * from "./Api.ts"; +export * from "./Errors.ts"; diff --git a/packages/web-domain/src/Loom.ts b/packages/web-domain/src/Loom.ts index 3fe3105b46..5be512b9d8 100644 --- a/packages/web-domain/src/Loom.ts +++ b/packages/web-domain/src/Loom.ts @@ -1,44 +1,92 @@ +import { + HttpApiEndpoint, + HttpApiGroup, + HttpApiSchema, + OpenApi, +} from "@effect/platform"; import { Workflow } from "@effect/workflow"; import { Schema } from "effect"; + +import { HttpAuthMiddleware } from "./Authentication.ts"; +import { DatabaseError } from "./Database.ts"; +import { InternalServerError } from "./Http/Errors.ts"; import { OrganisationId } from "./Organisation.ts"; +import { PolicyDeniedError } from "./Policy.ts"; +import { S3Error } from "./S3Bucket.ts"; import { UserId } from "./User.ts"; import * as Video from "./Video.ts"; -class LoomApiError extends Schema.TaggedError("LoomApiError")( - "LoomApiError", +export class ExternalLoomError extends Schema.TaggedError()( + "ExternalLoomError", { cause: Schema.Unknown }, + HttpApiSchema.annotations({ status: 500 }), ) {} -const LoomImportVideoError = Schema.Union( - // DatabaseError, - Video.NotFoundError, - // S3Error, - LoomApiError, -); +export class VideoURLInvalidError extends Schema.TaggedError()( + "VideoURLInvalidError", + { status: Schema.Number }, + HttpApiSchema.annotations({ status: 404 }), +) {} -export const LoomImportVideo = Workflow.make({ +export const ImportVideoLoomData = Schema.Struct({ + userId: UserId, + orgId: OrganisationId, + video: Schema.Struct({ + id: Schema.String, + name: Schema.String, + downloadUrl: Schema.URL, + width: Schema.optional(Schema.Number), + height: Schema.optional(Schema.Number), + fps: Schema.optional(Schema.Number), + durationSecs: Schema.optional(Schema.Number), + }), +}); + +export const ImportVideo = Workflow.make({ name: "LoomImportVideo", payload: { cap: Schema.Struct({ userId: UserId, orgId: OrganisationId, }), - loom: Schema.Struct({ - userId: UserId, - orgId: OrganisationId, - video: Schema.Struct({ - id: Schema.String, - name: Schema.String, - downloadUrl: Schema.String, - width: Schema.OptionFromNullOr(Schema.Number), - height: Schema.OptionFromNullOr(Schema.Number), - fps: Schema.OptionFromNullOr(Schema.Number), - durationSecs: Schema.OptionFromNullOr(Schema.Number), - }), - }), + loom: ImportVideoLoomData, attempt: Schema.optional(Schema.Number), }, - error: LoomImportVideoError, + success: Schema.Struct({ + videoId: Video.VideoId, + }), + error: Schema.Union( + DatabaseError, + Video.NotFoundError, + S3Error, + ExternalLoomError, + VideoURLInvalidError, + ), idempotencyKey: (p) => `${p.cap.userId}-${p.loom.orgId}-${p.loom.video.id}-${p.attempt ?? 0}`, }); + +export class LoomHttpApi extends HttpApiGroup.make("loom") + .add( + HttpApiEndpoint.post("importVideo", "/video") + .setPayload( + Schema.Struct({ + cap: Schema.Struct({ orgId: Schema.String }), + loom: ImportVideoLoomData, + }), + ) + .addSuccess(Schema.Struct({ videoId: Video.VideoId })) + .addError(VideoURLInvalidError) + .addError(InternalServerError) + .addError(PolicyDeniedError) + .addError(Video.NotFoundError) + .addError(ExternalLoomError), + ) + .middleware(HttpAuthMiddleware) + .annotateContext( + OpenApi.annotations({ + title: "Loom", + description: + "Endpoints to import Loom videos to Cap. Mostly used by the Loom importer extension.", + }), + ) {} diff --git a/packages/web-domain/src/Policy.ts b/packages/web-domain/src/Policy.ts index 04234359cf..05acb769b5 100644 --- a/packages/web-domain/src/Policy.ts +++ b/packages/web-domain/src/Policy.ts @@ -1,5 +1,6 @@ // shoutout https://lucas-barake.github.io/building-a-composable-policy-system/ +import { HttpApiSchema } from "@effect/platform"; import { type Brand, Context, Data, Effect, type Option, Schema } from "effect"; import type { NonEmptyReadonlyArray } from "effect/Array"; import { CurrentUser } from "./Authentication.ts"; @@ -19,6 +20,7 @@ export type PublicPolicy = Effect.Effect< export class PolicyDeniedError extends Schema.TaggedError()( "PolicyDenied", {}, + HttpApiSchema.annotations({ status: 403 }), ) {} /** diff --git a/packages/web-domain/src/S3Bucket.ts b/packages/web-domain/src/S3Bucket.ts index 93b06fad4c..c0dc494642 100644 --- a/packages/web-domain/src/S3Bucket.ts +++ b/packages/web-domain/src/S3Bucket.ts @@ -14,6 +14,10 @@ export class S3Bucket extends Schema.Class("S3Bucket")({ secretAccessKey: Schema.String, }) {} -export const Workflows = [S3Bucket] as const; +export const Workflows = [] as const; export const decodeSync = Schema.decodeSync(S3Bucket); + +export class S3Error extends Schema.TaggedError()("S3Error", { + cause: Schema.Unknown, +}) {} diff --git a/packages/web-domain/src/Video.ts b/packages/web-domain/src/Video.ts index 8da3c5b1f2..13b1a402ca 100644 --- a/packages/web-domain/src/Video.ts +++ b/packages/web-domain/src/Video.ts @@ -1,6 +1,6 @@ +import { HttpApiSchema } from "@effect/platform"; import { Rpc, RpcGroup } from "@effect/rpc"; import { Context, Effect, Option, Schema } from "effect"; - import { RpcAuthMiddleware } from "./Authentication.ts"; import { InternalError } from "./Errors.ts"; import { FolderId } from "./Folder.ts"; @@ -135,6 +135,7 @@ export const verifyPassword = (video: Video, password: Option.Option) => export class NotFoundError extends Schema.TaggedError()( "VideoNotFoundError", {}, + HttpApiSchema.annotations({ status: 404 }), ) {} export class VideoRpcs extends RpcGroup.make( diff --git a/packages/web-domain/src/index.ts b/packages/web-domain/src/index.ts index 8b7e01bd0e..560c124a52 100644 --- a/packages/web-domain/src/index.ts +++ b/packages/web-domain/src/index.ts @@ -1,11 +1,17 @@ export * from "./Authentication.ts"; export * as Comment from "./Comment.ts"; +export * from "./Database.ts"; +export * from "./Errors.ts"; export * from "./Errors.ts"; export * as Folder from "./Folder.ts"; +export * as Http from "./Http/index.ts"; +export * as Loom from "./Loom.ts"; export * as Organisation from "./Organisation.ts"; +export * from "./Organisation.ts"; export * as Policy from "./Policy.ts"; export { Rpcs } from "./Rpcs.ts"; export * as S3Bucket from "./S3Bucket.ts"; +export { S3Error } from "./S3Bucket.ts"; export * as Space from "./Space.ts"; export * as User from "./User.ts"; export * as Video from "./Video.ts"; diff --git a/packages/web-domain/tsconfig.json b/packages/web-domain/tsconfig.json index 5b71fafb5a..0f07a65057 100644 --- a/packages/web-domain/tsconfig.json +++ b/packages/web-domain/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../config/base.tsconfig.json", "exclude": ["node_modules", "dist"], - "include": ["src/**/*.ts", "src/**/*.tsx"], + "include": ["src/**/*.ts", "src/**/*.tsx", "scripts/*"], "compilerOptions": { "moduleResolution": "bundler", "composite": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7735b47070..9149e30bf1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.4.2)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -202,7 +202,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -236,10 +236,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ~2.1.9 version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) @@ -287,6 +287,58 @@ importers: specifier: ^3.109.1 version: 3.114.8(@cloudflare/workers-types@4.20250507.0) + apps/effect-cluster: + dependencies: + '@cap/web-backend': + specifier: workspace:* + version: link:../../packages/web-backend + '@cap/web-domain': + specifier: workspace:* + version: link:../../packages/web-domain + '@effect/cluster': + specifier: ^0.49.1 + version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/opentelemetry': + specifier: ^0.56.1 + version: 0.56.1(@effect/platform@0.91.1(effect@3.17.14))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.14) + '@effect/platform': + specifier: ^0.91.1 + version: 0.91.1(effect@3.17.14) + '@effect/platform-node': + specifier: ^0.96.1 + version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/rpc': + specifier: ^0.70.0 + version: 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@effect/sql-mysql2': + specifier: ^0.45.1 + version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/workflow': + specifier: ^0.10.0 + version: 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': + specifier: ^2.0.1 + version: 2.0.1(@opentelemetry/api@1.9.0) + effect: + specifier: ^3.17.14 + version: 3.17.14 + rolldown: + specifier: 1.0.0-beta.42 + version: 1.0.0-beta.42 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.8.3) + tsup: + specifier: ^8.5.0 + version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) + devDependencies: + dotenv-cli: + specifier: ^10.0.0 + version: 10.0.0 + apps/storybook: dependencies: '@cap/ui-solid': @@ -331,16 +383,16 @@ importers: version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3)) storybook-solidjs-vite: specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.4)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.10.2 - version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) apps/tasks: dependencies: @@ -810,10 +862,10 @@ importers: version: 10.0.0(@babel/core@7.27.1)(webpack@5.101.3(esbuild@0.25.5)) eslint: specifier: ^9.30.1 - version: 9.30.1(jiti@2.4.2) + version: 9.30.1(jiti@2.6.1) eslint-config-next: specifier: 15.5.3 - version: 15.5.3(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + version: 15.5.3(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) postcss: specifier: ^8.4.23 version: 8.5.3 @@ -824,62 +876,6 @@ importers: specifier: ^5.8.3 version: 5.8.3 - apps/workflow-manager: - dependencies: - '@effect/platform-node': - specifier: ^0.96.1 - version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/sql-mysql2': - specifier: ^0.45.1 - version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - effect: - specifier: ^3.17.14 - version: 3.17.14 - devDependencies: - dotenv-cli: - specifier: ^10.0.0 - version: 10.0.0 - - apps/workflow-runner: - dependencies: - '@cap/web-backend': - specifier: workspace:* - version: link:../../packages/web-backend - '@cap/web-domain': - specifier: workspace:* - version: link:../../packages/web-domain - '@effect/cluster': - specifier: ^0.49.1 - version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/opentelemetry': - specifier: ^0.56.1 - version: 0.56.1(@effect/platform@0.91.1(effect@3.17.14))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.14) - '@effect/platform': - specifier: ^0.91.1 - version: 0.91.1(effect@3.17.14) - '@effect/platform-node': - specifier: ^0.96.1 - version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - '@effect/sql-mysql2': - specifier: ^0.45.1 - version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/workflow': - specifier: ^0.10.0 - version: 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@opentelemetry/exporter-trace-otlp-http': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': - specifier: ^2.0.1 - version: 2.0.1(@opentelemetry/api@1.9.0) - effect: - specifier: ^3.17.14 - version: 3.17.14 - devDependencies: - dotenv-cli: - specifier: ^10.0.0 - version: 10.0.0 - infra: dependencies: '@pulumi/github': @@ -893,20 +889,20 @@ importers: version: 3.25.76 devDependencies: sst: - specifier: 3.10.13 - version: 3.10.13 + specifier: 3.17.14 + version: 3.17.14 packages/config: dependencies: '@vitejs/plugin-react': specifier: ^4.0.3 - version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) zod: specifier: ^3 version: 3.25.76 @@ -1133,7 +1129,7 @@ importers: version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react': specifier: ^4.0.3 - version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) autoprefixer: specifier: ^10.4.16 version: 10.4.21(postcss@8.5.3) @@ -1175,10 +1171,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) packages/ui-solid: dependencies: @@ -1230,7 +1226,7 @@ importers: version: 0.18.6(rollup@4.40.2) unplugin-fonts: specifier: ^1.1.1 - version: 1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + version: 1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) unplugin-icons: specifier: ^0.19.2 version: 0.19.3 @@ -1358,6 +1354,10 @@ importers: effect: specifier: ^3.17.14 version: 3.17.14 + devDependencies: + '@effect/platform-node': + specifier: ^0.96.1 + version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) packages: @@ -2225,6 +2225,9 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} @@ -2234,6 +2237,9 @@ packages: '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -3806,6 +3812,9 @@ packages: '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} + '@napi-rs/wasm-runtime@1.0.6': + resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} + '@netlify/binary-info@1.0.0': resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} @@ -4328,14 +4337,13 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.32.0': - resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==} - engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.36.0': resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} engines: {node: '>=14'} + '@oxc-project/types@0.94.0': + resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -4514,6 +4522,9 @@ packages: '@pulumiverse/vercel@1.14.3': resolution: {integrity: sha512-Wdq/vNPNWh/cjzv+VHCjT30gBBhrrmX5J8E8VlNJ8bQ5mkMfEZDPpHaY+6NTFIb6arF+KUGdIsUFsndT50pmeA==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + '@radix-ui/colors@3.0.0': resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} @@ -5255,6 +5266,92 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 + '@rolldown/binding-android-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.42': + resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -5974,10 +6071,10 @@ packages: react-dom: optional: true - '@storybook/builder-vite@10.0.0-beta.9': - resolution: {integrity: sha512-R8nSDRWr9eFOF+Bi9+wfJA6jjXGcLCrbgBt2bLebzfXhCNmfHCMaqRG2ZaNdEV4u9KJyakKdzKEotvAkaPONUA==} + '@storybook/builder-vite@10.0.0-beta.10': + resolution: {integrity: sha512-Lr/nVrkZLzMBs1CIvIc0ddr2UyWRmqnoYalBLUKraGZUCOfCzpJ3ywzfj3lMhfOR4456Lld0X9SFd04DQFHDnQ==} peerDependencies: - storybook: ^10.0.0-beta.9 + storybook: ^10.0.0-beta.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/core@8.6.12': @@ -5988,12 +6085,12 @@ packages: prettier: optional: true - '@storybook/csf-plugin@10.0.0-beta.9': - resolution: {integrity: sha512-0PfoiNKNJGNaWZBc31sevMOfhzX0VqrrKqE98DCMyEvZLUPnKy4t7iCE5TNFH+rUd5D7MdVzwgAmJ+CdtlmHIQ==} + '@storybook/csf-plugin@10.0.0-beta.10': + resolution: {integrity: sha512-sKCnWOHU97799zj6RoZuFygJCKPPUmohYZsESPddWQm6tHckjmKp1k4ISvd7Z5MIBwiEPYCnppQDDH1mOG6SPw==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.0.0-beta.9 + storybook: ^10.0.0-beta.10 vite: '*' webpack: '*' peerDependenciesMeta: @@ -6449,6 +6546,9 @@ packages: resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} engines: {node: ^16.14.0 || >=18.0.0} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -6632,8 +6732,8 @@ packages: '@types/node@20.17.43': resolution: {integrity: sha512-DnDEcDUnVAUYSa7U03QvrXbj1MZj00xoyi/a3lRGkR/c7BFUnqv+OY9EUphMqXUKdZJEOmuzu2mm+LmCisnPow==} - '@types/node@20.19.17': - resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} + '@types/node@20.19.19': + resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} '@types/node@22.15.14': resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} @@ -7266,6 +7366,10 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -7383,6 +7487,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.3: + resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} + engines: {node: '>=20.19.0'} + ast-module-types@5.0.0: resolution: {integrity: sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ==} engines: {node: '>=14'} @@ -7518,8 +7626,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.6: - resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} + baseline-browser-mapping@2.8.12: + resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} hasBin: true basic-auth@2.0.1: @@ -7553,6 +7661,9 @@ packages: birpc@0.2.14: resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -7595,8 +7706,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.26.2: - resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -7630,6 +7741,12 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -7702,6 +7819,9 @@ packages: caniuse-lite@1.0.30001743: resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001748: + resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} @@ -8210,6 +8330,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} @@ -8375,6 +8504,10 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -8532,6 +8665,15 @@ packages: sqlite3: optional: true + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dub@0.64.0: resolution: {integrity: sha512-HJ/nYSinJpoqU94+wXwpZWS8S/QddkKFTPKQEPY7N3YYXQLk2t9TVDArKBfIdcjFpvmCltJ+awa8Ogjq0DOv7w==} hasBin: true @@ -8566,8 +8708,8 @@ packages: electron-to-chromium@1.5.150: resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} - electron-to-chromium@1.5.223: - resolution: {integrity: sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==} + electron-to-chromium@1.5.231: + resolution: {integrity: sha512-cyl6vqZGkEBnz/PmvFHn/u9G/hbo+FF2CNAOXriG87QOeLsUdifCZ9UbHNscE9wGdrC8XstNMli0CbQnZQ+fkA==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -8585,6 +8727,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -9038,12 +9184,12 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.1: - resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} - eventsource@3.0.6: - resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} execa@5.1.1: @@ -9077,11 +9223,11 @@ packages: exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - express-rate-limit@7.5.0: - resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} peerDependencies: - express: ^4.11 || 5 || ^5.0.0-beta.1 + express: '>= 4.11' express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} @@ -9169,6 +9315,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -9239,6 +9394,9 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9442,6 +9600,9 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.11.0: + resolution: {integrity: sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ==} + gif.js@0.2.0: resolution: {integrity: sha512-bYxCoT8OZKmbxY8RN4qDiYuj4nrQDTzgLRcFVovyona1PTWNePzI4nzOmotnlOFIzTk/ZxAHtv+TfVLiBWj/hw==} @@ -9722,6 +9883,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} @@ -10271,6 +10436,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jmespath@0.16.0: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} @@ -10287,6 +10456,10 @@ packages: jose@5.6.3: resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} @@ -10460,6 +10633,10 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -10517,6 +10694,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -10604,6 +10784,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magicast@0.2.11: resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} @@ -11208,8 +11391,8 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} node-source-walk@6.0.2: resolution: {integrity: sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==} @@ -11374,6 +11557,10 @@ packages: resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} engines: {node: ^10.13.0 || >=12.0.0} + oidc-token-hash@5.1.1: + resolution: {integrity: sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==} + engines: {node: ^10.13.0 || >=12.0.0} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -11587,9 +11774,8 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -11702,6 +11888,24 @@ packages: ts-node: optional: true + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} @@ -11897,6 +12101,9 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} @@ -11926,9 +12133,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -12282,6 +12489,30 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rolldown-plugin-dts@0.16.11: + resolution: {integrity: sha512-9IQDaPvPqTx3RjG2eQCK5GYZITo203BxKunGI80AGYicu1ySFTUyugicAaTZWRzFWh9DSnzkgNeMNbDWBbSs0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.42: + resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-inject@3.0.2: resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. @@ -12355,8 +12586,8 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} scule@1.3.0: @@ -12617,6 +12848,11 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead @@ -12650,33 +12886,48 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - sst-darwin-arm64@3.10.13: - resolution: {integrity: sha512-oM0mtqUQhEV779Qsb/8DYBS5hThj0TUqSYJrGjPea6aNN+SYYwuo82iM7gtG530gSqvLyi6V+0HBxjT9yUvCnw==} + sst-darwin-arm64@3.17.14: + resolution: {integrity: sha512-ItOltB8HH+8XSS7FnQfR/yqsJVMr+/HvibBCNOf57WnjuNqWGLB4db/ESCeYuaQqpjpUt5lrT9ezflWrf4O9Tg==} cpu: [arm64] os: [darwin] - sst-darwin-x64@3.10.13: - resolution: {integrity: sha512-7OOvbFRbUPxqGrh4vuLV1fuTkyTKkt+Thzc6fqG+fM8cL5P+YjNTg5ZAojC45JD1mSOAiXZIM5fLYW4ubDz5cA==} + sst-darwin-x64@3.17.14: + resolution: {integrity: sha512-J22TN1Fa878qUXsZtPybzrUbGd68p6CjXpmpqMVTyKJ9u/purkO2TiXtcFs7Ow4nr1RuCXFKo3eQ1fHDeO9YUg==} cpu: [x64] os: [darwin] - sst-linux-arm64@3.10.13: - resolution: {integrity: sha512-kYsXIioO4W9YV9zVMQLaFtAT+0QzXz8RFFucwUyhLWKX9dYD+etfhECYnijyzBfO1dj8cUTMoEI3eA4jTIgKOA==} + sst-linux-arm64@3.17.14: + resolution: {integrity: sha512-5wivBPIcRClHdWknp4z/lww7WyU27YkHEfF2lmt7dDS1XtM3VfTW1GdzQDsaox3wdIAmpKeYF5Wg79+cCRM/iA==} cpu: [arm64] os: [linux] - sst-linux-x64@3.10.13: - resolution: {integrity: sha512-bWatwYnSIDs64fCYF+6+Kt+lVKPYsTuRpEKRAxR9b+gIGtdnS0veeEGQ15XBPPr8ZEYlyTKWCQ4LwTSIi16CPw==} + sst-linux-x64@3.17.14: + resolution: {integrity: sha512-fAaTdD6eP3kuNzkGVdYu3MOuNJkpm1rOH5Um2R2gbjtHwZ0QwP8r0f1d/ghP2kHXdgJqiNwqBbZmOuRCqmCuRA==} cpu: [x64] os: [linux] - sst-linux-x86@3.10.13: - resolution: {integrity: sha512-eBOABQf941uy9GZgY77hj5a8dRqmJ3u+7ZYRrGspev306i3bcI/1w4Rkid7KFYVDcouNw4UuOhuLQfS8z3Lpzw==} + sst-linux-x86@3.17.14: + resolution: {integrity: sha512-I0/IQmBk/4o1FVzMov9Ombxab4GzGNxGoyC3HTqDCRwC4jS9mnv5eTTpOQ57kGYehSnzUcflDPLZtVmKCc19+Q==} cpu: [x86] os: [linux] - sst@3.10.13: - resolution: {integrity: sha512-L1EkuKFikAspTJrBxM5PPARfziEnj1U7006qIr4aTO9gtqUjhj2FVgj9CDMlOQyy1Fi+dpY4bSTeo9ksqsn1Gw==} + sst-win32-arm64@3.17.14: + resolution: {integrity: sha512-fueSfZqrGcPlhN0Lm5HpmDcCKr+JmMBBBjt38HlRU08ekY7lB05QAWNXgyBwXxLdXqVIFHCUaO2Mf4K+SMCv9A==} + cpu: [arm64] + os: [win32] + + sst-win32-x64@3.17.14: + resolution: {integrity: sha512-DO8U5Uno2iD1N+AgJPde4nTP8oIeBI/rTaW5yuxJSW8cMMzySi9vQ45wz9vyZDteoHzmSwtnoC8QhZMgs0gVnQ==} + cpu: [x64] + os: [win32] + + sst-win32-x86@3.17.14: + resolution: {integrity: sha512-Q+QKLERFU05wzYpcIhGX0XaLe+jsMuh95IQnrGDU8f82LM1KdWY+a62BaY1J4lbGpNrdZO22GXwIcqrFZOw8qA==} + cpu: [x86] + os: [win32] + + sst@3.17.14: + resolution: {integrity: sha512-HkyMnBj55DZjzgNFoHQ1XPr9vXi2UHWz3TkuboyCybpJQcR7vW4za8uDDDPivAcUyqQe2aP8pzuxL6+cAztqsg==} hasBin: true stable-hash@0.0.5: @@ -12705,6 +12956,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -12883,7 +13138,7 @@ packages: superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} @@ -12940,8 +13195,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - tapable@2.2.3: - resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-stream@2.2.0: @@ -13039,6 +13294,10 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -13101,6 +13360,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -13111,6 +13373,10 @@ packages: peerDependencies: tslib: '2' + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + treeverse@3.0.0: resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -13199,6 +13465,28 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tsdown@0.15.6: + resolution: {integrity: sha512-W6++O3JeV9gm3JY6P/vLiC7zzTcJbZhQxXb+p3AvRMpDOPBIg82yXULyZCcwjsihY/bFG+Qw37HkezZbP7fzUg==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -13208,8 +13496,27 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' @@ -13320,6 +13627,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -13912,6 +14222,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -13948,6 +14261,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -15140,7 +15456,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.1 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15152,7 +15468,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.27.6 - debug: 4.4.1 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -15165,7 +15481,7 @@ snapshots: '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15398,7 +15714,7 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 chokidar: 3.6.0 hash-wasm: 4.12.0 inflection: 3.0.2 @@ -15515,12 +15831,6 @@ snapshots: '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) effect: 3.17.14 - '@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': - dependencies: - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - effect: 3.17.14 - '@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1)': dependencies: '@effect/platform': 0.91.1(effect@3.17.14) @@ -15559,18 +15869,6 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node-shared@0.49.2(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)': - dependencies: - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/platform': 0.91.1(effect@3.17.14) - '@parcel/watcher': 2.5.1 - effect: 3.17.14 - multipasta: 0.2.7 - ws: 8.18.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@effect/platform-node@0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': dependencies: '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) @@ -15586,19 +15884,6 @@ snapshots: - bufferutil - utf-8-validate - '@effect/platform-node@0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)': - dependencies: - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/platform-node-shared': 0.49.2(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - effect: 3.17.14 - mime: 3.0.0 - undici: 5.28.4 - ws: 8.18.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@effect/platform@0.91.1(effect@3.17.14)': dependencies: effect: 3.17.14 @@ -15639,6 +15924,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 @@ -15654,6 +15945,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -15677,7 +15973,7 @@ snapshots: '@esbuild-plugins/node-resolve@0.2.2(esbuild@0.25.5)': dependencies: '@types/resolve': 1.20.6 - debug: 4.4.1 + debug: 4.4.3 esbuild: 0.25.5 escape-string-regexp: 4.0.0 resolve: 1.22.10 @@ -16115,9 +16411,9 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.6.1))': dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -16125,7 +16421,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -16143,7 +16439,7 @@ snapshots: '@eslint/eslintrc@0.4.3': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 7.3.1 globals: 13.24.0 ignore: 4.0.6 @@ -16171,7 +16467,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -16289,7 +16585,7 @@ snapshots: '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -16316,7 +16612,7 @@ snapshots: '@antfu/install-pkg': 1.1.0 '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.1 @@ -16696,7 +16992,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -16721,7 +17017,7 @@ snapshots: '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -16890,11 +17186,11 @@ snapshots: dependencies: content-type: 1.0.5 cors: 2.8.5 - eventsource: 3.0.6 + eventsource: 3.0.7 express: 5.1.0 - express-rate-limit: 7.5.0(express@5.1.0) + express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 4.1.0 - raw-body: 3.0.0 + raw-body: 3.0.1 zod: 3.25.76 zod-to-json-schema: 3.24.3(zod@3.25.76) transitivePeerDependencies: @@ -16973,6 +17269,13 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true + '@napi-rs/wasm-runtime@1.0.6': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@netlify/binary-info@1.0.0': {} '@netlify/blobs@9.1.0': @@ -17023,7 +17326,7 @@ snapshots: '@netlify/zip-it-and-ship-it@10.1.0(encoding@0.1.13)(rollup@4.40.2)': dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 '@babel/types': 7.27.1 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 1.41.1 @@ -17489,7 +17792,7 @@ snapshots: '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -17601,7 +17904,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -17641,7 +17944,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.36.0 '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -17670,10 +17973,10 @@ snapshots: '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/semantic-conventions@1.32.0': {} - '@opentelemetry/semantic-conventions@1.36.0': {} + '@oxc-project/types@0.94.0': {} + '@panva/hkdf@1.2.1': {} '@paralleldrive/cuid2@2.2.2': @@ -17863,6 +18166,10 @@ snapshots: - ts-node - typescript + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + '@radix-ui/colors@3.0.0': {} '@radix-ui/number@1.1.1': {} @@ -18626,6 +18933,52 @@ snapshots: '@rive-app/canvas': 2.27.1 react: 19.1.1 + '@rolldown/binding-android-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + dependencies: + '@napi-rs/wasm-runtime': 1.0.6 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rollup/plugin-alias@5.1.1(rollup@4.40.2)': optionalDependencies: rollup: 4.40.2 @@ -18635,10 +18988,10 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.40.2 @@ -19350,11 +19703,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.4.2)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -19365,8 +19718,8 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -19493,12 +19846,12 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@storybook/builder-vite@10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4))': + '@storybook/builder-vite@10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: - '@storybook/csf-plugin': 10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + '@storybook/csf-plugin': 10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - esbuild - rollup @@ -19509,12 +19862,12 @@ snapshots: '@storybook/theming': 8.6.12(storybook@8.6.12(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.25.4 - esbuild-register: 3.6.0(esbuild@0.25.4) + esbuild: 0.25.5 + esbuild-register: 3.6.0(esbuild@0.25.5) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.1 + semver: 7.7.2 util: 0.12.5 ws: 8.18.2 optionalDependencies: @@ -19525,15 +19878,15 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4))': + '@storybook/csf-plugin@10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: storybook: 8.6.12(prettier@3.5.3) unplugin: 2.3.10 optionalDependencies: - esbuild: 0.25.4 + esbuild: 0.25.5 rollup: 4.40.2 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - webpack: 5.101.3(esbuild@0.25.4) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + webpack: 5.101.3(esbuild@0.25.5) '@storybook/csf-plugin@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: @@ -19668,7 +20021,7 @@ snapshots: - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/directive-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -19681,7 +20034,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 - vite: 6.1.4(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -19748,12 +20101,12 @@ snapshots: '@tanstack/router-utils@1.115.0': dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 ansis: 3.17.0 diff: 7.0.0 - '@tanstack/server-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/server-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -19762,7 +20115,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 - '@tanstack/directive-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + '@tanstack/directive-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 @@ -20009,6 +20362,11 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -20104,7 +20462,7 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree@1.0.7': {} @@ -20231,7 +20589,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@20.19.17': + '@types/node@20.19.19': dependencies: undici-types: 6.21.0 @@ -20376,15 +20734,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -20419,14 +20777,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -20466,12 +20824,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -20486,7 +20844,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.1 @@ -20537,13 +20895,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript @@ -20657,7 +21015,7 @@ snapshots: glob: 10.4.5 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.2 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -20689,7 +21047,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -20700,18 +21058,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -20729,14 +21087,14 @@ snapshots: '@virtual-grid/shared@2.0.1': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20985,7 +21343,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -21051,6 +21409,8 @@ snapshots: ansis@3.17.0: {} + ansis@4.2.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -21230,6 +21590,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.1.3: + dependencies: + '@babel/parser': 7.28.4 + pathe: 2.0.3 + ast-module-types@5.0.0: {} ast-types-flow@0.0.8: {} @@ -21342,7 +21707,7 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.27.6 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 @@ -21397,7 +21762,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.6: {} + baseline-browser-mapping@2.8.12: {} basic-auth@2.0.1: dependencies: @@ -21428,6 +21793,8 @@ snapshots: birpc@0.2.14: {} + birpc@2.6.1: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -21457,12 +21824,12 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1 + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -21504,13 +21871,13 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.5) - browserslist@4.26.2: + browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.6 - caniuse-lite: 1.0.30001743 - electron-to-chromium: 1.5.223 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.2) + baseline-browser-mapping: 2.8.12 + caniuse-lite: 1.0.30001748 + electron-to-chromium: 1.5.231 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) bs-logger@0.2.6: dependencies: @@ -21544,6 +21911,11 @@ snapshots: builtin-modules@3.3.0: {} + bundle-require@5.1.0(esbuild@0.25.5): + dependencies: + esbuild: 0.25.5 + load-tsconfig: 0.2.5 + bytes@3.1.2: {} c12@3.0.3(magicast@0.3.5): @@ -21630,6 +22002,8 @@ snapshots: caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001748: {} + canvas-confetti@1.9.3: {} castable-video@1.1.7: @@ -22060,10 +22434,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -22074,6 +22444,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decache@4.6.2: dependencies: callsite: 1.0.0 @@ -22227,6 +22601,8 @@ snapshots: diff@7.0.0: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -22304,6 +22680,8 @@ snapshots: '@planetscale/database': 1.19.0 mysql2: 3.14.1 + dts-resolver@2.1.2: {} + dub@0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76): dependencies: zod: 3.25.76 @@ -22333,7 +22711,7 @@ snapshots: electron-to-chromium@1.5.150: {} - electron-to-chromium@1.5.223: {} + electron-to-chromium@1.5.231: {} emittery@0.13.1: {} @@ -22345,6 +22723,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + enabled@2.0.0: {} encodeurl@1.0.2: {} @@ -22381,7 +22761,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.3 + tapable: 2.3.0 enquirer@2.4.1: dependencies: @@ -22536,11 +22916,18 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.4): dependencies: - debug: 4.4.1 + debug: 4.4.3 esbuild: 0.25.4 transitivePeerDependencies: - supports-color + esbuild-register@3.6.0(esbuild@0.25.5): + dependencies: + debug: 4.4.3 + esbuild: 0.25.5 + transitivePeerDependencies: + - supports-color + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -22758,19 +23145,19 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@15.5.3(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.5.3(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.5.3 '@rushstack/eslint-patch': 1.11.0 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.6.1)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -22795,18 +23182,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -22847,14 +23234,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -22916,7 +23303,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -22925,9 +23312,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -22939,7 +23326,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -22964,7 +23351,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -22974,7 +23361,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -22995,9 +23382,9 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.6.1)): dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: @@ -23021,7 +23408,7 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.6.1)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -23029,7 +23416,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.30.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -23174,9 +23561,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.30.1(jiti@2.4.2): + eslint@9.30.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 @@ -23212,7 +23599,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -23252,7 +23639,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx@3.0.1: dependencies: @@ -23265,7 +23652,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -23276,7 +23663,7 @@ snapshots: estree-util-value-to-estree@3.3.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-visit@2.0.0: dependencies: @@ -23303,11 +23690,11 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.1: {} + eventsource-parser@3.0.6: {} - eventsource@3.0.6: + eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.1 + eventsource-parser: 3.0.6 execa@5.1.1: dependencies: @@ -23361,7 +23748,7 @@ snapshots: exponential-backoff@3.1.2: {} - express-rate-limit@7.5.0(express@5.1.0): + express-rate-limit@7.5.1(express@5.1.0): dependencies: express: 5.1.0 @@ -23409,7 +23796,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -23427,7 +23814,7 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: @@ -23443,7 +23830,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -23517,6 +23904,14 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.4(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -23564,12 +23959,12 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -23598,6 +23993,12 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.40.2 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -23790,6 +24191,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.11.0: + dependencies: + resolve-pkg-maps: 1.0.0 + gif.js@0.2.0: {} giget@2.0.0: @@ -23999,7 +24404,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -24034,7 +24439,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -24117,7 +24522,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -24139,14 +24544,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -24172,6 +24577,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.1.13: {} ieee754@1.2.1: {} @@ -24242,7 +24651,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1 + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -24412,7 +24821,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -24494,7 +24903,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -24519,7 +24928,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -24813,7 +25222,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -24848,7 +25257,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.17 + '@types/node': 20.19.19 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -24875,6 +25284,8 @@ snapshots: jiti@2.4.2: {} + jiti@2.6.1: {} + jmespath@0.16.0: {} jose@4.15.9: {} @@ -24885,6 +25296,8 @@ snapshots: jose@5.6.3: {} + joycon@3.1.1: {} + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -25059,6 +25472,8 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 + load-tsconfig@0.2.5: {} + loader-runner@4.3.0: {} local-pkg@0.5.1: @@ -25106,6 +25521,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash.truncate@4.4.2: {} lodash.union@4.6.0: {} @@ -25183,6 +25600,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.2.11: dependencies: '@babel/parser': 7.27.5 @@ -25443,7 +25864,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -25454,7 +25875,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -25471,7 +25892,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -25507,7 +25928,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -25571,7 +25992,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -25609,7 +26030,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -25988,7 +26409,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 - esbuild: 0.25.4 + esbuild: 0.25.5 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.5 @@ -26018,7 +26439,7 @@ snapshots: rollup: 4.40.2 rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) scule: 1.3.0 - semver: 7.7.1 + semver: 7.7.2 serve-placeholder: 2.0.2 serve-static: 2.2.0 source-map: 0.7.4 @@ -26117,11 +26538,11 @@ snapshots: node-releases@2.0.19: {} - node-releases@2.0.21: {} + node-releases@2.0.23: {} node-source-walk@6.0.2: dependencies: - '@babel/parser': 7.27.5 + '@babel/parser': 7.28.4 nodemailer@6.10.1: {} @@ -26314,6 +26735,8 @@ snapshots: oidc-token-hash@5.1.0: {} + oidc-token-hash@5.1.1: {} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -26373,7 +26796,7 @@ snapshots: jose: 4.15.9 lru-cache: 6.0.0 object-hash: 2.2.0 - oidc-token-hash: 5.1.0 + oidc-token-hash: 5.1.1 openid-client@5.7.1: dependencies: @@ -26569,7 +26992,7 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} path-type@4.0.0: {} @@ -26665,6 +27088,14 @@ snapshots: postcss: 8.5.3 ts-node: 10.9.2(@types/node@22.15.17)(typescript@5.8.3) + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.3)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.6.1 + postcss: 8.5.3 + yaml: 2.8.1 + postcss-nested@6.2.0(postcss@8.5.3): dependencies: postcss: 8.5.3 @@ -26857,6 +27288,8 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + querystring@0.2.0: {} queue-microtask@1.2.3: {} @@ -26880,11 +27313,11 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 rc9@2.1.2: @@ -27147,7 +27580,7 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 @@ -27163,14 +27596,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -27221,7 +27654,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.3 transitivePeerDependencies: @@ -27285,7 +27718,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -27345,6 +27778,45 @@ snapshots: dependencies: glob: 7.2.3 + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.3 + birpc: 2.6.1 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.11.0 + magic-string: 0.30.19 + rolldown: 1.0.0-beta.42 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.42: + dependencies: + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.42 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-x64': 1.0.0-beta.42 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + rollup-plugin-inject@3.0.2: dependencies: estree-walker: 0.6.1 @@ -27358,7 +27830,7 @@ snapshots: rollup-plugin-visualizer@5.14.0(rollup@4.40.2): dependencies: open: 8.4.2 - picomatch: 4.0.2 + picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: @@ -27396,11 +27868,11 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -27445,7 +27917,7 @@ snapshots: scheduler@0.26.0: {} - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -27489,7 +27961,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -27499,7 +27971,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -27745,7 +28217,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -27840,6 +28312,10 @@ snapshots: source-map@0.7.4: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + sourcemap-codec@1.4.8: {} space-separated-tokens@2.0.2: {} @@ -27868,22 +28344,31 @@ snapshots: dependencies: minipass: 7.1.2 - sst-darwin-arm64@3.10.13: + sst-darwin-arm64@3.17.14: + optional: true + + sst-darwin-x64@3.17.14: optional: true - sst-darwin-x64@3.10.13: + sst-linux-arm64@3.17.14: optional: true - sst-linux-arm64@3.10.13: + sst-linux-x64@3.17.14: optional: true - sst-linux-x64@3.10.13: + sst-linux-x86@3.17.14: optional: true - sst-linux-x86@3.10.13: + sst-win32-arm64@3.17.14: optional: true - sst@3.10.13: + sst-win32-x64@3.17.14: + optional: true + + sst-win32-x86@3.17.14: + optional: true + + sst@3.17.14: dependencies: aws-sdk: 2.1692.0 aws4fetch: 1.0.18 @@ -27891,11 +28376,14 @@ snapshots: opencontrol: 0.0.6 openid-client: 5.6.4 optionalDependencies: - sst-darwin-arm64: 3.10.13 - sst-darwin-x64: 3.10.13 - sst-linux-arm64: 3.10.13 - sst-linux-x64: 3.10.13 - sst-linux-x86: 3.10.13 + sst-darwin-arm64: 3.17.14 + sst-darwin-x64: 3.17.14 + sst-linux-arm64: 3.17.14 + sst-linux-x64: 3.17.14 + sst-linux-x86: 3.17.14 + sst-win32-arm64: 3.17.14 + sst-win32-x64: 3.17.14 + sst-win32-x86: 3.17.14 transitivePeerDependencies: - supports-color @@ -27920,6 +28408,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.9.0: {} stdin-discarder@0.2.2: {} @@ -27931,16 +28421,16 @@ snapshots: stoppable@1.1.0: {} - storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.4)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)): + storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): dependencies: - '@storybook/builder-vite': 10.0.0-beta.9(esbuild@0.25.4)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.4)) + '@storybook/builder-vite': 10.0.0-beta.10(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.5.3)) magic-string: 0.30.17 solid-js: 1.9.6 storybook: 8.6.12(prettier@3.5.3) storybook-solidjs: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3)) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@storybook/test' - esbuild @@ -28126,7 +28616,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -28256,7 +28746,7 @@ snapshots: transitivePeerDependencies: - ts-node - tapable@2.2.3: {} + tapable@2.3.0: {} tar-stream@2.2.0: dependencies: @@ -28303,23 +28793,11 @@ snapshots: solid-js: 1.9.6 solid-use: 0.9.1(solid-js@1.9.6) - terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.101.3(esbuild@0.25.4)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.101.3(esbuild@0.25.4) - optionalDependencies: - esbuild: 0.25.4 - optional: true - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 webpack: 5.101.3(esbuild@0.25.5) @@ -28376,8 +28854,13 @@ snapshots: tinyglobby@0.2.13: dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.4(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.0.2: {} @@ -28423,6 +28906,10 @@ snapshots: tr46@0.0.3: {} + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -28431,6 +28918,8 @@ snapshots: dependencies: tslib: 2.8.1 + tree-kill@1.2.2: {} + treeverse@3.0.0: {} trim-lines@3.0.1: {} @@ -28525,12 +29014,65 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsdown@0.15.6(typescript@5.8.3): + dependencies: + ansis: 4.2.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.42 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + tslib@1.14.1: {} tslib@2.6.2: {} tslib@2.8.1: {} + tsup@8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.5) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.25.5 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.3)(yaml@2.8.1) + resolve-from: 5.0.0 + rollup: 4.40.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.3 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsutils@3.21.0(typescript@5.8.3): dependencies: tslib: 1.14.1 @@ -28539,7 +29081,7 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.4.1 + debug: 4.4.3 make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -28646,6 +29188,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 0.2.11 + uncrypto@0.1.3: {} unctx@2.4.1: @@ -28743,7 +29292,7 @@ snapshots: magic-string: 0.30.17 mlly: 1.7.4 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 pkg-types: 2.1.0 scule: 1.3.0 strip-literal: 3.0.0 @@ -28834,18 +29383,18 @@ snapshots: transitivePeerDependencies: - rollup - unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: fast-glob: 3.3.3 unplugin: 2.0.0-beta.1 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) unplugin-icons@0.19.3: dependencies: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/utils': 2.3.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 0.5.1 unplugin: 1.16.1 @@ -28855,7 +29404,7 @@ snapshots: unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 unplugin@1.16.1: dependencies: @@ -28877,7 +29426,7 @@ snapshots: unplugin@2.3.2: dependencies: acorn: 8.15.0 - picomatch: 4.0.2 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 unrs-resolver@1.7.2: @@ -28948,9 +29497,9 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.26.2): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -29061,7 +29610,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.4.2)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29095,7 +29644,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(ioredis@5.6.1) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -29157,7 +29706,7 @@ snapshots: - supports-color - terser - vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@babel/core': 7.27.1 '@types/babel__core': 7.20.5 @@ -29165,31 +29714,31 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.6 solid-refresh: 0.6.3(solid-js@1.9.6) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.5.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: debug: 4.4.0(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript @@ -29204,7 +29753,7 @@ snapshots: fsevents: 2.3.3 terser: 5.44.0 - vite@6.1.4(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.24.2 postcss: 8.5.3 @@ -29212,11 +29761,11 @@ snapshots: optionalDependencies: '@types/node': 22.15.17 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vite@6.3.5(@types/node@20.17.43)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -29227,11 +29776,11 @@ snapshots: optionalDependencies: '@types/node': 20.17.43 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -29242,13 +29791,13 @@ snapshots: optionalDependencies: '@types/node': 22.15.17 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1)): + vitefu@1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.4.2)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0): dependencies: @@ -29260,7 +29809,7 @@ snapshots: '@vitest/spy': 2.1.9 '@vitest/utils': 2.1.9 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) expect-type: 1.2.1 magic-string: 0.30.17 pathe: 1.1.2 @@ -29319,45 +29868,14 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} webpack-sources@3.3.3: {} webpack-virtual-modules@0.6.2: {} - webpack@5.101.3(esbuild@0.25.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 - terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.101.3(esbuild@0.25.4)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - optional: true - webpack@5.101.3(esbuild@0.25.5): dependencies: '@types/eslint-scope': 3.7.7 @@ -29368,7 +29886,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.2 + browserslist: 4.26.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -29380,8 +29898,8 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.3 + schema-utils: 4.3.3 + tapable: 2.3.0 terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)) watchpack: 2.4.4 webpack-sources: 3.3.3 @@ -29406,6 +29924,12 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 From b12b22197490d5fc5d84a95bcd88e690bc63085a Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 8 Oct 2025 00:38:47 +0800 Subject: [PATCH 02/25] workflow cluster stuff --- .npmrc | 1 + apps/effect-cluster/src/runner.ts | 84 -- apps/effect-cluster/tsconfig.json | 0 apps/effect-cluster/tsdown.config.ts | 6 - .../Dockerfile | 6 +- .../package.json | 9 +- apps/web-cluster/scripts/post-deploy.ts | 24 + .../src/health-check.ts | 0 apps/web-cluster/src/runner.ts | 84 ++ .../src/shard-manager.ts | 0 apps/web-cluster/tsconfig.json | 14 + apps/web/app/layout.tsx | 1 - apps/web/package.json | 6 - infra/package.json | 1 + infra/sst-env.d.ts | 14 +- infra/sst.config.ts | 162 ++-- package.json | 7 +- packages/database/package.json | 18 +- packages/database/tsdown.config.ts | 9 + packages/database/types/index.ts | 2 +- packages/env/build.ts | 73 +- packages/env/package.json | 6 + packages/env/tsdown.config.ts | 8 + packages/utils/package.json | 9 +- packages/utils/src/constants/s3.ts | 12 - packages/utils/src/index.ts | 1 - packages/utils/tsdown.config.ts | 8 + packages/web-backend/package.json | 6 + packages/web-backend/src/S3Buckets/index.ts | 4 +- packages/web-backend/tsdown.config.ts | 8 + packages/web-domain/package.json | 4 + packages/web-domain/tsdown.config.ts | 8 + pnpm-lock.yaml | 742 +++++++++++++++--- 33 files changed, 1020 insertions(+), 317 deletions(-) delete mode 100644 apps/effect-cluster/src/runner.ts delete mode 100644 apps/effect-cluster/tsconfig.json delete mode 100644 apps/effect-cluster/tsdown.config.ts rename apps/{effect-cluster => web-cluster}/Dockerfile (65%) rename apps/{effect-cluster => web-cluster}/package.json (71%) create mode 100644 apps/web-cluster/scripts/post-deploy.ts rename apps/{effect-cluster => web-cluster}/src/health-check.ts (100%) create mode 100644 apps/web-cluster/src/runner.ts rename apps/{effect-cluster => web-cluster}/src/shard-manager.ts (100%) create mode 100644 apps/web-cluster/tsconfig.json create mode 100644 packages/database/tsdown.config.ts create mode 100644 packages/env/tsdown.config.ts delete mode 100644 packages/utils/src/constants/s3.ts create mode 100644 packages/utils/tsdown.config.ts create mode 100644 packages/web-backend/tsdown.config.ts create mode 100644 packages/web-domain/tsdown.config.ts diff --git a/.npmrc b/.npmrc index ded82e2f63..ebaa63129a 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ auto-install-peers = true +inject-workspace-packages=true diff --git a/apps/effect-cluster/src/runner.ts b/apps/effect-cluster/src/runner.ts deleted file mode 100644 index 663fa1406f..0000000000 --- a/apps/effect-cluster/src/runner.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { createServer } from "node:http"; -import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; -import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; -import { - FetchHttpClient, - HttpApiBuilder, - HttpMiddleware, - HttpRouter, -} from "@effect/platform"; -import { - NodeClusterRunnerSocket, - NodeHttpServer, - NodeRuntime, -} from "@effect/platform-node"; -import { RpcServer } from "@effect/rpc"; -import { MysqlClient } from "@effect/sql-mysql2"; -import { WorkflowProxyServer } from "@effect/workflow"; -import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; -import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Config, Effect, Layer, Option } from "effect"; - -const SqlLayer = Layer.unwrapEffect( - Effect.gen(function* () { - const url = yield* Config.string("DATABASE_URL").pipe((v) => - Config.redacted(v), - ); - return MysqlClient.layer({ url }); - }), -); - -const ClusterWorkflowLive = ClusterWorkflowEngine.layer.pipe( - Layer.provide( - NodeClusterRunnerSocket.layer({ - storage: "sql", - shardingConfig: { - runnerAddress: Option.some(RunnerAddress.make("localhost", 42069)), - }, - }), - ), - Layer.provide(SqlLayer), -); - -const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( - Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), - Layer.provide(Workflows.WorkflowsLayer), - Layer.provide(ClusterWorkflowLive), -); -const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( - Layer.provide(Workflows.RpcSerialization), -); - -const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( - Layer.provide( - WorkflowProxyServer.layerHttpApi( - Workflows.Api, - "workflows", - Workflows.Workflows, - ), - ), - Layer.provide(Workflows.WorkflowsLayer), - Layer.provide(ClusterWorkflowLive), -); - -const TracingLayer = NodeSdk.layer(() => ({ - resource: { serviceName: "cap-workflow-runner" }, - spanProcessor: [new BatchSpanProcessor(new OTLPTraceExporter({}))], -})); - -const Main = HttpRouter.Default.serve(HttpMiddleware.logger) - .pipe( - Layer.provide(RpcsLive), - Layer.provide(RpcProtocol), - Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), - ) - .pipe( - Layer.provide(Videos.Default), - Layer.provide(S3Buckets.Default), - Layer.provide(Database.Default), - Layer.provide(FetchHttpClient.layer), - Layer.provide(TracingLayer), - ); - -NodeRuntime.runMain(Layer.launch(Main)); diff --git a/apps/effect-cluster/tsconfig.json b/apps/effect-cluster/tsconfig.json deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/effect-cluster/tsdown.config.ts b/apps/effect-cluster/tsdown.config.ts deleted file mode 100644 index 9b5e8456dd..0000000000 --- a/apps/effect-cluster/tsdown.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineConfig } from "tsdown"; - -export default defineConfig({ - entry: ["./src/runner.ts", "./src/shard-manager.ts"], - noExternal: [/(.*)/], -}); diff --git a/apps/effect-cluster/Dockerfile b/apps/web-cluster/Dockerfile similarity index 65% rename from apps/effect-cluster/Dockerfile rename to apps/web-cluster/Dockerfile index 5b606ec71d..65c618e7fe 100644 --- a/apps/effect-cluster/Dockerfile +++ b/apps/web-cluster/Dockerfile @@ -8,12 +8,14 @@ COPY . . RUN corepack enable pnpm RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i --frozen-lockfile -RUN pnpm run --filter=apps/effect-cluster build +RUN pnpm run --filter=@cap/web-cluster build +RUN pnpm deploy --filter=@cap/web-cluster out +RUN cd out && node scripts/post-deploy.ts FROM denoland/deno:2.5.3 AS runner WORKDIR /app -COPY --from=builder --chown=deno:deno /app/apps/effect-cluster/dist ./dist +COPY --from=builder --chown=deno:deno /app/out /app USER deno diff --git a/apps/effect-cluster/package.json b/apps/web-cluster/package.json similarity index 71% rename from apps/effect-cluster/package.json rename to apps/web-cluster/package.json index 61c2a1a6a2..0bfaa7e9b9 100644 --- a/apps/effect-cluster/package.json +++ b/apps/web-cluster/package.json @@ -1,10 +1,10 @@ { - "name": "@cap/effect-cluster", + "name": "@cap/web-cluster", "type": "module", "scripts": { - "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/index.ts", - "build": "tsdown", - "build:docker": "cd ../.. && docker build -f apps/effect-cluster/Dockerfile -t cap-effect-cluster ." + "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/runner.ts", + "build": "pnpm run --filter @cap/web-cluster^... build", + "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." }, "dependencies": { "@cap/web-backend": "workspace:*", @@ -13,6 +13,7 @@ "@effect/opentelemetry": "^0.56.1", "@effect/platform": "^0.91.1", "@effect/platform-node": "^0.96.1", + "@effect/platform-node-shared": "^0.51.4", "@effect/rpc": "^0.70.0", "@effect/sql-mysql2": "^0.45.1", "@effect/workflow": "^0.10.0", diff --git a/apps/web-cluster/scripts/post-deploy.ts b/apps/web-cluster/scripts/post-deploy.ts new file mode 100644 index 0000000000..1114d8a732 --- /dev/null +++ b/apps/web-cluster/scripts/post-deploy.ts @@ -0,0 +1,24 @@ +import { FileSystem } from "@effect/platform"; +import { NodeContext, NodeRuntime } from "@effect/platform-node"; +import { Effect } from "effect"; + +Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + + const dotPnpm = "./node_modules/.pnpm"; + const deps = yield* fs.readDirectory(dotPnpm); + const capDeps = deps.filter((dep) => dep.startsWith("@cap")); + + for (const key of capDeps) { + const pkgName = key.split("@file")[0].replace("+", "/"); + const pkgJsonPath = `${dotPnpm}/${key}/node_modules/${pkgName}/package.json`; + + let pkgJson = JSON.parse(yield* fs.readFileString(pkgJsonPath)); + + if (pkgJson.publishConfig) { + pkgJson = { ...pkgJson, ...pkgJson.publishConfig }; + } + + yield* fs.writeFileString(pkgJsonPath, JSON.stringify(pkgJson)); + } +}).pipe(Effect.provide(NodeContext.layer), NodeRuntime.runMain); diff --git a/apps/effect-cluster/src/health-check.ts b/apps/web-cluster/src/health-check.ts similarity index 100% rename from apps/effect-cluster/src/health-check.ts rename to apps/web-cluster/src/health-check.ts diff --git a/apps/web-cluster/src/runner.ts b/apps/web-cluster/src/runner.ts new file mode 100644 index 0000000000..963115d6a5 --- /dev/null +++ b/apps/web-cluster/src/runner.ts @@ -0,0 +1,84 @@ +import { createServer } from "node:http"; +// import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; +import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; +import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; +import { + FetchHttpClient, + HttpApiBuilder, + HttpMiddleware, + HttpRouter, +} from "@effect/platform"; +import { + NodeClusterRunnerSocket, + NodeHttpServer, + NodeRuntime, +} from "@effect/platform-node"; +import { RpcServer } from "@effect/rpc"; +import { MysqlClient } from "@effect/sql-mysql2"; +import { WorkflowProxyServer } from "@effect/workflow"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; +import { Config, Effect, Layer, Option } from "effect"; + +const SqlLayer = Layer.unwrapEffect( + Effect.gen(function* () { + const url = yield* Config.string("DATABASE_URL").pipe((v) => + Config.redacted(v), + ); + return MysqlClient.layer({ url }); + }), +); + +// const ClusterWorkflowLive = ClusterWorkflowEngine.layer.pipe( +// Layer.provide( +// NodeClusterRunnerSocket.layer({ +// storage: "sql", +// shardingConfig: { +// runnerAddress: Option.some(RunnerAddress.make("localhost", 42069)), +// }, +// }), +// ), +// Layer.provide(SqlLayer), +// ); + +// const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( +// Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), +// Layer.provide(Workflows.WorkflowsLayer), +// Layer.provide(ClusterWorkflowLive), +// ); +// const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( +// Layer.provide(Workflows.RpcSerialization), +// ); + +// const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( +// Layer.provide( +// WorkflowProxyServer.layerHttpApi( +// Workflows.Api, +// "workflows", +// Workflows.Workflows, +// ), +// ), +// Layer.provide(Workflows.WorkflowsLayer), +// Layer.provide(ClusterWorkflowLive), +// ); + +// const TracingLayer = NodeSdk.layer(() => ({ +// resource: { serviceName: "cap-workflow-runner" }, +// spanProcessor: [new BatchSpanProcessor(new OTLPTraceExporter({}))], +// })); + +// const Main = HttpRouter.Default.serve(HttpMiddleware.logger) +// .pipe( +// Layer.provide(RpcsLive), +// Layer.provide(RpcProtocol), +// Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), +// ) +// .pipe( +// Layer.provide(Videos.Default), +// Layer.provide(S3Buckets.Default), +// Layer.provide(Database.Default), +// Layer.provide(FetchHttpClient.layer), +// Layer.provide(TracingLayer), +// ); + +NodeRuntime.runMain(Layer.launch(SqlLayer)); diff --git a/apps/effect-cluster/src/shard-manager.ts b/apps/web-cluster/src/shard-manager.ts similarity index 100% rename from apps/effect-cluster/src/shard-manager.ts rename to apps/web-cluster/src/shard-manager.ts diff --git a/apps/web-cluster/tsconfig.json b/apps/web-cluster/tsconfig.json new file mode 100644 index 0000000000..d131471135 --- /dev/null +++ b/apps/web-cluster/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../packages/config/base.tsconfig.json", + "exclude": ["node_modules", "dist"], + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "moduleResolution": "bundler", + "composite": true, + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": true, + "module": "es2020", + "target": "es2020" + } +} diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 171da84762..2f10466c7f 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,7 +1,6 @@ import "@/app/globals.css"; import { getCurrentUser } from "@cap/database/auth/session"; import { buildEnv } from "@cap/env"; -import { S3_BUCKET_URL } from "@cap/utils"; import { Analytics as DubAnalytics } from "@dub/analytics/react"; import * as TooltipPrimitive from "@radix-ui/react-tooltip"; import type { Metadata } from "next"; diff --git a/apps/web/package.json b/apps/web/package.json index 4f5bc1c266..3e5e292b07 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -148,11 +148,5 @@ }, "engines": { "node": "20" - }, - "pnpm": { - "overrides": { - "@types/react": "19.1.13", - "@types/react-dom": "19.1.9" - } } } diff --git a/infra/package.json b/infra/package.json index e7c9233c97..0ad762a12f 100644 --- a/infra/package.json +++ b/infra/package.json @@ -8,6 +8,7 @@ }, "dependencies": { "@pulumi/github": "^6.7.0", + "@pulumi/pulumi": "^3.201.0", "@pulumiverse/vercel": "^1.14.3", "zod": "^3" } diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index a570b0cfe2..a379cd0421 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -5,7 +5,19 @@ declare module "sst" { export interface Resource { - "DATABASE_URL": { + "CAP_AWS_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "CAP_AWS_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "DATABASE_URL_HTTP": { + "type": "sst.sst.Secret" + "value": string + } + "DATABASE_URL_MYSQL": { "type": "sst.sst.Secret" "value": string } diff --git a/infra/sst.config.ts b/infra/sst.config.ts index 7594f68741..a106a3fe7d 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -26,7 +26,7 @@ export default $config({ }, cloudflare: true, aws: { - profile: "cap-dev", + profile: "cap-staging", }, planetscale: true, awsx: "2.21.1", @@ -39,6 +39,7 @@ export default $config({ staging: "https://staging.cap.so", }; const webUrl = WEB_URLS[$app.stage]; + const secrets = Secrets(); // const planetscale = Planetscale(); const recordingsBucket = new aws.s3.BucketV2("RecordingsBucket"); @@ -77,7 +78,7 @@ export default $config({ vercelEnvVar("VercelDatabaseURLEnv", { key: "DATABASE_URL", - value: new sst.Secret("DATABASE_URL").value, + value: secrets.DATABASE_URL_HTTP.value, }); if (webUrl) { @@ -177,10 +178,24 @@ export default $config({ value: vercelAwsAccessRole.arn, }); + // await WorkflowCluster(recordingsBucket, secrets); + // DiscordBot(); }, }); +function Secrets() { + return { + DATABASE_URL_HTTP: new sst.Secret("DATABASE_URL_HTTP"), + DATABASE_URL_MYSQL: new sst.Secret("DATABASE_URL_MYSQL"), + CAP_AWS_ACCESS_KEY: new sst.Secret("CAP_AWS_ACCESS_KEY"), + CAP_AWS_SECRET_KEY: new sst.Secret("CAP_AWS_SECRET_KEY"), + GITHUB_PAT: new sst.Secret("GITHUB_PAT"), + }; +} + +type Secrets = ReturnType; + // function Planetscale() { // const org = planetscale.getOrganizationOutput({ name: "cap" }); // const db = planetscale.getDatabaseOutput({ @@ -196,34 +211,36 @@ export default $config({ // return { org, db, branch }; // } -function DiscordBot() { - new sst.cloudflare.Worker("DiscordBotScript", { - handler: "../apps/discord-bot/src/index.ts", - transform: { - worker: (args) => { - args.name = "cap-discord-bot"; - args.kvNamespaceBindings = [ - { - name: "release_discord_interactions", - namespaceId: "846b080b86914e2ba666d35acee35c9a", - }, - ]; - args.secretTextBindings = [ - { - name: "DISCORD_BOT_TOKEN", - text: new sst.Secret("DISCORD_BOT_TOKEN").value, - }, - { - name: "GITHUB_APP_PRIVATE_KEY", - text: new sst.Secret("GITHUB_APP_PRIVATE_KEY").value, - }, - ]; - }, - }, - }); -} +// function DiscordBot() { +// new sst.cloudflare.Worker("DiscordBotScript", { +// handler: "../apps/discord-bot/src/index.ts", +// transform: { +// worker: (args) => { +// args.name = "cap-discord-bot"; +// args.kvNamespaceBindings = [ +// { +// name: "release_discord_interactions", +// namespaceId: "846b080b86914e2ba666d35acee35c9a", +// }, +// ]; +// args.secretTextBindings = [ +// { +// name: "DISCORD_BOT_TOKEN", +// text: new sst.Secret("DISCORD_BOT_TOKEN").value, +// }, +// { +// name: "GITHUB_APP_PRIVATE_KEY", +// text: new sst.Secret("GITHUB_APP_PRIVATE_KEY").value, +// }, +// ]; +// }, +// }, +// }); +// } + +async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { + const pulumi = await import("@pulumi/pulumi"); -function WorkflowCluster() { const vpc = new sst.aws.Vpc("Vpc", { nat: "ec2", }); @@ -242,10 +259,7 @@ function WorkflowCluster() { const securityGroup = new aws.ec2.SecurityGroup( "WorkflowClusterSecurityGroup", - { - vpcId: vpc.id, - description: "Security group for effect-cluster", - }, + { vpcId: vpc.id, description: "Security group for effect-cluster" }, ); new aws.vpc.SecurityGroupEgressRule("allow_all_traffic_ipv4", { securityGroupId: securityGroup.id, @@ -268,40 +282,86 @@ function WorkflowCluster() { cloudmapNamespaceName: privateDnsNamespace.name, }, }); + const commonEnvironment = { SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + CAP_AWS_REGION: bucket.region, + CAP_AWS_BUCKET: bucket.bucket, + DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, + CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, + CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, }; - const repository = new awsx.ecr.Repository("Repository", {}); - const image = new awsx.ecr.Image("image", { - repositoryUrl: repository.url, - // adjust path because sst run on ./sst/platform - context: "../../", - platform: "linux/amd64", + const ghcrCredentialsSecret = new aws.secretsmanager.Secret( + "GHCRCredentialsSecret", + { name: "GhcrCredentials" }, + ); + + new aws.secretsmanager.SecretVersion("GHCRCredentialsSecretVersion", { + secretId: ghcrCredentialsSecret.id, + secretString: secrets.GITHUB_PAT.value.apply((password) => + JSON.stringify({ + username: "brendonovich", + password, + }), + ), }); const shardManager = new sst.aws.Service("ShardManager", { cluster, + architecture: "arm64", containers: [ { name: "shard-manager", - image: image.imageUri, - command: ["dist/shard-manager.js"], + image: "ghcr.io/brendonovich/cap-web-cluster:latest", + command: ["src/shard-manager.ts"], environment: { ...commonEnvironment, }, }, ], - }); - - new sst.aws.Function("WorkflowClusterProxyLambda", { - vpc, - url: true, - timeout: "5 minutes", - link: [shardManager], - handler: "src/serverless/lambda.handler", - environment: { - SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + transform: { + taskRole(args) { + args.inlinePolicies = pulumi + .all([args.inlinePolicies ?? [], ghcrCredentialsSecret.arn]) + .apply(([policies, arn]) => { + policies.push({ + policy: JSON.stringify({ + Version: "2012-10-17", + Statement: [ + { + Effect: "Allow", + Action: ["secretsmanager:GetSecretValue"], + Resource: [arn], + }, + ], + }), + }); + return policies; + }); + }, + taskDefinition(args) { + args.containerDefinitions = pulumi + .all([ + $jsonParse(args.containerDefinitions), + ghcrCredentialsSecret.arn, + ]) + .apply(([def, arn]) => { + def[0].repositoryCredentials = { credentialsParameter: arn }; + return JSON.stringify(def); + }); + }, }, }); + + // new sst.aws.Function("WorkflowClusterProxyLambda", { + // vpc, + // url: true, + // timeout: "5 minutes", + // link: [shardManager], + // handler: "src/serverless/lambda.handler", + // environment: { + // SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + // }, + // }); } diff --git a/package.json b/package.json index 6e78a28f92..9baf9674d3 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@clack/prompts": "^0.10.0", "@effect/language-service": "^0.34.0", "dotenv-cli": "latest", - "prettier": "^3.5.3", + "tsdown": "^0.15.6", "turbo": "^2.3.4", "typescript": "^5.8.3" }, @@ -38,10 +38,5 @@ "name": "cap", "engines": { "node": "24" - }, - "pnpm": { - "overrides": { - "undici": "5.28.4" - } } } diff --git a/packages/database/package.json b/packages/database/package.json index e1d0acf02d..ead665bf83 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -12,7 +12,8 @@ "db:drop": "drizzle-kit drop --config=drizzle.config.ts", "db:studio": "drizzle-kit studio --config=drizzle.config.ts", "db:check-integrity": "node scripts/check-migration-integrity.js", - "drizzle-kit": "pnpm dotenv -e ../../.env drizzle-kit --config=drizzle.config.ts" + "drizzle-kit": "pnpm dotenv -e ../../.env drizzle-kit --config=drizzle.config.ts", + "build": "tsdown" }, "dependencies": { "@cap/env": "workspace:*", @@ -56,11 +57,18 @@ ".": "./index.ts", "./auth/auth-options": "./auth/auth-options.ts", "./auth/session": "./auth/session.ts", - "./emails/config": "./emails/config.ts", - "./emails/*": "./emails/*.tsx", "./schema": "./schema.ts", "./crypto": "./crypto.ts", - "./helpers": "./helpers.ts", - "./types": "./types/index.ts" + "./helpers": "./helpers.ts" + }, + "publishConfig": { + "exports": { + ".": "./dist/index.js", + "./auth/auth-options": "./dist/auth/auth-options.js", + "./auth/session": "./dist/auth/session.js", + "./schema": "./dist/schema.js", + "./crypto": "./dist/crypto.js", + "./helpers": "./dist/helpers.js" + } } } diff --git a/packages/database/tsdown.config.ts b/packages/database/tsdown.config.ts new file mode 100644 index 0000000000..033930a0e1 --- /dev/null +++ b/packages/database/tsdown.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "tsdown"; +import pkgJson from "./package.json" with { type: "json" }; + +export default defineConfig({ + entry: Object.values(pkgJson.exports).filter((s) => !s.includes("email")), + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/database/types/index.ts b/packages/database/types/index.ts index 599d032aa7..47ddf78fa8 100644 --- a/packages/database/types/index.ts +++ b/packages/database/types/index.ts @@ -1,3 +1,3 @@ export * from "./metadata"; -import "./next-auth"; +import type * as _ from "./next-auth"; diff --git a/packages/env/build.ts b/packages/env/build.ts index 0330a68ea9..b31378e299 100644 --- a/packages/env/build.ts +++ b/packages/env/build.ts @@ -5,35 +5,48 @@ export const NODE_ENV = process.env.NODE_ENV || ""; // Environment variables that are needed in the build process, and may be incorrect on the client. // Some are only provided by `NEXT_PUBLIC`, but others can be provdied at runtime -export const buildEnv = createEnv({ - client: { - NEXT_PUBLIC_IS_CAP: z.string().optional(), - NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(), - NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(), - NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), - NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), - NEXT_PUBLIC_WEB_URL: z.string(), - NEXT_PUBLIC_CAP_AWS_BUCKET: z.string(), - NEXT_PUBLIC_CAP_AWS_REGION: z.string(), - NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), - NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), - }, - runtimeEnv: { - NEXT_PUBLIC_IS_CAP: process.env.NEXT_PUBLIC_IS_CAP, - NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY, - NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST, - NEXT_PUBLIC_META_PIXEL_ID: process.env.NEXT_PUBLIC_META_PIXEL_ID, - NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, - NEXT_PUBLIC_WEB_URL: process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, - NEXT_PUBLIC_CAP_AWS_BUCKET: - process.env.CAP_AWS_BUCKET ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET, - NEXT_PUBLIC_CAP_AWS_REGION: - process.env.CAP_AWS_REGION ?? process.env.NEXT_PUBLIC_CAP_AWS_REGION, - NEXT_PUBLIC_CAP_AWS_ENDPOINT: - process.env.CAP_AWS_ENDPOINT ?? process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: - process.env.CAP_AWS_URL ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET_URL, - NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, +export const buildEnv = new Proxy({} as typeof _env, { + get(_, key) { + if (!_env) _env = create(); + + return (_env as any)[key]; }, }); + +let _env: ReturnType; + +const create = () => + createEnv({ + client: { + NEXT_PUBLIC_IS_CAP: z.string().optional(), + NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(), + NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(), + NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), + NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), + NEXT_PUBLIC_WEB_URL: z.string(), + NEXT_PUBLIC_CAP_AWS_BUCKET: z.string(), + NEXT_PUBLIC_CAP_AWS_REGION: z.string(), + NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), + NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), + NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), + }, + runtimeEnv: { + NEXT_PUBLIC_IS_CAP: process.env.NEXT_PUBLIC_IS_CAP, + NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY, + NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST, + NEXT_PUBLIC_META_PIXEL_ID: process.env.NEXT_PUBLIC_META_PIXEL_ID, + NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, + NEXT_PUBLIC_WEB_URL: + process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, + NEXT_PUBLIC_CAP_AWS_BUCKET: + process.env.CAP_AWS_BUCKET ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET, + NEXT_PUBLIC_CAP_AWS_REGION: + process.env.CAP_AWS_REGION ?? process.env.NEXT_PUBLIC_CAP_AWS_REGION, + NEXT_PUBLIC_CAP_AWS_ENDPOINT: + process.env.CAP_AWS_ENDPOINT ?? + process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, + NEXT_PUBLIC_CAP_AWS_BUCKET_URL: + process.env.CAP_AWS_URL ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET_URL, + NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, + }, + }); diff --git a/packages/env/package.json b/packages/env/package.json index 67a2d70897..926c67f70b 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -4,6 +4,12 @@ "type": "module", "main": "./index.ts", "types": "./index.ts", + "scripts": { + "build": "tsdown" + }, + "publishConfig": { + "main": "./dist/index.js" + }, "dependencies": { "@t3-oss/env-nextjs": "^0.12.0", "zod": "^3.25.76" diff --git a/packages/env/tsdown.config.ts b/packages/env/tsdown.config.ts new file mode 100644 index 0000000000..61e525d960 --- /dev/null +++ b/packages/env/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/utils/package.json b/packages/utils/package.json index 04ad441a21..0a055dc135 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,11 +3,12 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, "scripts": { - "typecheck": "tsc -b" + "typecheck": "tsc -b", + "build": "tsdown" + }, + "publishConfig": { + "main": "./dist/index.js" }, "devDependencies": { "react": "^19.1.1", diff --git a/packages/utils/src/constants/s3.ts b/packages/utils/src/constants/s3.ts deleted file mode 100644 index 85afc95797..0000000000 --- a/packages/utils/src/constants/s3.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { buildEnv } from "@cap/env"; - -export const S3_BUCKET_URL = (() => { - const fixedUrl = buildEnv.NEXT_PUBLIC_CAP_AWS_BUCKET_URL; - const endpoint = buildEnv.NEXT_PUBLIC_CAP_AWS_ENDPOINT; - const bucket = buildEnv.NEXT_PUBLIC_CAP_AWS_BUCKET; - const region = buildEnv.NEXT_PUBLIC_CAP_AWS_REGION; - - if (fixedUrl) return fixedUrl; - if (endpoint) return `${endpoint}/${bucket}`; - return `s3.${region}.amazonaws.com/${bucket}`; -})(); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 72c80b23de..c7ac6480ba 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,4 @@ export * from "./constants/plans.ts"; -export * from "./constants/s3.ts"; export * from "./helpers.ts"; export * from "./lib/stripe/stripe.ts"; export * from "./types/database.ts"; diff --git a/packages/utils/tsdown.config.ts b/packages/utils/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/utils/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/web-backend/package.json b/packages/web-backend/package.json index 167d9d37ae..79d9463167 100644 --- a/packages/web-backend/package.json +++ b/packages/web-backend/package.json @@ -4,6 +4,12 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "publishConfig": { + "main": "./dist/index.js" + }, + "scripts": { + "build": "tsdown" + }, "dependencies": { "@aws-sdk/client-s3": "^3.485.0", "@aws-sdk/cloudfront-signer": "^3.821.0", diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index a9badc16cd..94d0ff19b9 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -1,7 +1,6 @@ import * as S3 from "@aws-sdk/client-s3"; import * as CloudFrontPresigner from "@aws-sdk/cloudfront-signer"; import { decrypt } from "@cap/database/crypto"; -import { S3_BUCKET_URL } from "@cap/utils"; import type { S3Bucket, User } from "@cap/web-domain"; import { awsCredentialsProvider } from "@vercel/functions/oidc"; import { Config, Effect, Layer, Option } from "effect"; @@ -81,6 +80,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { distributionId: Config.string("CAP_CLOUDFRONT_DISTRIBUTION_ID"), keypairId: Config.string("CLOUDFRONT_KEYPAIR_ID"), privateKey: Config.string("CLOUDFRONT_KEYPAIR_PRIVATE_KEY"), + bucketUrl: Config.string("CAP_AWS_BUCKET_URL"), }).pipe( Effect.match({ onSuccess: (v) => v, @@ -95,7 +95,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Effect.succeed({ ...s3, getSignedObjectUrl: (key) => { - const url = `${S3_BUCKET_URL}/${key}`; + const url = `${cloudfrontEnvs.bucketUrl}/${key}`; const expires = Math.floor((Date.now() + 3600 * 1000) / 1000); const policy = { diff --git a/packages/web-backend/tsdown.config.ts b/packages/web-backend/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/web-backend/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/packages/web-domain/package.json b/packages/web-domain/package.json index 076222402b..ff8c8c8c72 100644 --- a/packages/web-domain/package.json +++ b/packages/web-domain/package.json @@ -4,7 +4,11 @@ "main": "./src/index.ts", "types": "./src/index.ts", "type": "module", + "publishConfig": { + "main": "./dist/index.js" + }, "scripts": { + "build": "tsdown", "generate-openapi": "node scripts/generate-openapi.ts" }, "dependencies": { diff --git a/packages/web-domain/tsdown.config.ts b/packages/web-domain/tsdown.config.ts new file mode 100644 index 0000000000..f111aa0fff --- /dev/null +++ b/packages/web-domain/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["./src/index.ts"], + platform: "node", + treeshake: true, + dts: false, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9149e30bf1..fc537df202 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,9 +3,7 @@ lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false - -overrides: - undici: 5.28.4 + injectWorkspacePackages: true importers: @@ -23,9 +21,9 @@ importers: dotenv-cli: specifier: latest version: 10.0.0 - prettier: - specifier: ^3.5.3 - version: 3.5.3 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.8.3) turbo: specifier: ^2.3.4 version: 2.5.3 @@ -40,13 +38,13 @@ importers: version: 2.1.4 '@cap/database': specifier: workspace:* - version: link:../../packages/database + version: file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) '@cap/ui-solid': specifier: workspace:* - version: link:../../packages/ui-solid + version: file:packages/ui-solid(@fontsource/geist-sans@5.2.5) '@cap/utils': specifier: workspace:* - version: link:../../packages/utils + version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/web-api-contract': specifier: workspace:* version: link:../../packages/web-api-contract @@ -287,63 +285,11 @@ importers: specifier: ^3.109.1 version: 3.114.8(@cloudflare/workers-types@4.20250507.0) - apps/effect-cluster: - dependencies: - '@cap/web-backend': - specifier: workspace:* - version: link:../../packages/web-backend - '@cap/web-domain': - specifier: workspace:* - version: link:../../packages/web-domain - '@effect/cluster': - specifier: ^0.49.1 - version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/opentelemetry': - specifier: ^0.56.1 - version: 0.56.1(@effect/platform@0.91.1(effect@3.17.14))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.14) - '@effect/platform': - specifier: ^0.91.1 - version: 0.91.1(effect@3.17.14) - '@effect/platform-node': - specifier: ^0.96.1 - version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/rpc': - specifier: ^0.70.0 - version: 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - '@effect/sql-mysql2': - specifier: ^0.45.1 - version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/workflow': - specifier: ^0.10.0 - version: 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@opentelemetry/exporter-trace-otlp-http': - specifier: ^0.203.0 - version: 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': - specifier: ^2.0.1 - version: 2.0.1(@opentelemetry/api@1.9.0) - effect: - specifier: ^3.17.14 - version: 3.17.14 - rolldown: - specifier: 1.0.0-beta.42 - version: 1.0.0-beta.42 - tsdown: - specifier: ^0.15.6 - version: 0.15.6(typescript@5.8.3) - tsup: - specifier: ^8.5.0 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) - devDependencies: - dotenv-cli: - specifier: ^10.0.0 - version: 10.0.0 - apps/storybook: dependencies: '@cap/ui-solid': specifier: workspace:* - version: link:../../packages/ui-solid + version: file:packages/ui-solid(@fontsource/geist-sans@5.2.5) postcss-pseudo-companion-classes: specifier: ^0.1.1 version: 0.1.1(postcss@8.5.3) @@ -498,25 +444,25 @@ importers: version: 3.804.0 '@cap/database': specifier: workspace:* - version: link:../../packages/database + version: file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/env': specifier: workspace:* version: link:../../packages/env '@cap/ui': specifier: workspace:* - version: link:../../packages/ui + version: file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3)))(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/utils': specifier: workspace:* version: link:../../packages/utils '@cap/web-api-contract': specifier: workspace:* - version: link:../../packages/web-api-contract + version: file:packages/web-api-contract(@types/node@20.17.43) '@cap/web-api-contract-effect': specifier: workspace:* version: link:../../packages/web-api-contract-effect '@cap/web-backend': specifier: workspace:* - version: link:../../packages/web-backend + version: file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/web-domain': specifier: workspace:* version: link:../../packages/web-domain @@ -744,7 +690,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -876,11 +822,69 @@ importers: specifier: ^5.8.3 version: 5.8.3 + apps/web-cluster: + dependencies: + '@cap/web-backend': + specifier: workspace:* + version: file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + '@cap/web-domain': + specifier: workspace:* + version: link:../../packages/web-domain + '@effect/cluster': + specifier: ^0.49.1 + version: 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/opentelemetry': + specifier: ^0.56.1 + version: 0.56.1(@effect/platform@0.91.1(effect@3.17.14))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.14) + '@effect/platform': + specifier: ^0.91.1 + version: 0.91.1(effect@3.17.14) + '@effect/platform-node': + specifier: ^0.96.1 + version: 0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/platform-node-shared': + specifier: ^0.51.4 + version: 0.51.4(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/rpc': + specifier: ^0.70.0 + version: 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@effect/sql-mysql2': + specifier: ^0.45.1 + version: 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/workflow': + specifier: ^0.10.0 + version: 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.203.0 + version: 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': + specifier: ^2.0.1 + version: 2.0.1(@opentelemetry/api@1.9.0) + effect: + specifier: ^3.17.14 + version: 3.17.14 + rolldown: + specifier: 1.0.0-beta.42 + version: 1.0.0-beta.42 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.8.3) + tsup: + specifier: ^8.5.0 + version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) + devDependencies: + dotenv-cli: + specifier: ^10.0.0 + version: 10.0.0 + infra: dependencies: '@pulumi/github': specifier: ^6.7.0 version: 6.7.2(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': + specifier: ^3.201.0 + version: 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) '@pulumiverse/vercel': specifier: ^1.14.3 version: 1.14.3(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) @@ -1003,7 +1007,7 @@ importers: devDependencies: '@cap/ui': specifier: workspace:* - version: link:../ui + version: file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/utils': specifier: workspace:* version: link:../utils @@ -1062,7 +1066,7 @@ importers: dependencies: '@cap/utils': specifier: workspace:* - version: link:../utils + version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@kobalte/tailwindcss': specifier: ^0.9.0 version: 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) @@ -1302,10 +1306,10 @@ importers: version: 3.804.0 '@cap/database': specifier: workspace:* - version: link:../database + version: file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) '@cap/utils': specifier: workspace:* - version: link:../utils + version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) '@cap/web-domain': specifier: workspace:* version: link:../web-domain @@ -1892,6 +1896,35 @@ packages: cpu: [x64] os: [win32] + '@cap/database@file:packages/database': + resolution: {directory: packages/database, type: directory} + engines: {node: '20'} + + '@cap/env@file:packages/env': + resolution: {directory: packages/env, type: directory} + + '@cap/ui-solid@file:packages/ui-solid': + resolution: {directory: packages/ui-solid, type: directory} + peerDependencies: + '@fontsource/geist-sans': ^5.0.3 + + '@cap/ui@file:packages/ui': + resolution: {directory: packages/ui, type: directory} + engines: {node: '20'} + + '@cap/utils@file:packages/utils': + resolution: {directory: packages/utils, type: directory} + engines: {node: '20'} + + '@cap/web-api-contract@file:packages/web-api-contract': + resolution: {directory: packages/web-api-contract, type: directory} + + '@cap/web-backend@file:packages/web-backend': + resolution: {directory: packages/web-backend, type: directory} + + '@cap/web-domain@file:packages/web-domain': + resolution: {directory: packages/web-domain, type: directory} + '@chromatic-com/storybook@1.9.0': resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} engines: {node: '>=16.0.0', yarn: '>=1.22.18'} @@ -2180,6 +2213,15 @@ packages: '@effect/sql': ^0.44.2 effect: ^3.17.13 + '@effect/platform-node-shared@0.51.4': + resolution: {integrity: sha512-xElU9+cNPa1BnUHAZ3sVVanuuKof8oWQhK7rbyHNqgWM7CZTjv7x9VMDs0X05+1OcTQnnW3E+SrZKIPCfcYlDQ==} + peerDependencies: + '@effect/cluster': ^0.50.3 + '@effect/platform': ^0.92.1 + '@effect/rpc': ^0.71.0 + '@effect/sql': ^0.46.0 + effect: ^3.18.2 + '@effect/platform-node@0.96.1': resolution: {integrity: sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==} peerDependencies: @@ -4507,9 +4549,9 @@ packages: '@pulumi/github@6.7.2': resolution: {integrity: sha512-dsaCLKQXqTVChE5gsowDoI7J3ZcN+WQ2zamFqHeYbSTJ2NJ06ENK+INkwbrUnEqtLA5t6lfOIu2F97Yz0+LsRQ==} - '@pulumi/pulumi@3.167.0': - resolution: {integrity: sha512-nqqG9ya86CO8eRpPSL34K0NWhQbH2hXAlVo+lCvi7I51nKFqaJITvfgfVEqwKU0g3KJspK8ZG0/1OZBRe0Dogg==} - engines: {node: '>=18'} + '@pulumi/pulumi@3.201.0': + resolution: {integrity: sha512-iLg3Z9lCxJ15N/3rfsPPW5J6NdzH4TcM5uz8v6q179C0SOCAMPHGnxovOpZldB5k689jT9alrw80gvL2VprD0g==} + engines: {node: '>=20'} peerDependencies: ts-node: '>= 7.0.1 < 12' typescript: '>= 3.8.3 < 6' @@ -13331,6 +13373,10 @@ packages: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -13655,6 +13701,14 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + unenv@1.10.0: resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} @@ -15537,6 +15591,454 @@ snapshots: '@biomejs/cli-win32-x64@2.2.0': optional: true + '@cap/database@file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': + dependencies: + '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/web-domain': file:packages/web-domain + '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@mattrax/mysql-planetscale': 0.0.3 + '@paralleldrive/cuid2': 2.2.2 + '@planetscale/database': 1.19.0 + '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/tailwind': 1.0.5(react@19.1.1) + drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) + effect: 3.17.14 + nanoid: 5.1.5 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next-auth: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-email: 4.2.11 + resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + zod: 3.25.76 + transitivePeerDependencies: + - '@auth/core' + - '@aws-sdk/client-rds-data' + - '@babel/core' + - '@cloudflare/workers-types' + - '@effect/experimental' + - '@effect/platform' + - '@effect/sql' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@modelcontextprotocol/sdk' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@playwright/test' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - babel-plugin-macros + - babel-plugin-react-compiler + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - nodemailer + - pg + - postgres + - prisma + - react + - react-dom + - sass + - sql.js + - sqlite3 + - supports-color + - typescript + - utf-8-validate + - valibot + + '@cap/database@file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/web-domain': file:packages/web-domain + '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@mattrax/mysql-planetscale': 0.0.3 + '@paralleldrive/cuid2': 2.2.2 + '@planetscale/database': 1.19.0 + '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/tailwind': 1.0.5(react@19.1.1) + drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) + effect: 3.17.14 + nanoid: 5.1.5 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next-auth: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-email: 4.2.11 + resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + zod: 3.25.76 + transitivePeerDependencies: + - '@auth/core' + - '@aws-sdk/client-rds-data' + - '@babel/core' + - '@cloudflare/workers-types' + - '@effect/experimental' + - '@effect/platform' + - '@effect/sql' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@modelcontextprotocol/sdk' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@playwright/test' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - babel-plugin-macros + - babel-plugin-react-compiler + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - nodemailer + - pg + - postgres + - prisma + - react + - react-dom + - sass + - sql.js + - sqlite3 + - supports-color + - typescript + - utf-8-validate + - valibot + + '@cap/database@file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': + dependencies: + '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/web-domain': file:packages/web-domain + '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@mattrax/mysql-planetscale': 0.0.3 + '@paralleldrive/cuid2': 2.2.2 + '@planetscale/database': 1.19.0 + '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/tailwind': 1.0.5(react@19.1.1) + drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) + effect: 3.17.14 + nanoid: 5.1.5 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next-auth: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-email: 4.2.11 + resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + zod: 3.25.76 + transitivePeerDependencies: + - '@auth/core' + - '@aws-sdk/client-rds-data' + - '@babel/core' + - '@cloudflare/workers-types' + - '@effect/experimental' + - '@effect/platform' + - '@effect/sql' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@modelcontextprotocol/sdk' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@playwright/test' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - babel-plugin-macros + - babel-plugin-react-compiler + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - nodemailer + - pg + - postgres + - prisma + - react + - react-dom + - sass + - sql.js + - sqlite3 + - supports-color + - typescript + - utf-8-validate + - valibot + + '@cap/env@file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@t3-oss/env-nextjs': 0.12.0(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - typescript + - valibot + + '@cap/ui-solid@file:packages/ui-solid(@fontsource/geist-sans@5.2.5)': + dependencies: + '@fontsource/geist-sans': 5.2.5 + '@kobalte/core': 0.13.9(solid-js@1.9.6) + cva: class-variance-authority@0.7.1 + solid-js: 1.9.6 + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3)) + zod: 3.25.76 + transitivePeerDependencies: + - ts-node + + '@cap/ui@file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3)))(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@kobalte/tailwindcss': 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) + '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dropdown-menu': 2.1.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-label': 2.1.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-navigation-menu': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popover': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-switch': 1.2.4(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tailwindcss/typography': 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + cmdk: 0.2.1(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + lucide-react: 0.294.0(react@19.1.1) + react-hook-form: 7.56.2(react@19.1.1) + react-loading-skeleton: 3.5.0(react@19.1.1) + zod: 3.25.76 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - aws-crt + - react + - react-dom + - tailwindcss + - typescript + - valibot + + '@cap/ui@file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@kobalte/tailwindcss': 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))) + '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-dropdown-menu': 2.1.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-label': 2.1.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-navigation-menu': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popover': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-switch': 1.2.4(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tailwindcss/typography': 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + cmdk: 0.2.1(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + lucide-react: 0.294.0(react@19.1.1) + react-hook-form: 7.56.2(react@19.1.1) + react-loading-skeleton: 3.5.0(react@19.1.1) + zod: 3.25.76 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - aws-crt + - react + - react-dom + - tailwindcss + - typescript + - valibot + + '@cap/utils@file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@aws-sdk/client-s3': 3.804.0 + '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + clsx: 2.1.1 + stripe: 14.25.0 + tailwind-merge: 2.6.0 + zod: 3.25.76 + transitivePeerDependencies: + - aws-crt + - typescript + - valibot + + '@cap/web-api-contract@file:packages/web-api-contract(@types/node@20.17.43)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@20.17.43)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - '@types/node' + + '@cap/web-backend@file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': + dependencies: + '@aws-sdk/client-s3': 3.804.0 + '@aws-sdk/cloudfront-signer': 3.821.0 + '@aws-sdk/s3-presigned-post': 3.804.0 + '@aws-sdk/s3-request-presigner': 3.804.0 + '@cap/database': file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/web-domain': file:packages/web-domain + '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/platform': 0.91.1(effect@3.17.14) + '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@smithy/types': 4.3.1 + '@vercel/functions': 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + effect: 3.17.14 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + server-only: 0.0.1 + transitivePeerDependencies: + - '@auth/core' + - '@aws-sdk/client-rds-data' + - '@aws-sdk/credential-provider-web-identity' + - '@babel/core' + - '@cloudflare/workers-types' + - '@effect/experimental' + - '@effect/sql' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@modelcontextprotocol/sdk' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@playwright/test' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - aws-crt + - babel-plugin-macros + - babel-plugin-react-compiler + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - nodemailer + - pg + - postgres + - prisma + - react + - react-dom + - sass + - sql.js + - sqlite3 + - supports-color + - typescript + - utf-8-validate + - valibot + + '@cap/web-backend@file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': + dependencies: + '@aws-sdk/client-s3': 3.804.0 + '@aws-sdk/cloudfront-signer': 3.821.0 + '@aws-sdk/s3-presigned-post': 3.804.0 + '@aws-sdk/s3-request-presigner': 3.804.0 + '@cap/database': file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + '@cap/web-domain': file:packages/web-domain + '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/platform': 0.91.1(effect@3.17.14) + '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@smithy/types': 4.3.1 + '@vercel/functions': 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + effect: 3.17.14 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + server-only: 0.0.1 + transitivePeerDependencies: + - '@auth/core' + - '@aws-sdk/client-rds-data' + - '@aws-sdk/credential-provider-web-identity' + - '@babel/core' + - '@cloudflare/workers-types' + - '@effect/experimental' + - '@effect/sql' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@modelcontextprotocol/sdk' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@playwright/test' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - aws-crt + - babel-plugin-macros + - babel-plugin-react-compiler + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - nodemailer + - pg + - postgres + - prisma + - react + - react-dom + - sass + - sql.js + - sqlite3 + - supports-color + - typescript + - utf-8-validate + - valibot + + '@cap/web-domain@file:packages/web-domain': + dependencies: + '@effect/platform': 0.91.1(effect@3.17.14) + '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + effect: 3.17.14 + '@chromatic-com/storybook@1.9.0(react@19.1.1)': dependencies: chromatic: 11.28.2 @@ -15869,6 +16371,19 @@ snapshots: - bufferutil - utf-8-validate + '@effect/platform-node-shared@0.51.4(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': + dependencies: + '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) + '@effect/platform': 0.91.1(effect@3.17.14) + '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) + '@parcel/watcher': 2.5.1 + effect: 3.17.14 + multipasta: 0.2.7 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@effect/platform-node@0.96.1(@effect/cluster@0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14)': dependencies: '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) @@ -15878,7 +16393,7 @@ snapshots: '@effect/sql': 0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) effect: 3.17.14 mime: 3.0.0 - undici: 5.28.4 + undici: 7.16.0 ws: 8.18.2 transitivePeerDependencies: - bufferutil @@ -17103,7 +17618,7 @@ snapshots: '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -17119,7 +17634,7 @@ snapshots: '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': dependencies: consola: 3.4.2 - detect-libc: 2.0.4 + detect-libc: 2.1.1 https-proxy-agent: 7.0.6 node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 @@ -18113,14 +18628,14 @@ snapshots: '@pulumi/github@6.7.2(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@pulumi/pulumi@3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': + '@pulumi/pulumi@3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@grpc/grpc-js': 1.13.3 '@logdna/tail-file': 2.2.0 @@ -18136,7 +18651,7 @@ snapshots: '@types/semver': 7.7.0 '@types/tmp': 0.2.6 execa: 5.1.1 - fdir: 6.4.4(picomatch@3.0.1) + fdir: 6.5.0(picomatch@3.0.1) google-protobuf: 3.21.4 got: 11.8.6 ini: 2.0.0 @@ -18146,9 +18661,9 @@ snapshots: picomatch: 3.0.1 pkg-dir: 7.0.0 require-from-string: 2.0.2 - semver: 7.7.1 + semver: 7.7.2 source-map-support: 0.5.21 - tmp: 0.2.3 + tmp: 0.2.5 upath: 1.2.0 optionalDependencies: ts-node: 10.9.2(@types/node@22.15.17)(typescript@5.8.3) @@ -18159,7 +18674,7 @@ snapshots: '@pulumiverse/vercel@1.14.3(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.167.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color @@ -18988,7 +19503,7 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.4(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 picomatch: 4.0.3 @@ -19869,7 +20384,7 @@ snapshots: recast: 0.23.11 semver: 7.7.2 util: 0.12.5 - ws: 8.18.2 + ws: 8.18.3 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -20412,7 +20927,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/responselike': 1.0.3 '@types/canvas-confetti@1.9.0': {} @@ -20535,7 +21050,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/koa-compose@3.2.8': dependencies: @@ -20640,7 +21155,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 '@types/semver@7.7.0': {} @@ -20694,7 +21209,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.19 optional: true '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': @@ -22527,13 +23042,13 @@ snapshots: detect-libc@1.0.3: {} - detect-libc@2.0.4: {} + detect-libc@2.0.4: + optional: true detect-libc@2.1.0: optional: true - detect-libc@2.1.1: - optional: true + detect-libc@2.1.1: {} detect-newline@3.1.0: {} @@ -23896,10 +24411,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.4(picomatch@3.0.1): - optionalDependencies: - picomatch: 3.0.1 - fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -23908,6 +24419,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@3.0.1): + optionalDependencies: + picomatch: 3.0.1 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -23995,7 +24510,7 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: - magic-string: 0.30.17 + magic-string: 0.30.19 mlly: 1.7.4 rollup: 4.40.2 @@ -26111,7 +26626,7 @@ snapshots: exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 - undici: 5.28.4 + undici: 5.29.0 workerd: 1.20250408.0 ws: 8.18.0 youch: 3.3.4 @@ -26308,6 +26823,23 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 + next-auth@4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@babel/runtime': 7.27.1 + '@panva/hkdf': 1.2.1 + cookie: 0.7.2 + jose: 4.15.9 + next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + oauth: 0.9.15 + openid-client: 5.7.1 + preact: 10.26.6 + preact-render-to-string: 5.2.6(preact@10.26.6) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + uuid: 8.3.2 + optionalDependencies: + nodemailer: 6.10.1 + next-auth@4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 @@ -27249,7 +27781,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.17.43 + '@types/node': 20.19.19 long: 5.3.2 proxy-addr@2.0.7: @@ -28886,6 +29418,8 @@ snapshots: tmp@0.2.3: {} + tmp@0.2.5: {} + tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -29062,7 +29596,7 @@ snapshots: source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 + tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.3 @@ -29218,6 +29752,12 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@7.16.0: {} + unenv@1.10.0: dependencies: consola: 3.4.2 @@ -29296,7 +29836,7 @@ snapshots: pkg-types: 2.1.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.15 unplugin: 2.3.10 unplugin-utils: 0.2.4 From fe273ee7a0c6a79d2fa89a742458e6117009b9eb Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 8 Oct 2025 18:40:45 +0800 Subject: [PATCH 03/25] fix vercel deploy --- .npmrc | 1 - apps/web-cluster/Dockerfile | 4 + apps/web-cluster/package.json | 2 +- .../src/cluster/container-metadata.ts | 66 +++ apps/web-cluster/src/runner.ts | 84 --- apps/web-cluster/src/runner/health-server.ts | 22 + apps/web-cluster/src/runner/index.ts | 120 ++++ apps/web/instrumentation.node.ts | 57 +- apps/web/lib/tracing.ts | 9 +- apps/web/next.config.mjs | 9 +- infra/sst-env.d.ts | 19 + infra/sst.config.ts | 247 +++++---- packages/database/package.json | 5 +- packages/env/build.ts | 20 +- packages/web-backend/src/Loom/Http.ts | 1 + pnpm-lock.yaml | 523 +----------------- 16 files changed, 447 insertions(+), 742 deletions(-) create mode 100644 apps/web-cluster/src/cluster/container-metadata.ts delete mode 100644 apps/web-cluster/src/runner.ts create mode 100644 apps/web-cluster/src/runner/health-server.ts create mode 100644 apps/web-cluster/src/runner/index.ts diff --git a/.npmrc b/.npmrc index ebaa63129a..ded82e2f63 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ auto-install-peers = true -inject-workspace-packages=true diff --git a/apps/web-cluster/Dockerfile b/apps/web-cluster/Dockerfile index 65c618e7fe..7027d8c3c5 100644 --- a/apps/web-cluster/Dockerfile +++ b/apps/web-cluster/Dockerfile @@ -6,6 +6,10 @@ WORKDIR /app COPY . . RUN corepack enable pnpm + +RUN echo "inject-workspace-packages=true" >> .npmrc +RUN pnpm i --lockfile-only + RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i --frozen-lockfile RUN pnpm run --filter=@cap/web-cluster build diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index 0bfaa7e9b9..daadc3cf3f 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -2,7 +2,7 @@ "name": "@cap/web-cluster", "type": "module", "scripts": { - "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/runner.ts", + "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/runner/index.ts", "build": "pnpm run --filter @cap/web-cluster^... build", "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." }, diff --git a/apps/web-cluster/src/cluster/container-metadata.ts b/apps/web-cluster/src/cluster/container-metadata.ts new file mode 100644 index 0000000000..7b79f95bd0 --- /dev/null +++ b/apps/web-cluster/src/cluster/container-metadata.ts @@ -0,0 +1,66 @@ +import { Config, Data, Effect, Option } from "effect"; + +export class FetchIpError extends Data.TaggedError("FetchIpError")<{}> {} + +class EcsContainerMetadata extends Effect.Service()( + "EcsContainerMetadata", + { + effect: Effect.gen(function* () { + return { + metadataUri: yield* Config.option( + Config.string("ECS_CONTAINER_METADATA_URI_V4"), + ), + }; + }), + }, +) {} + +export const privateIp = EcsContainerMetadata.pipe( + Effect.flatMap(({ metadataUri }) => + Option.match(metadataUri, { + onNone: () => Effect.succeed("0.0.0.0"), + onSome: (uri) => + Effect.tryPromise({ + try: async () => { + const response = await fetch(`${uri}/task`); + const data = await response.json(); + return data.Containers[0].Networks[0].IPv4Addresses[0] as string; + }, + catch: (error) => { + console.error("error", error); + return new FetchIpError(); + }, + }), + }), + ), +); + +export class ContainerMetadata extends Effect.Service()( + "ContainerMetadata", + { + effect: Effect.gen(function* () { + const containerMetadata = yield* EcsContainerMetadata; + const metadataUri = containerMetadata.metadataUri; + const ipAddress = yield* Option.match(metadataUri, { + onNone: () => Effect.succeed("0.0.0.0"), + onSome: (uri) => + Effect.tryPromise({ + try: async () => { + const response = await fetch(`${uri}/task`); + const data = await response.json(); + return data.Containers[0].Networks[0].IPv4Addresses[0] as string; + }, + catch: (error) => { + console.error("error", error); + return new FetchIpError(); + }, + }), + }); + + const port = yield* Config.number("PORT").pipe(Config.withDefault(42069)); + + return { ipAddress, port }; + }), + dependencies: [EcsContainerMetadata.Default], + }, +) {} diff --git a/apps/web-cluster/src/runner.ts b/apps/web-cluster/src/runner.ts deleted file mode 100644 index 963115d6a5..0000000000 --- a/apps/web-cluster/src/runner.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { createServer } from "node:http"; -// import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; -import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; -import { - FetchHttpClient, - HttpApiBuilder, - HttpMiddleware, - HttpRouter, -} from "@effect/platform"; -import { - NodeClusterRunnerSocket, - NodeHttpServer, - NodeRuntime, -} from "@effect/platform-node"; -import { RpcServer } from "@effect/rpc"; -import { MysqlClient } from "@effect/sql-mysql2"; -import { WorkflowProxyServer } from "@effect/workflow"; -import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; -import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Config, Effect, Layer, Option } from "effect"; - -const SqlLayer = Layer.unwrapEffect( - Effect.gen(function* () { - const url = yield* Config.string("DATABASE_URL").pipe((v) => - Config.redacted(v), - ); - return MysqlClient.layer({ url }); - }), -); - -// const ClusterWorkflowLive = ClusterWorkflowEngine.layer.pipe( -// Layer.provide( -// NodeClusterRunnerSocket.layer({ -// storage: "sql", -// shardingConfig: { -// runnerAddress: Option.some(RunnerAddress.make("localhost", 42069)), -// }, -// }), -// ), -// Layer.provide(SqlLayer), -// ); - -// const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( -// Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), -// Layer.provide(Workflows.WorkflowsLayer), -// Layer.provide(ClusterWorkflowLive), -// ); -// const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( -// Layer.provide(Workflows.RpcSerialization), -// ); - -// const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( -// Layer.provide( -// WorkflowProxyServer.layerHttpApi( -// Workflows.Api, -// "workflows", -// Workflows.Workflows, -// ), -// ), -// Layer.provide(Workflows.WorkflowsLayer), -// Layer.provide(ClusterWorkflowLive), -// ); - -// const TracingLayer = NodeSdk.layer(() => ({ -// resource: { serviceName: "cap-workflow-runner" }, -// spanProcessor: [new BatchSpanProcessor(new OTLPTraceExporter({}))], -// })); - -// const Main = HttpRouter.Default.serve(HttpMiddleware.logger) -// .pipe( -// Layer.provide(RpcsLive), -// Layer.provide(RpcProtocol), -// Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), -// ) -// .pipe( -// Layer.provide(Videos.Default), -// Layer.provide(S3Buckets.Default), -// Layer.provide(Database.Default), -// Layer.provide(FetchHttpClient.layer), -// Layer.provide(TracingLayer), -// ); - -NodeRuntime.runMain(Layer.launch(SqlLayer)); diff --git a/apps/web-cluster/src/runner/health-server.ts b/apps/web-cluster/src/runner/health-server.ts new file mode 100644 index 0000000000..4b4d07be24 --- /dev/null +++ b/apps/web-cluster/src/runner/health-server.ts @@ -0,0 +1,22 @@ +import { createServer } from "node:http"; +import { HttpRouter, HttpServer, HttpServerResponse } from "@effect/platform"; +import { NodeHttpServer } from "@effect/platform-node"; +import { Layer } from "effect"; + +// Define the router with a single route for the root URL +const router = HttpRouter.empty.pipe( + HttpRouter.get("/health", HttpServerResponse.text("ok")), +); + +// Set up the application server +const app = router.pipe(HttpServer.serve()); + +// Specify the port +const port = process.env.HEALTH_CHECK_PORT + ? parseInt(process.env.HEALTH_CHECK_PORT) + : 3000; + +// Create a server layer with the specified port +const ServerLive = NodeHttpServer.layer(() => createServer(), { port }); + +export const HealthServerLive = Layer.provide(app, ServerLive); diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts new file mode 100644 index 0000000000..51914a6647 --- /dev/null +++ b/apps/web-cluster/src/runner/index.ts @@ -0,0 +1,120 @@ +import { createServer } from "node:http"; +import { Database, S3Buckets, Videos, Workflows } from "@cap/web-backend"; +import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; +import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; +import { + FetchHttpClient, + HttpApiBuilder, + HttpMiddleware, + HttpRouter, +} from "@effect/platform"; +import { + NodeClusterRunnerSocket, + NodeHttpServer, + NodeRuntime, +} from "@effect/platform-node"; +import { RpcServer } from "@effect/rpc"; +import { MysqlClient } from "@effect/sql-mysql2"; +import { WorkflowProxyServer } from "@effect/workflow"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; +import { Config, Effect, Layer, Option } from "effect"; + +import { ContainerMetadata } from "../cluster/container-metadata.ts"; +import { HealthServerLive } from "./health-server.ts"; + +const SqlLayer = Layer.unwrapEffect( + Effect.gen(function* () { + const url = yield* Config.string("DATABASE_URL").pipe((v) => + Config.redacted(v), + ); + return MysqlClient.layer({ url }); + }), +); + +const ClusterWorkflowLive = Layer.unwrapEffect( + Effect.gen(function* () { + const containerMeta = yield* ContainerMetadata; + return ClusterWorkflowEngine.layer.pipe( + Layer.provide( + NodeClusterRunnerSocket.layer({ + storage: "sql", + shardingConfig: { + runnerAddress: Option.some( + RunnerAddress.make(containerMeta.ipAddress, containerMeta.port), + ), + }, + }), + ), + Layer.provide(SqlLayer), + ); + }), +).pipe(Layer.provide(ContainerMetadata.Default)); + +const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( + Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), + Layer.provide(Workflows.WorkflowsLayer), + Layer.provide(ClusterWorkflowLive), +); +const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( + Layer.provide(Workflows.RpcSerialization), +); + +const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( + Layer.provide( + WorkflowProxyServer.layerHttpApi( + Workflows.Api, + "workflows", + Workflows.Workflows, + ), + ), + Layer.provide(Workflows.WorkflowsLayer), + Layer.provide(ClusterWorkflowLive), +); + +const TracingLayer = Layer.unwrapEffect( + Effect.gen(function* () { + const exporter = Option.match( + yield* Config.option( + Config.all([ + Config.string("AXIOM_API_TOKEN"), + Config.string("AXIOM_DOMAIN"), + Config.string("AXIOM_DATASET"), + ]), + ), + { + onNone: () => new OTLPTraceExporter({}), + onSome: ([token, domain, dataset]) => { + return new OTLPTraceExporter({ + url: `https://${domain}/v1/traces`, // Axiom API endpoint for trace data + headers: { + Authorization: `Bearer ${token}`, // Replace API_TOKEN with your actual API token + "X-Axiom-Dataset": dataset, // Replace DATASET_NAME with your dataset + }, + }); + }, + }, + ); + + return NodeSdk.layer(() => ({ + resource: { serviceName: "cap-workflow-runner" }, + spanProcessor: [new BatchSpanProcessor(exporter)], + })); + }), +); + +HttpRouter.Default.serve(HttpMiddleware.logger).pipe( + Layer.provide(RpcsLive), + Layer.provide(RpcProtocol), + Layer.provide(WorkflowApiHttpLive), + Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), + Layer.provide(Videos.Default), + Layer.provide(S3Buckets.Default), + Layer.provide(Database.Default), + Layer.provide(FetchHttpClient.layer), + Layer.provide(SqlLayer), + Layer.provide(TracingLayer), + Layer.provide(HealthServerLive), + Layer.launch, + NodeRuntime.runMain, +); diff --git a/apps/web/instrumentation.node.ts b/apps/web/instrumentation.node.ts index 19af910785..aee3a12300 100644 --- a/apps/web/instrumentation.node.ts +++ b/apps/web/instrumentation.node.ts @@ -14,36 +14,33 @@ import { migrate } from "drizzle-orm/mysql2/migrator"; import path from "path"; export async function register() { - if (process.env.NODE_ENV === "development") { - } else { - console.log("Waiting 5 seconds to run migrations"); - - // Function to trigger migrations with retry logic - const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { - try { - await runMigrations(); - } catch (error) { - console.error( - `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, - error, - ); - if (retryCount < maxRetries - 1) { - console.log( - `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, - ); - setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); - } else { - console.error(`🚨 All ${maxRetries} migration attempts failed.`); - process.exit(1); // Exit with error code if all attempts fail - } - } - }; - - // Add a timeout to trigger migrations after 5 seconds on server start - setTimeout(() => triggerMigrations(), 5000); - - setTimeout(() => createS3Bucket(), 5000); - } + // if (process.env.NODE_ENV === "development") { + // } else { + // console.log("Waiting 5 seconds to run migrations"); + // // Function to trigger migrations with retry logic + // const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { + // try { + // await runMigrations(); + // } catch (error) { + // console.error( + // `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, + // error, + // ); + // if (retryCount < maxRetries - 1) { + // console.log( + // `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, + // ); + // setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); + // } else { + // console.error(`🚨 All ${maxRetries} migration attempts failed.`); + // process.exit(1); // Exit with error code if all attempts fail + // } + // } + // }; + // // Add a timeout to trigger migrations after 5 seconds on server start + // setTimeout(() => triggerMigrations(), 5000); + // setTimeout(() => createS3Bucket(), 5000); + // } } async function createS3Bucket() { diff --git a/apps/web/lib/tracing.ts b/apps/web/lib/tracing.ts index 71b016f577..da1d848f48 100644 --- a/apps/web/lib/tracing.ts +++ b/apps/web/lib/tracing.ts @@ -4,16 +4,19 @@ import { Effect, Option } from "effect"; export const getTracingConfig = Effect.gen(function* () { const axiomToken = Option.fromNullable(process.env.NEXT_PUBLIC_AXIOM_TOKEN); + const axiomDataset = Option.fromNullable( + process.env.NEXT_PUBLIC_AXIOM_DATASET, + ); const axiomProcessor = Option.map( - axiomToken, - (token) => + Option.all([axiomToken, axiomDataset]), + ([token, dataset]) => new BatchSpanProcessor( new OTLPTraceExporter({ url: "https://api.axiom.co/v1/traces", headers: { Authorization: `Bearer ${token}`, - "X-Axiom-Dataset": "cap-web-test", + "X-Axiom-Dataset": dataset, }, }), ), diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index 124da80bc5..4a7ad64454 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -17,6 +17,8 @@ const nextConfig = { "@cap/utils", "@cap/web-api-contract", "@cap/web-domain", + "@cap/env", + "@cap/database", "next-mdx-remote", ], eslint: { @@ -29,9 +31,10 @@ const nextConfig = { optimizePackageImports: [ "@cap/ui", "@cap/utils", - "@cap/web-api-contract", - "@cap/web-domain", - "@cap/web-backend", + // "@cap/web-api-contract", + // "@cap/web-domain", + // "@cap/web-backend", + "@cap/database", ], }, images: { diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index a379cd0421..6a5ab544ad 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -21,6 +21,25 @@ declare module "sst" { "type": "sst.sst.Secret" "value": string } + "GITHUB_PAT": { + "type": "sst.sst.Secret" + "value": string + } + "MyApi": { + "type": "sst.aws.ApiGatewayV2" + "url": string + } + "Runner": { + "service": string + "type": "sst.aws.Service" + } + "ShardManager": { + "service": string + "type": "sst.aws.Service" + } + "Vpc": { + "type": "sst.aws.Vpc" + } } } /// diff --git a/infra/sst.config.ts b/infra/sst.config.ts index a106a3fe7d..74cbcbf035 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -8,6 +8,8 @@ const VERCEL_TEAM_SLUG = "mc-ilroy"; const VERCEL_TEAM_ID = "team_vbZRU7UW78rpKKIj4c9PfFAC"; const CLOUDFLARE_ACCOUNT_ID = "3de2dd633194481d80f68f55257bdbaa"; +const AXIOM_API_TOKEN = "xaat-8b4a0ead-c68d-4a65-aba6-151213f9d701"; +const AXIOM_DATASET = "cap"; export default $config({ app(input) { @@ -44,6 +46,14 @@ export default $config({ const recordingsBucket = new aws.s3.BucketV2("RecordingsBucket"); + const vercelVariables = [ + { key: "NEXT_PUBLIC_AXIOM_TOKEN", value: AXIOM_API_TOKEN }, + { key: "NEXT_PUBLIC_AXIOM_DATASET", value: AXIOM_DATASET }, + { key: "CAP_AWS_BUCKET", value: recordingsBucket.bucket }, + { key: "NEXT_PUBLIC_CAP_AWS_BUCKET", value: recordingsBucket.bucket }, + { key: "DATABASE_URL", value: secrets.DATABASE_URL_HTTP.value }, + ]; + // new aws.s3.BucketAccelerateConfigurationV2("RecordingsBucketAcceleration", { // bucket: recordingsBucket.id, // status: "Enabled", @@ -57,43 +67,12 @@ export default $config({ const vercelProject = vercel.getProjectOutput({ name: "cap-web" }); - function vercelEnvVar( - name: string, - args: Omit< - vercel.ProjectEnvironmentVariableArgs, - "projectId" | "customEnvironmentIds" | "targets" - >, - ) { - new vercel.ProjectEnvironmentVariable(name, { - ...args, - projectId: vercelProject.id, - customEnvironmentIds: - $app.stage === "staging" - ? ["env_CFbtmnpsI11e4o8X5UD8MZzxELQi"] - : undefined, - targets: - $app.stage === "staging" ? undefined : ["preview", "production"], - }); - } - - vercelEnvVar("VercelDatabaseURLEnv", { - key: "DATABASE_URL", - value: secrets.DATABASE_URL_HTTP.value, - }); - if (webUrl) { - vercelEnvVar("VercelWebURLEnv", { - key: "WEB_URL", - value: webUrl, - }); - vercelEnvVar("VercelNextPublicWebURLEnv", { - key: "NEXT_PUBLIC_WEB_URL", - value: webUrl, - }); - vercelEnvVar("VercelNextAuthURLEnv", { - key: "NEXTAUTH_URL", - value: webUrl, - }); + vercelVariables.push( + { key: "WEB_URL", value: webUrl }, + { key: "NEXT_PUBLIC_WEB_URL", value: webUrl }, + { key: "NEXTAUTH_URL", value: webUrl }, + ); } // vercelEnvVar("VercelCloudfrontEnv", { @@ -101,31 +80,27 @@ export default $config({ // value: cloudfrontDistribution.id, // }); - vercelEnvVar("VercelAWSBucketEnv", { - key: "CAP_AWS_BUCKET", - value: recordingsBucket.bucket, - }); - - vercelEnvVar("VercelNextPublicAWSBucketEnv", { - key: "NEXT_PUBLIC_CAP_AWS_BUCKET", - value: recordingsBucket.bucket, - }); + const awsAccount = aws.getCallerIdentityOutput(); - const oidc = (() => { + const oidc = await (async () => { const aud = `https://vercel.com/${VERCEL_TEAM_SLUG}`; const url = `oidc.vercel.com/${VERCEL_TEAM_SLUG}`; return { aud, url, - provider: new aws.iam.OpenIdConnectProvider("VercelAWSOIDC", { - url: `https://${url}`, - clientIdLists: [aud], - }), + provider: await aws.iam + .getOpenIdConnectProvider({ url: `https://${url}` }) + .catch( + () => + new aws.iam.OpenIdConnectProvider( + "VercelAWSOIDC", + { url: `https://${url}`, clientIdLists: [aud] }, + { retainOnDelete: true }, + ), + ), }; })(); - const awsAccount = aws.getCallerIdentityOutput(); - const vercelAwsAccessRole = new aws.iam.Role("VercelAWSAccessRole", { assumeRolePolicy: { Version: "2012-10-17", @@ -173,12 +148,27 @@ export default $config({ ], }); - vercelEnvVar("VercelAWSAccessRoleArn", { - key: "VERCEL_AWS_ROLE_ARN", - value: vercelAwsAccessRole.arn, - }); - - // await WorkflowCluster(recordingsBucket, secrets); + const workflowCluster = await WorkflowCluster(recordingsBucket, secrets); + + if ($app.stage === "staging" || $app.stage === "production") { + [ + ...vercelVariables, + { key: "REMOTE_WORKFLOW_URL", value: workflowCluster.api.url }, + { key: "VERCEL_AWS_ROLE_ARN", value: vercelAwsAccessRole.arn }, + ].map( + (v) => + new vercel.ProjectEnvironmentVariable(`VercelEnv${v.key}`, { + ...v, + projectId: vercelProject.id, + customEnvironmentIds: + $app.stage === "staging" + ? ["env_CFbtmnpsI11e4o8X5UD8MZzxELQi"] + : undefined, + targets: + $app.stage === "staging" ? undefined : ["preview", "production"], + }), + ); + } // DiscordBot(); }, @@ -281,20 +271,26 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { cloudmapNamespaceId: privateDnsNamespace.id, cloudmapNamespaceName: privateDnsNamespace.name, }, + transform: { + cluster: { + settings: [{ name: "containerInsights", value: "enhanced" }], + }, + }, }); const commonEnvironment = { - SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), CAP_AWS_REGION: bucket.region, CAP_AWS_BUCKET: bucket.bucket, DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, + AXIOM_API_TOKEN, + AXIOM_DOMAIN: "api.axiom.co", + AXIOM_DATASET, }; const ghcrCredentialsSecret = new aws.secretsmanager.Secret( "GHCRCredentialsSecret", - { name: "GhcrCredentials" }, ); new aws.secretsmanager.SecretVersion("GHCRCredentialsSecretVersion", { @@ -307,7 +303,39 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { ), }); - const shardManager = new sst.aws.Service("ShardManager", { + const ghcrCredentialsTransform = { + taskRole(args) { + args.inlinePolicies = pulumi + .all([args.inlinePolicies ?? [], ghcrCredentialsSecret.arn]) + .apply(([policies, arn]) => { + policies.push({ + policy: JSON.stringify({ + Version: "2012-10-17", + Statement: [ + { + Effect: "Allow", + Action: ["secretsmanager:GetSecretValue"], + Resource: [arn], + }, + ], + }), + }); + return policies; + }); + }, + taskDefinition(args) { + args.containerDefinitions = pulumi + .all([$jsonParse(args.containerDefinitions), ghcrCredentialsSecret.arn]) + .apply(([def, arn]) => { + for (const container of def) { + container.repositoryCredentials = { credentialsParameter: arn }; + } + return JSON.stringify(def); + }); + }, + } satisfies sst.aws.ServiceArgs["transform"]; + + new sst.aws.Service("ShardManager", { cluster, architecture: "arm64", containers: [ @@ -317,51 +345,70 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { command: ["src/shard-manager.ts"], environment: { ...commonEnvironment, + SHARD_MANAGER_HOST: "0.0.0.0", }, }, ], + transform: ghcrCredentialsTransform, + }); + + const runner = new sst.aws.Service("Runner", { + cluster, + capacity: "spot", + cpu: "0.25 vCPU", + memory: "1 GB", + architecture: "arm64", + serviceRegistry: { port: 42169 }, + image: "ghcr.io/brendonovich/cap-web-cluster:latest", + command: ["src/runner/index.ts"], + health: { + command: ["CMD", "deno", "run", "--allow-all", "src/health-check.ts"], + }, + environment: { + ...commonEnvironment, + SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), + PORT: "42069", + HEALTH_CHECK_PORT: "3000", + }, + scaling: { + min: 2, + max: 16, + cpuUtilization: 70, + memoryUtilization: 70, + }, transform: { - taskRole(args) { - args.inlinePolicies = pulumi - .all([args.inlinePolicies ?? [], ghcrCredentialsSecret.arn]) - .apply(([policies, arn]) => { - policies.push({ - policy: JSON.stringify({ - Version: "2012-10-17", - Statement: [ - { - Effect: "Allow", - Action: ["secretsmanager:GetSecretValue"], - Resource: [arn], - }, - ], - }), - }); - return policies; - }); - }, - taskDefinition(args) { - args.containerDefinitions = pulumi - .all([ - $jsonParse(args.containerDefinitions), - ghcrCredentialsSecret.arn, - ]) - .apply(([def, arn]) => { - def[0].repositoryCredentials = { credentialsParameter: arn }; - return JSON.stringify(def); - }); + ...ghcrCredentialsTransform, + // Set a restart policy for all containers + // Not provided by the SST configs + taskDefinition: (args) => { + // "containerDefinitions" is a JSON string, parse first + let value = $jsonParse(args.containerDefinitions); + + // Update "portMappings" + value = value.apply((containerDefinitions) => { + for (const container of containerDefinitions) { + container.restartPolicy = { + enabled: true, + restartAttemptPeriod: 60, + }; + } + return containerDefinitions; + }); + + // Convert back to JSON string + args.containerDefinitions = $jsonStringify(value); + + ghcrCredentialsTransform.taskDefinition(args); }, }, }); - // new sst.aws.Function("WorkflowClusterProxyLambda", { - // vpc, - // url: true, - // timeout: "5 minutes", - // link: [shardManager], - // handler: "src/serverless/lambda.handler", - // environment: { - // SHARD_MANAGER_HOST: generateServiceHostname("ShardManager"), - // }, - // }); + const api = new sst.aws.ApiGatewayV2("MyApi", { + vpc, + }); + api.routePrivate("$default", runner.nodes.cloudmapService.arn); + + return { + api, + }; } diff --git a/packages/database/package.json b/packages/database/package.json index ead665bf83..1592d4b5c8 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -59,7 +59,10 @@ "./auth/session": "./auth/session.ts", "./schema": "./schema.ts", "./crypto": "./crypto.ts", - "./helpers": "./helpers.ts" + "./helpers": "./helpers.ts", + "./emails/config": "./emails/config.ts", + "./emails/*": "./emails/*.tsx", + "./types": "./types/index.ts" }, "publishConfig": { "exports": { diff --git a/packages/env/build.ts b/packages/env/build.ts index b31378e299..04d0f79196 100644 --- a/packages/env/build.ts +++ b/packages/env/build.ts @@ -3,16 +3,6 @@ import { z } from "zod"; export const NODE_ENV = process.env.NODE_ENV || ""; -// Environment variables that are needed in the build process, and may be incorrect on the client. -// Some are only provided by `NEXT_PUBLIC`, but others can be provdied at runtime -export const buildEnv = new Proxy({} as typeof _env, { - get(_, key) { - if (!_env) _env = create(); - - return (_env as any)[key]; - }, -}); - let _env: ReturnType; const create = () => @@ -50,3 +40,13 @@ const create = () => NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, }, }); + +// Environment variables that are needed in the build process, and may be incorrect on the client. +// Some are only provided by `NEXT_PUBLIC`, but others can be provdied at runtime +export const buildEnv = new Proxy({} as typeof _env, { + get(_, key) { + if (!_env) _env = create(); + + return (_env as any)[key]; + }, +}); diff --git a/packages/web-backend/src/Loom/Http.ts b/packages/web-backend/src/Loom/Http.ts index 69e4664c93..cf51649baf 100644 --- a/packages/web-backend/src/Loom/Http.ts +++ b/packages/web-backend/src/Loom/Http.ts @@ -24,6 +24,7 @@ export const LoomHttpLive = HttpApiBuilder.group( loom: payload.loom, }) .pipe( + Effect.tapDefect(Effect.logError), Effect.catchTag( "RpcClientError", () => new Http.InternalServerError({ cause: "unknown" }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc537df202..51069e3e95 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,7 +3,6 @@ lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false - injectWorkspacePackages: true importers: @@ -38,13 +37,13 @@ importers: version: 2.1.4 '@cap/database': specifier: workspace:* - version: file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + version: link:../../packages/database '@cap/ui-solid': specifier: workspace:* - version: file:packages/ui-solid(@fontsource/geist-sans@5.2.5) + version: link:../../packages/ui-solid '@cap/utils': specifier: workspace:* - version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../../packages/utils '@cap/web-api-contract': specifier: workspace:* version: link:../../packages/web-api-contract @@ -289,7 +288,7 @@ importers: dependencies: '@cap/ui-solid': specifier: workspace:* - version: file:packages/ui-solid(@fontsource/geist-sans@5.2.5) + version: link:../../packages/ui-solid postcss-pseudo-companion-classes: specifier: ^0.1.1 version: 0.1.1(postcss@8.5.3) @@ -444,25 +443,25 @@ importers: version: 3.804.0 '@cap/database': specifier: workspace:* - version: file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../../packages/database '@cap/env': specifier: workspace:* version: link:../../packages/env '@cap/ui': specifier: workspace:* - version: file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3)))(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../../packages/ui '@cap/utils': specifier: workspace:* version: link:../../packages/utils '@cap/web-api-contract': specifier: workspace:* - version: file:packages/web-api-contract(@types/node@20.17.43) + version: link:../../packages/web-api-contract '@cap/web-api-contract-effect': specifier: workspace:* version: link:../../packages/web-api-contract-effect '@cap/web-backend': specifier: workspace:* - version: file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../../packages/web-backend '@cap/web-domain': specifier: workspace:* version: link:../../packages/web-domain @@ -690,7 +689,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -826,7 +825,7 @@ importers: dependencies: '@cap/web-backend': specifier: workspace:* - version: file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + version: link:../../packages/web-backend '@cap/web-domain': specifier: workspace:* version: link:../../packages/web-domain @@ -1007,7 +1006,7 @@ importers: devDependencies: '@cap/ui': specifier: workspace:* - version: file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../ui '@cap/utils': specifier: workspace:* version: link:../utils @@ -1066,7 +1065,7 @@ importers: dependencies: '@cap/utils': specifier: workspace:* - version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../utils '@kobalte/tailwindcss': specifier: ^0.9.0 version: 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) @@ -1306,10 +1305,10 @@ importers: version: 3.804.0 '@cap/database': specifier: workspace:* - version: file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) + version: link:../database '@cap/utils': specifier: workspace:* - version: file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) + version: link:../utils '@cap/web-domain': specifier: workspace:* version: link:../web-domain @@ -1896,35 +1895,6 @@ packages: cpu: [x64] os: [win32] - '@cap/database@file:packages/database': - resolution: {directory: packages/database, type: directory} - engines: {node: '20'} - - '@cap/env@file:packages/env': - resolution: {directory: packages/env, type: directory} - - '@cap/ui-solid@file:packages/ui-solid': - resolution: {directory: packages/ui-solid, type: directory} - peerDependencies: - '@fontsource/geist-sans': ^5.0.3 - - '@cap/ui@file:packages/ui': - resolution: {directory: packages/ui, type: directory} - engines: {node: '20'} - - '@cap/utils@file:packages/utils': - resolution: {directory: packages/utils, type: directory} - engines: {node: '20'} - - '@cap/web-api-contract@file:packages/web-api-contract': - resolution: {directory: packages/web-api-contract, type: directory} - - '@cap/web-backend@file:packages/web-backend': - resolution: {directory: packages/web-backend, type: directory} - - '@cap/web-domain@file:packages/web-domain': - resolution: {directory: packages/web-domain, type: directory} - '@chromatic-com/storybook@1.9.0': resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} engines: {node: '>=16.0.0', yarn: '>=1.22.18'} @@ -15591,454 +15561,6 @@ snapshots: '@biomejs/cli-win32-x64@2.2.0': optional: true - '@cap/database@file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': - dependencies: - '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/web-domain': file:packages/web-domain - '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@mattrax/mysql-planetscale': 0.0.3 - '@paralleldrive/cuid2': 2.2.2 - '@planetscale/database': 1.19.0 - '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/tailwind': 1.0.5(react@19.1.1) - drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) - effect: 3.17.14 - nanoid: 5.1.5 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - next-auth: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-email: 4.2.11 - resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - zod: 3.25.76 - transitivePeerDependencies: - - '@auth/core' - - '@aws-sdk/client-rds-data' - - '@babel/core' - - '@cloudflare/workers-types' - - '@effect/experimental' - - '@effect/platform' - - '@effect/sql' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@modelcontextprotocol/sdk' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@playwright/test' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - babel-plugin-macros - - babel-plugin-react-compiler - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - nodemailer - - pg - - postgres - - prisma - - react - - react-dom - - sass - - sql.js - - sqlite3 - - supports-color - - typescript - - utf-8-validate - - valibot - - '@cap/database@file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/web-domain': file:packages/web-domain - '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@mattrax/mysql-planetscale': 0.0.3 - '@paralleldrive/cuid2': 2.2.2 - '@planetscale/database': 1.19.0 - '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/tailwind': 1.0.5(react@19.1.1) - drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) - effect: 3.17.14 - nanoid: 5.1.5 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - next-auth: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-email: 4.2.11 - resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - zod: 3.25.76 - transitivePeerDependencies: - - '@auth/core' - - '@aws-sdk/client-rds-data' - - '@babel/core' - - '@cloudflare/workers-types' - - '@effect/experimental' - - '@effect/platform' - - '@effect/sql' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@modelcontextprotocol/sdk' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@playwright/test' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - babel-plugin-macros - - babel-plugin-react-compiler - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - nodemailer - - pg - - postgres - - prisma - - react - - react-dom - - sass - - sql.js - - sqlite3 - - supports-color - - typescript - - utf-8-validate - - valibot - - '@cap/database@file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': - dependencies: - '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/web-domain': file:packages/web-domain - '@effect/sql-mysql2': 0.45.1(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@mattrax/mysql-planetscale': 0.0.3 - '@paralleldrive/cuid2': 2.2.2 - '@planetscale/database': 1.19.0 - '@react-email/components': 0.1.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/render': 1.1.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@react-email/tailwind': 1.0.5(react@19.1.1) - drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - dub: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) - effect: 3.17.14 - nanoid: 5.1.5 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - next-auth: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-email: 4.2.11 - resend: 4.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - zod: 3.25.76 - transitivePeerDependencies: - - '@auth/core' - - '@aws-sdk/client-rds-data' - - '@babel/core' - - '@cloudflare/workers-types' - - '@effect/experimental' - - '@effect/platform' - - '@effect/sql' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@modelcontextprotocol/sdk' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@playwright/test' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - babel-plugin-macros - - babel-plugin-react-compiler - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - nodemailer - - pg - - postgres - - prisma - - react - - react-dom - - sass - - sql.js - - sqlite3 - - supports-color - - typescript - - utf-8-validate - - valibot - - '@cap/env@file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@t3-oss/env-nextjs': 0.12.0(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))(zod@3.25.76) - zod: 3.25.76 - transitivePeerDependencies: - - typescript - - valibot - - '@cap/ui-solid@file:packages/ui-solid(@fontsource/geist-sans@5.2.5)': - dependencies: - '@fontsource/geist-sans': 5.2.5 - '@kobalte/core': 0.13.9(solid-js@1.9.6) - cva: class-variance-authority@0.7.1 - solid-js: 1.9.6 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3)) - zod: 3.25.76 - transitivePeerDependencies: - - ts-node - - '@cap/ui@file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3)))(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@kobalte/tailwindcss': 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) - '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dropdown-menu': 2.1.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-label': 2.1.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-navigation-menu': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popover': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-switch': 1.2.4(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tailwindcss/typography': 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.43)(typescript@5.8.3))) - class-variance-authority: 0.7.1 - clsx: 2.1.1 - cmdk: 0.2.1(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - lucide-react: 0.294.0(react@19.1.1) - react-hook-form: 7.56.2(react@19.1.1) - react-loading-skeleton: 3.5.0(react@19.1.1) - zod: 3.25.76 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - aws-crt - - react - - react-dom - - tailwindcss - - typescript - - valibot - - '@cap/ui@file:packages/ui(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@kobalte/tailwindcss': 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))) - '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dropdown-menu': 2.1.14(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-label': 2.1.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-navigation-menu': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-popover': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-switch': 1.2.4(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tailwindcss/typography': 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.17)(typescript@5.8.3))) - class-variance-authority: 0.7.1 - clsx: 2.1.1 - cmdk: 0.2.1(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - lucide-react: 0.294.0(react@19.1.1) - react-hook-form: 7.56.2(react@19.1.1) - react-loading-skeleton: 3.5.0(react@19.1.1) - zod: 3.25.76 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - aws-crt - - react - - react-dom - - tailwindcss - - typescript - - valibot - - '@cap/utils@file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@aws-sdk/client-s3': 3.804.0 - '@cap/env': file:packages/env(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - clsx: 2.1.1 - stripe: 14.25.0 - tailwind-merge: 2.6.0 - zod: 3.25.76 - transitivePeerDependencies: - - aws-crt - - typescript - - valibot - - '@cap/web-api-contract@file:packages/web-api-contract(@types/node@20.17.43)': - dependencies: - '@ts-rest/core': 3.52.1(@types/node@20.17.43)(zod@3.25.76) - zod: 3.25.76 - transitivePeerDependencies: - - '@types/node' - - '@cap/web-backend@file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3))': - dependencies: - '@aws-sdk/client-s3': 3.804.0 - '@aws-sdk/cloudfront-signer': 3.821.0 - '@aws-sdk/s3-presigned-post': 3.804.0 - '@aws-sdk/s3-request-presigner': 3.804.0 - '@cap/database': file:packages/database(@babel/core@7.27.1)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/web-domain': file:packages/web-domain - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@smithy/types': 4.3.1 - '@vercel/functions': 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) - drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - effect: 3.17.14 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - server-only: 0.0.1 - transitivePeerDependencies: - - '@auth/core' - - '@aws-sdk/client-rds-data' - - '@aws-sdk/credential-provider-web-identity' - - '@babel/core' - - '@cloudflare/workers-types' - - '@effect/experimental' - - '@effect/sql' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@modelcontextprotocol/sdk' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@playwright/test' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - aws-crt - - babel-plugin-macros - - babel-plugin-react-compiler - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - nodemailer - - pg - - postgres - - prisma - - react - - react-dom - - sass - - sql.js - - sqlite3 - - supports-color - - typescript - - utf-8-validate - - valibot - - '@cap/web-backend@file:packages/web-backend(@aws-sdk/credential-provider-web-identity@3.804.0)(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3)': - dependencies: - '@aws-sdk/client-s3': 3.804.0 - '@aws-sdk/cloudfront-signer': 3.821.0 - '@aws-sdk/s3-presigned-post': 3.804.0 - '@aws-sdk/s3-request-presigner': 3.804.0 - '@cap/database': file:packages/database(@cloudflare/workers-types@4.20250507.0)(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(@modelcontextprotocol/sdk@1.6.1)(@opentelemetry/api@1.9.0)(mysql2@3.14.1)(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3) - '@cap/utils': file:packages/utils(typescript@5.8.3)(valibot@1.0.0-rc.1(typescript@5.8.3)) - '@cap/web-domain': file:packages/web-domain - '@effect/cluster': 0.49.1(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/sql@0.44.2(@effect/experimental@0.54.6(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14)(ioredis@5.6.1))(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(@effect/workflow@0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - '@smithy/types': 4.3.1 - '@vercel/functions': 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) - drizzle-orm: 0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - effect: 3.17.14 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - server-only: 0.0.1 - transitivePeerDependencies: - - '@auth/core' - - '@aws-sdk/client-rds-data' - - '@aws-sdk/credential-provider-web-identity' - - '@babel/core' - - '@cloudflare/workers-types' - - '@effect/experimental' - - '@effect/sql' - - '@electric-sql/pglite' - - '@libsql/client' - - '@libsql/client-wasm' - - '@modelcontextprotocol/sdk' - - '@neondatabase/serverless' - - '@op-engineering/op-sqlite' - - '@opentelemetry/api' - - '@planetscale/database' - - '@playwright/test' - - '@prisma/client' - - '@tidbcloud/serverless' - - '@types/better-sqlite3' - - '@types/pg' - - '@types/sql.js' - - '@upstash/redis' - - '@vercel/postgres' - - '@xata.io/client' - - aws-crt - - babel-plugin-macros - - babel-plugin-react-compiler - - better-sqlite3 - - bufferutil - - bun-types - - expo-sqlite - - gel - - knex - - kysely - - mysql2 - - nodemailer - - pg - - postgres - - prisma - - react - - react-dom - - sass - - sql.js - - sqlite3 - - supports-color - - typescript - - utf-8-validate - - valibot - - '@cap/web-domain@file:packages/web-domain': - dependencies: - '@effect/platform': 0.91.1(effect@3.17.14) - '@effect/rpc': 0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14) - '@effect/workflow': 0.10.0(@effect/platform@0.91.1(effect@3.17.14))(@effect/rpc@0.70.0(@effect/platform@0.91.1(effect@3.17.14))(effect@3.17.14))(effect@3.17.14) - effect: 3.17.14 - '@chromatic-com/storybook@1.9.0(react@19.1.1)': dependencies: chromatic: 11.28.2 @@ -26823,23 +26345,6 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 - next-auth@4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): - dependencies: - '@babel/runtime': 7.27.1 - '@panva/hkdf': 1.2.1 - cookie: 0.7.2 - jose: 4.15.9 - next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - oauth: 0.9.15 - openid-client: 5.7.1 - preact: 10.26.6 - preact-render-to-string: 5.2.6(preact@10.26.6) - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - uuid: 8.3.2 - optionalDependencies: - nodemailer: 6.10.1 - next-auth@4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 From dc2f22b024ad3f4e541de575b1f2a045a2a78e4b Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 8 Oct 2025 19:07:25 +0800 Subject: [PATCH 04/25] attempt @vercel/otel integration --- apps/web/instrumentation.ts | 15 ++++++ apps/web/lib/server.ts | 24 +++++++--- apps/web/lib/tracing-server.ts | 5 -- apps/web/lib/tracing.ts | 7 ++- apps/web/package.json | 2 + pnpm-lock.yaml | 85 +++++++++++++++++++++++----------- 6 files changed, 98 insertions(+), 40 deletions(-) delete mode 100644 apps/web/lib/tracing-server.ts diff --git a/apps/web/instrumentation.ts b/apps/web/instrumentation.ts index 658bc0a6ab..3a746d4c7f 100644 --- a/apps/web/instrumentation.ts +++ b/apps/web/instrumentation.ts @@ -1,4 +1,19 @@ +import { OTLPHttpJsonTraceExporter, registerOTel } from "@vercel/otel"; + export async function register() { + if (process.env.VERCEL === "1") { + registerOTel({ + serviceName: "your-project-name", + traceExporter: new OTLPHttpJsonTraceExporter({ + url: "https://api.axiom.co/v1/traces", + headers: { + Authorization: `Bearer ${process.env.NEXT_PUBLIC_AXIOM_TOKEN}`, + "X-Axiom-Dataset": process.env.NEXT_PUBLIC_AXIOM_DATASET, + }, + }), + }); + } + if (process.env.NEXT_RUNTIME === "nodejs") { const { register } = await import("./instrumentation.node"); await register(); diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index 1bfddd9a69..3e276bdec7 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -14,7 +14,7 @@ import { Workflows, } from "@cap/web-backend"; import { type HttpAuthMiddleware, Video } from "@cap/web-domain"; -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; +import * as NodeSdk from "@effect/opentelemetry"; import { FetchHttpClient, type HttpApi, @@ -33,13 +33,14 @@ import { Layer, ManagedRuntime, Option, + Tracer, } from "effect"; import { cookies } from "next/headers"; import { allowedOrigins } from "@/utils/cors"; import { getTracingConfig } from "./tracing"; -export const TracingLayer = NodeSdk.layer(getTracingConfig); +// export const TracingLayer = NodeSdk.layer(getTracingConfig); const CookiePasswordAttachmentLive = Layer.effect( Video.VideoPasswordAttachment, @@ -95,9 +96,7 @@ export const Dependencies = Layer.mergeAll( WorkflowRpcLive, WorkflowHttpLive, ).pipe( - Layer.provideMerge( - Layer.mergeAll(Database.Default, TracingLayer, FetchHttpClient.layer), - ), + Layer.provideMerge(Layer.mergeAll(Database.Default, FetchHttpClient.layer)), ); // purposefully not exposed @@ -135,6 +134,8 @@ const cors = HttpApiBuilder.middlewareCors({ allowedHeaders: ["Content-Type", "Authorization", "sentry-trace", "baggage"], }); +import { trace } from "@opentelemetry/api"; + export const apiToHandler = ( api: Layer.Layer< HttpApi.Api, @@ -151,6 +152,17 @@ export const apiToHandler = ( Layer.provide( HttpApiBuilder.middleware(Effect.provide(CookiePasswordAttachmentLive)), ), - HttpApiBuilder.toWebHandler, + (l) => + HttpApiBuilder.toWebHandler(l, { + middleware: (app) => { + const parentSpan = trace.getActiveSpan(); + if (!parentSpan) return app; + return app.pipe( + Effect.withParentSpan( + Tracer.externalSpan(parentSpan.spanContext()), + ), + ); + }, + }), (v) => (req: Request) => v.handler(req), ); diff --git a/apps/web/lib/tracing-server.ts b/apps/web/lib/tracing-server.ts deleted file mode 100644 index 53b062d277..0000000000 --- a/apps/web/lib/tracing-server.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; - -import { getTracingConfig } from "./tracing"; - -export const TracingLayer = NodeSdk.layer(getTracingConfig); diff --git a/apps/web/lib/tracing.ts b/apps/web/lib/tracing.ts index da1d848f48..c5c0d07f78 100644 --- a/apps/web/lib/tracing.ts +++ b/apps/web/lib/tracing.ts @@ -1,6 +1,11 @@ +import { Resource, Tracer } from "@effect/opentelemetry"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Effect, Option } from "effect"; +import { Effect, Layer, Option } from "effect"; + +export const OtelTracingLive = Tracer.layerGlobal.pipe( + Layer.provide(Resource.layer({ serviceName: "cap-web" })), +); export const getTracingConfig = Effect.gen(function* () { const axiomToken = Option.fromNullable(process.env.NEXT_PUBLIC_AXIOM_TOKEN); diff --git a/apps/web/package.json b/apps/web/package.json index 3e5e292b07..6c4d63bf50 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -45,6 +45,7 @@ "@mux/mux-player-react": "^3.3.0", "@number-flow/react": "^0.5.9", "@octokit/rest": "^20.0.2", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", @@ -70,6 +71,7 @@ "@ts-rest/core": "^3.52.1", "@uidotdev/usehooks": "^2.4.1", "@vercel/functions": "^3.1.0", + "@vercel/otel": "^2.0.1", "@virtual-grid/react": "^2.0.3", "@workos-inc/node": "^7.34.0", "aws-sdk": "^2.1530.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51069e3e95..3d9223494e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,7 +112,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -199,7 +199,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -525,6 +525,9 @@ importers: '@octokit/rest': specifier: ^20.0.2 version: 20.1.2 + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/exporter-trace-otlp-http': specifier: ^0.203.0 version: 0.203.0(@opentelemetry/api@1.9.0) @@ -600,6 +603,9 @@ importers: '@vercel/functions': specifier: ^3.1.0 version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + '@vercel/otel': + specifier: ^2.0.1 + version: 2.0.1(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)) '@virtual-grid/react': specifier: ^2.0.3 version: 2.0.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -7081,6 +7087,18 @@ packages: resolution: {integrity: sha512-XOoUcf/1VfGArUAfq0ELxk6TD7l4jGcrOsWjQibj4wYM74uNihzZ9gA46ywWegoqKWWdph4y5CKxGI9823deoA==} engines: {node: '>= 20'} + '@vercel/otel@2.0.1': + resolution: {integrity: sha512-eC8F8t9Ksn6xPBXBef7w2pMVcgjXoUOMJ3gnTs4Yh/zbKSIKfvX17GjyqCODwF9FdbiiPBxLsF8aQxFOtKyiEA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <2.0.0' + '@opentelemetry/api-logs': '>=0.200.0 <0.300.0' + '@opentelemetry/instrumentation': '>=0.200.0 <0.300.0' + '@opentelemetry/resources': '>=2.0.0 <3.0.0' + '@opentelemetry/sdk-logs': '>=0.200.0 <0.300.0' + '@opentelemetry/sdk-metrics': '>=2.0.0 <3.0.0' + '@opentelemetry/sdk-trace-base': '>=2.0.0 <3.0.0' + '@vinxi/listhen@1.5.6': resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} hasBin: true @@ -19740,11 +19758,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -19755,7 +19773,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -21064,6 +21082,16 @@ snapshots: '@types/ms': 2.1.0 ms: 2.1.3 + '@vercel/otel@2.0.1(@opentelemetry/api-logs@0.203.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@vinxi/listhen@1.5.6': dependencies: '@parcel/watcher': 2.5.1 @@ -21084,7 +21112,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -21095,18 +21123,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -23190,8 +23218,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.6.1)) @@ -23219,33 +23247,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.6.1) + eslint: 8.57.1 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 8.57.1 + eslint: 9.30.1(jiti@2.6.1) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -23271,14 +23299,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -23340,7 +23368,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23351,7 +23379,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -26420,7 +26448,7 @@ snapshots: cors: 2.8.5 next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -26474,7 +26502,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.42)(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -27864,13 +27892,14 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-beta.42)(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: + rolldown: 1.0.0-beta.42 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -29655,7 +29684,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29677,7 +29706,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 From 84c21bbc0a062742a2033a6e06a5b008c403398c Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Wed, 8 Oct 2025 21:35:56 +0800 Subject: [PATCH 05/25] vercel otel idk --- apps/web/instrumentation.ts | 6 ++-- apps/web/lib/EffectRuntime.ts | 4 +-- apps/web/lib/server.ts | 23 ++------------ apps/web/lib/tracing.ts | 57 ++++++++++++++++------------------- 4 files changed, 35 insertions(+), 55 deletions(-) diff --git a/apps/web/instrumentation.ts b/apps/web/instrumentation.ts index 3a746d4c7f..fb3ea56a7b 100644 --- a/apps/web/instrumentation.ts +++ b/apps/web/instrumentation.ts @@ -1,9 +1,11 @@ import { OTLPHttpJsonTraceExporter, registerOTel } from "@vercel/otel"; export async function register() { - if (process.env.VERCEL === "1") { + if (process.env.NEXT_PUBLIC_AXIOM_TOKEN) { + console.log("token", process.env.NEXT_PUBLIC_AXIOM_TOKEN); + console.log("dataset", process.env.NEXT_PUBLIC_AXIOM_DATASET); registerOTel({ - serviceName: "your-project-name", + serviceName: "cap-web-backend", traceExporter: new OTLPHttpJsonTraceExporter({ url: "https://api.axiom.co/v1/traces", headers: { diff --git a/apps/web/lib/EffectRuntime.ts b/apps/web/lib/EffectRuntime.ts index 2ffa90e390..f39bf777a6 100644 --- a/apps/web/lib/EffectRuntime.ts +++ b/apps/web/lib/EffectRuntime.ts @@ -8,11 +8,11 @@ import { import { Rpc } from "./Rpcs"; import { getTracingConfig } from "./tracing"; -const TracingLayer = WebSdk.layer(getTracingConfig); +// const TracingLayer = WebSdk.layer(getTracingConfig); const RuntimeLayer = Layer.mergeAll( Rpc.Default, - TracingLayer, + // TracingLayer, FetchHttpClient.layer, ); diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index 3e276bdec7..7e1af8e6df 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -14,13 +14,11 @@ import { Workflows, } from "@cap/web-backend"; import { type HttpAuthMiddleware, Video } from "@cap/web-domain"; -import * as NodeSdk from "@effect/opentelemetry"; import { FetchHttpClient, type HttpApi, HttpApiBuilder, HttpApiClient, - HttpClient, HttpMiddleware, HttpServer, } from "@effect/platform"; @@ -33,14 +31,11 @@ import { Layer, ManagedRuntime, Option, - Tracer, } from "effect"; import { cookies } from "next/headers"; import { allowedOrigins } from "@/utils/cors"; -import { getTracingConfig } from "./tracing"; - -// export const TracingLayer = NodeSdk.layer(getTracingConfig); +import { layerTracer } from "./tracing"; const CookiePasswordAttachmentLive = Layer.effect( Video.VideoPasswordAttachment, @@ -134,8 +129,6 @@ const cors = HttpApiBuilder.middlewareCors({ allowedHeaders: ["Content-Type", "Authorization", "sentry-trace", "baggage"], }); -import { trace } from "@opentelemetry/api"; - export const apiToHandler = ( api: Layer.Layer< HttpApi.Api, @@ -152,17 +145,7 @@ export const apiToHandler = ( Layer.provide( HttpApiBuilder.middleware(Effect.provide(CookiePasswordAttachmentLive)), ), - (l) => - HttpApiBuilder.toWebHandler(l, { - middleware: (app) => { - const parentSpan = trace.getActiveSpan(); - if (!parentSpan) return app; - return app.pipe( - Effect.withParentSpan( - Tracer.externalSpan(parentSpan.spanContext()), - ), - ); - }, - }), + Layer.provide(layerTracer), + HttpApiBuilder.toWebHandler, (v) => (req: Request) => v.handler(req), ); diff --git a/apps/web/lib/tracing.ts b/apps/web/lib/tracing.ts index c5c0d07f78..2b3fc620fd 100644 --- a/apps/web/lib/tracing.ts +++ b/apps/web/lib/tracing.ts @@ -1,37 +1,32 @@ import { Resource, Tracer } from "@effect/opentelemetry"; -import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; -import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Effect, Layer, Option } from "effect"; +import { trace } from "@opentelemetry/api"; +import { Effect, Layer } from "effect"; -export const OtelTracingLive = Tracer.layerGlobal.pipe( - Layer.provide(Resource.layer({ serviceName: "cap-web" })), -); +export const layerTracer = Layer.unwrapEffect( + Effect.gen(function* () { + const provider = Layer.sync(Tracer.OtelTracerProvider, () => + trace.getTracerProvider(), + ); -export const getTracingConfig = Effect.gen(function* () { - const axiomToken = Option.fromNullable(process.env.NEXT_PUBLIC_AXIOM_TOKEN); - const axiomDataset = Option.fromNullable( - process.env.NEXT_PUBLIC_AXIOM_DATASET, - ); + const otelTracer = Layer.effect( + Tracer.OtelTracer, + Effect.flatMap(Tracer.OtelTracerProvider, (provider) => + Effect.sync(() => provider.getTracer("cap-web-backend")), + ), + ); - const axiomProcessor = Option.map( - Option.all([axiomToken, axiomDataset]), - ([token, dataset]) => - new BatchSpanProcessor( - new OTLPTraceExporter({ - url: "https://api.axiom.co/v1/traces", - headers: { - Authorization: `Bearer ${token}`, - "X-Axiom-Dataset": dataset, - }, - }), + const tracer = yield* Tracer.make.pipe( + Effect.provide( + Layer.mergeAll( + otelTracer.pipe(Layer.provideMerge(provider)), + Resource.layer({ serviceName: "cap-web-backend" }), + ), ), - ); + ); - return { - resource: { serviceName: "cap-web" }, - spanProcessor: Option.match(axiomProcessor, { - onNone: () => [new BatchSpanProcessor(new OTLPTraceExporter({}))], - onSome: (processor) => [processor], - }), - }; -}); + return Layer.setTracer(tracer).pipe( + Layer.provideMerge(otelTracer), + Layer.provideMerge(provider), + ); + }), +); From 921549e313ad699b22ca5c8169cf2a3142f2762a Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Thu, 9 Oct 2025 07:46:53 +0000 Subject: [PATCH 06/25] aurora db --- infra/sst-env.d.ts | 11 +++++++++++ infra/sst.config.ts | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index 6a5ab544ad..4aee4b2323 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -5,6 +5,17 @@ declare module "sst" { export interface Resource { + "AuroraDB": { + "clusterArn": string + "database": string + "host": string + "password": string + "port": number + "reader": string + "secretArn": string + "type": "sst.aws.Aurora" + "username": string + } "CAP_AWS_ACCESS_KEY": { "type": "sst.sst.Secret" "value": string diff --git a/infra/sst.config.ts b/infra/sst.config.ts index 74cbcbf035..bc7488b55b 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -8,8 +8,8 @@ const VERCEL_TEAM_SLUG = "mc-ilroy"; const VERCEL_TEAM_ID = "team_vbZRU7UW78rpKKIj4c9PfFAC"; const CLOUDFLARE_ACCOUNT_ID = "3de2dd633194481d80f68f55257bdbaa"; -const AXIOM_API_TOKEN = "xaat-8b4a0ead-c68d-4a65-aba6-151213f9d701"; -const AXIOM_DATASET = "cap"; +const AXIOM_API_TOKEN = "xaat-c0704be6-e942-4935-b068-3b491d7cc00f"; +const AXIOM_DATASET = "cap-otel"; export default $config({ app(input) { @@ -28,7 +28,6 @@ export default $config({ }, cloudflare: true, aws: { - profile: "cap-staging", }, planetscale: true, awsx: "2.21.1", @@ -278,10 +277,19 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { }, }); + const db = new sst.aws.Aurora('AuroraDB', { + engine: "mysql", + vpc, + scaling: { + min: "0.5 ACU", + max: "4 ACU", + } + }); + const commonEnvironment = { CAP_AWS_REGION: bucket.region, CAP_AWS_BUCKET: bucket.bucket, - DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, + DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, // secrets.DATABASE_URL_MYSQL.value, CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, AXIOM_API_TOKEN, From 8c8f59977d2aeac1b7b5aa509fd32425de2dee15 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Thu, 9 Oct 2025 08:06:56 +0000 Subject: [PATCH 07/25] separate shard db --- apps/web-cluster/src/runner/index.ts | 15 +++---------- apps/web-cluster/src/shard-manager.ts | 13 +++-------- apps/web-cluster/src/shared/database.ts | 29 +++++++++++++++++++++++++ infra/sst.config.ts | 10 ++++----- 4 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 apps/web-cluster/src/shared/database.ts diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts index 51914a6647..85cfc82174 100644 --- a/apps/web-cluster/src/runner/index.ts +++ b/apps/web-cluster/src/runner/index.ts @@ -14,24 +14,15 @@ import { NodeRuntime, } from "@effect/platform-node"; import { RpcServer } from "@effect/rpc"; -import { MysqlClient } from "@effect/sql-mysql2"; import { WorkflowProxyServer } from "@effect/workflow"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; import { Config, Effect, Layer, Option } from "effect"; import { ContainerMetadata } from "../cluster/container-metadata.ts"; +import { DatabaseLive, ShardDatabaseLive } from "../shared/database.ts"; import { HealthServerLive } from "./health-server.ts"; -const SqlLayer = Layer.unwrapEffect( - Effect.gen(function* () { - const url = yield* Config.string("DATABASE_URL").pipe((v) => - Config.redacted(v), - ); - return MysqlClient.layer({ url }); - }), -); - const ClusterWorkflowLive = Layer.unwrapEffect( Effect.gen(function* () { const containerMeta = yield* ContainerMetadata; @@ -46,7 +37,7 @@ const ClusterWorkflowLive = Layer.unwrapEffect( }, }), ), - Layer.provide(SqlLayer), + Layer.provide(ShardDatabaseLive), ); }), ).pipe(Layer.provide(ContainerMetadata.Default)); @@ -112,7 +103,7 @@ HttpRouter.Default.serve(HttpMiddleware.logger).pipe( Layer.provide(S3Buckets.Default), Layer.provide(Database.Default), Layer.provide(FetchHttpClient.layer), - Layer.provide(SqlLayer), + Layer.provide(DatabaseLive), Layer.provide(TracingLayer), Layer.provide(HealthServerLive), Layer.launch, diff --git a/apps/web-cluster/src/shard-manager.ts b/apps/web-cluster/src/shard-manager.ts index 1d337c7447..127ce11704 100644 --- a/apps/web-cluster/src/shard-manager.ts +++ b/apps/web-cluster/src/shard-manager.ts @@ -2,20 +2,13 @@ import { NodeClusterShardManagerSocket, NodeRuntime, } from "@effect/platform-node"; -import { MysqlClient } from "@effect/sql-mysql2"; -import { Config, Effect, Layer, Logger, Redacted } from "effect"; - -const DatabaseLive = Layer.unwrapEffect( - Effect.gen(function* () { - const url = Redacted.make(yield* Config.string("DATABASE_URL")); - - return MysqlClient.layer({ url }); - }), -); +import { Layer, Logger } from "effect"; +import { DatabaseLive, ShardDatabaseLive } from "./shared/database"; NodeClusterShardManagerSocket.layer({ storage: "sql", }).pipe( + Layer.provide(ShardDatabaseLive), Layer.provide(DatabaseLive), Layer.provide(Logger.pretty), Layer.launch, diff --git a/apps/web-cluster/src/shared/database.ts b/apps/web-cluster/src/shared/database.ts new file mode 100644 index 0000000000..2530c4b0f7 --- /dev/null +++ b/apps/web-cluster/src/shared/database.ts @@ -0,0 +1,29 @@ +import { MysqlClient } from "@effect/sql-mysql2"; +import { Config, Effect, Layer, Option, Redacted } from "effect"; + +export const DatabaseLive = Layer.unwrapEffect( + Effect.gen(function* () { + const url = Redacted.make(yield* Config.string("DATABASE_URL")); + + return MysqlClient.layer({ url }); + }), +); + +export const ShardDatabaseLive = Layer.unwrapEffect( + Effect.gen(function* () { + const url = yield* Config.option( + Config.redacted(Config.string("SHARD_DATABASE_URL")), + ); + + return yield* Option.match(url, { + onNone: () => + Effect.gen(function* () { + return Layer.succeed( + MysqlClient.MysqlClient, + yield* MysqlClient.MysqlClient, + ); + }), + onSome: (url) => Effect.succeed(MysqlClient.layer({ url })), + }); + }), +); diff --git a/infra/sst.config.ts b/infra/sst.config.ts index bc7488b55b..eb1dba675f 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -27,8 +27,7 @@ export default $config({ owner: GITHUB_ORG, }, cloudflare: true, - aws: { - }, + aws: {}, planetscale: true, awsx: "2.21.1", }, @@ -277,19 +276,20 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { }, }); - const db = new sst.aws.Aurora('AuroraDB', { + const db = new sst.aws.Aurora("AuroraDB", { engine: "mysql", vpc, scaling: { min: "0.5 ACU", max: "4 ACU", - } + }, }); const commonEnvironment = { CAP_AWS_REGION: bucket.region, CAP_AWS_BUCKET: bucket.bucket, - DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, // secrets.DATABASE_URL_MYSQL.value, + SHARD_DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, + DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, AXIOM_API_TOKEN, From 1bcee3a2f3e67bf30874dfb7ad53b2e555f82ad9 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Thu, 9 Oct 2025 18:48:56 +0800 Subject: [PATCH 08/25] more stuff --- apps/web-cluster/Dockerfile | 4 +- apps/web-cluster/package.json | 3 +- apps/web-cluster/src/runner/index.ts | 24 ++----- apps/web-cluster/src/shard-manager.ts | 3 +- apps/web-cluster/src/shared/database.ts | 4 +- apps/web/lib/server.ts | 2 +- packages/web-backend/src/Loom/Http.ts | 3 +- packages/web-backend/src/Loom/ImportVideo.ts | 4 +- .../src/S3Buckets/S3BucketAccess.ts | 2 +- pnpm-lock.yaml | 69 +++++++++++++------ 10 files changed, 68 insertions(+), 50 deletions(-) diff --git a/apps/web-cluster/Dockerfile b/apps/web-cluster/Dockerfile index 7027d8c3c5..41e3881d72 100644 --- a/apps/web-cluster/Dockerfile +++ b/apps/web-cluster/Dockerfile @@ -8,9 +8,7 @@ COPY . . RUN corepack enable pnpm RUN echo "inject-workspace-packages=true" >> .npmrc -RUN pnpm i --lockfile-only - -RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i --frozen-lockfile +RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i RUN pnpm run --filter=@cap/web-cluster build RUN pnpm deploy --filter=@cap/web-cluster out diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index daadc3cf3f..0408d4d7b6 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -2,7 +2,7 @@ "name": "@cap/web-cluster", "type": "module", "scripts": { - "dev": "pnpm dotenv -e ../../.env -- deno run --allow-all --watch ./src/runner/index.ts", + "dev": "pnpm dotenv -e ../../.env -- concurrently \"deno run --allow-all --watch ./src/runner/index.ts\" \"deno run --allow-all --watch ./src/shard-manager.ts\"", "build": "pnpm run --filter @cap/web-cluster^... build", "build:docker": "cd ../.. && docker build -f apps/web-cluster/Dockerfile -t ghcr.io/brendonovich/cap-web-cluster:latest ." }, @@ -25,6 +25,7 @@ "tsup": "^8.5.0" }, "devDependencies": { + "concurrently": "^9.2.1", "dotenv-cli": "^10.0.0" } } diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts index 85cfc82174..11e773bc05 100644 --- a/apps/web-cluster/src/runner/index.ts +++ b/apps/web-cluster/src/runner/index.ts @@ -7,6 +7,7 @@ import { HttpApiBuilder, HttpMiddleware, HttpRouter, + HttpServer, } from "@effect/platform"; import { NodeClusterRunnerSocket, @@ -46,23 +47,10 @@ const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( Layer.provide(WorkflowProxyServer.layerRpcHandlers(Workflows.Workflows)), Layer.provide(Workflows.WorkflowsLayer), Layer.provide(ClusterWorkflowLive), -); -const RpcProtocol = RpcServer.layerProtocolHttp({ path: "/" }).pipe( + Layer.provide(RpcServer.layerProtocolHttp({ path: "/" })), Layer.provide(Workflows.RpcSerialization), ); -const WorkflowApiHttpLive = HttpApiBuilder.api(Workflows.Api).pipe( - Layer.provide( - WorkflowProxyServer.layerHttpApi( - Workflows.Api, - "workflows", - Workflows.Workflows, - ), - ), - Layer.provide(Workflows.WorkflowsLayer), - Layer.provide(ClusterWorkflowLive), -); - const TracingLayer = Layer.unwrapEffect( Effect.gen(function* () { const exporter = Option.match( @@ -94,10 +82,9 @@ const TracingLayer = Layer.unwrapEffect( }), ); -HttpRouter.Default.serve(HttpMiddleware.logger).pipe( +HttpRouter.Default.serve().pipe( Layer.provide(RpcsLive), - Layer.provide(RpcProtocol), - Layer.provide(WorkflowApiHttpLive), + HttpServer.withLogAddress, Layer.provide(NodeHttpServer.layer(createServer, { port: 42169 })), Layer.provide(Videos.Default), Layer.provide(S3Buckets.Default), @@ -105,7 +92,8 @@ HttpRouter.Default.serve(HttpMiddleware.logger).pipe( Layer.provide(FetchHttpClient.layer), Layer.provide(DatabaseLive), Layer.provide(TracingLayer), - Layer.provide(HealthServerLive), Layer.launch, NodeRuntime.runMain, ); + +HealthServerLive.pipe(Layer.launch, NodeRuntime.runMain); diff --git a/apps/web-cluster/src/shard-manager.ts b/apps/web-cluster/src/shard-manager.ts index 127ce11704..d1ddf61809 100644 --- a/apps/web-cluster/src/shard-manager.ts +++ b/apps/web-cluster/src/shard-manager.ts @@ -3,7 +3,8 @@ import { NodeRuntime, } from "@effect/platform-node"; import { Layer, Logger } from "effect"; -import { DatabaseLive, ShardDatabaseLive } from "./shared/database"; + +import { DatabaseLive, ShardDatabaseLive } from "./shared/database.ts"; NodeClusterShardManagerSocket.layer({ storage: "sql", diff --git a/apps/web-cluster/src/shared/database.ts b/apps/web-cluster/src/shared/database.ts index 2530c4b0f7..ff303d19af 100644 --- a/apps/web-cluster/src/shared/database.ts +++ b/apps/web-cluster/src/shared/database.ts @@ -1,9 +1,9 @@ import { MysqlClient } from "@effect/sql-mysql2"; -import { Config, Effect, Layer, Option, Redacted } from "effect"; +import { Config, Effect, Layer, Option } from "effect"; export const DatabaseLive = Layer.unwrapEffect( Effect.gen(function* () { - const url = Redacted.make(yield* Config.string("DATABASE_URL")); + const url = yield* Config.redacted(Config.string("DATABASE_URL")); return MysqlClient.layer({ url }); }), diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index 7e1af8e6df..768ef23bcc 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -33,8 +33,8 @@ import { Option, } from "effect"; import { cookies } from "next/headers"; -import { allowedOrigins } from "@/utils/cors"; +import { allowedOrigins } from "@/utils/cors"; import { layerTracer } from "./tracing"; const CookiePasswordAttachmentLive = Layer.effect( diff --git a/packages/web-backend/src/Loom/Http.ts b/packages/web-backend/src/Loom/Http.ts index cf51649baf..d702761a8d 100644 --- a/packages/web-backend/src/Loom/Http.ts +++ b/packages/web-backend/src/Loom/Http.ts @@ -1,4 +1,4 @@ -import { CurrentUser, Http, Policy } from "@cap/web-domain"; +import { CurrentUser, Http, Policy, Video } from "@cap/web-domain"; import { HttpApiBuilder } from "@effect/platform"; import { Effect } from "effect"; @@ -24,7 +24,6 @@ export const LoomHttpLive = HttpApiBuilder.group( loom: payload.loom, }) .pipe( - Effect.tapDefect(Effect.logError), Effect.catchTag( "RpcClientError", () => new Http.InternalServerError({ cause: "unknown" }), diff --git a/packages/web-backend/src/Loom/ImportVideo.ts b/packages/web-backend/src/Loom/ImportVideo.ts index 204fd332a7..5fa85f543f 100644 --- a/packages/web-backend/src/Loom/ImportVideo.ts +++ b/packages/web-backend/src/Loom/ImportVideo.ts @@ -140,7 +140,9 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( Effect.repeat( Effect.gen(function* () { const bytes = yield* Effect.succeed(downloadedBytes); - yield* Effect.log(`Downloaded ${bytes} bytes`); + yield* Effect.log( + `Downloaded ${bytes}/${contentLength} bytes`, + ); }), Schedule.forever.pipe(Schedule.delayed(() => "2 seconds")), ).pipe(Effect.delay("100 millis")), diff --git a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts index 55a176b546..0e382d5064 100644 --- a/packages/web-backend/src/S3Buckets/S3BucketAccess.ts +++ b/packages/web-backend/src/S3Buckets/S3BucketAccess.ts @@ -27,7 +27,7 @@ const wrapS3Promise = ( Effect.tryPromise({ try: () => cbResult, catch: (cause) => new S3Error({ cause }), - }), + }).pipe(Effect.tapError(Effect.logError)), ), ); }).pipe( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d9223494e..3a67fc7ca6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,7 +112,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -199,7 +199,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -695,7 +695,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -878,6 +878,9 @@ importers: specifier: ^8.5.0 version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) devDependencies: + concurrently: + specifier: ^9.2.1 + version: 9.2.1 dotenv-cli: specifier: ^10.0.0 version: 10.0.0 @@ -999,7 +1002,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-email: specifier: ^4.0.16 version: 4.0.16(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -8108,6 +8111,11 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -12581,6 +12589,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -12719,6 +12730,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shiki@1.29.2: resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} @@ -19758,11 +19773,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -19773,7 +19788,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -21112,7 +21127,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -21123,18 +21138,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -22299,6 +22314,15 @@ snapshots: concat-map@0.0.1: {} + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -26373,7 +26397,7 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 - next-auth@4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 @@ -26448,7 +26472,7 @@ snapshots: cors: 2.8.5 next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -26502,7 +26526,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.42)(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -27892,14 +27916,13 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-beta.42)(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-beta.42 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -27948,6 +27971,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -28168,6 +28195,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + shiki@1.29.2: dependencies: '@shikijs/core': 1.29.2 @@ -29684,7 +29713,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29706,7 +29735,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(rolldown@1.0.0-beta.42)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.5(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 From fe3180e5000642adaea3eb729197e25838f1e05c Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 10 Oct 2025 09:30:56 +0800 Subject: [PATCH 09/25] make aws credentials optional --- packages/web-backend/src/S3Buckets/index.ts | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index 94d0ff19b9..ccb60f6957 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -24,15 +24,21 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Config.option, ), region: yield* Config.string("CAP_AWS_REGION"), - credentials: yield* Config.string("CAP_AWS_ACCESS_KEY").pipe( - Effect.zip(Config.string("CAP_AWS_SECRET_KEY")), - Effect.map(([accessKeyId, secretAccessKey]) => ({ - accessKeyId, - secretAccessKey, - })), - Effect.catchAll(() => - Config.string("VERCEL_AWS_ROLE_ARN").pipe( - Effect.map((arn) => awsCredentialsProvider({ roleArn: arn })), + credentials: Option.getOrUndefined( + yield* Config.option( + Config.all([ + Config.string("CAP_AWS_ACCESS_KEY"), + Config.string("CAP_AWS_SECRET_KEY"), + ]).pipe( + Config.map(([accessKeyId, secretAccessKey]) => ({ + accessKeyId, + secretAccessKey, + })), + Config.orElse(() => + Config.string("VERCEL_AWS_ROLE_ARN").pipe( + Config.map((arn) => awsCredentialsProvider({ roleArn: arn })), + ), + ), ), ), ), From 40ee84f675edb51b7a1611b6b1219c801333fd34 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 10 Oct 2025 09:36:21 +0800 Subject: [PATCH 10/25] cleanup --- apps/web/instrumentation.node.ts | 51 +++++++++++++++----------------- apps/web/lib/server.ts | 13 -------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/apps/web/instrumentation.node.ts b/apps/web/instrumentation.node.ts index aee3a12300..f23d1e7079 100644 --- a/apps/web/instrumentation.node.ts +++ b/apps/web/instrumentation.node.ts @@ -14,33 +14,30 @@ import { migrate } from "drizzle-orm/mysql2/migrator"; import path from "path"; export async function register() { - // if (process.env.NODE_ENV === "development") { - // } else { - // console.log("Waiting 5 seconds to run migrations"); - // // Function to trigger migrations with retry logic - // const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { - // try { - // await runMigrations(); - // } catch (error) { - // console.error( - // `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, - // error, - // ); - // if (retryCount < maxRetries - 1) { - // console.log( - // `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, - // ); - // setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); - // } else { - // console.error(`🚨 All ${maxRetries} migration attempts failed.`); - // process.exit(1); // Exit with error code if all attempts fail - // } - // } - // }; - // // Add a timeout to trigger migrations after 5 seconds on server start - // setTimeout(() => triggerMigrations(), 5000); - // setTimeout(() => createS3Bucket(), 5000); - // } + console.log("Waiting 5 seconds to run migrations"); + // Function to trigger migrations with retry logic + const triggerMigrations = async (retryCount = 0, maxRetries = 3) => { + try { + await runMigrations(); + } catch (error) { + console.error( + `🚨 Error triggering migrations (attempt ${retryCount + 1}):`, + error, + ); + if (retryCount < maxRetries - 1) { + console.log( + `🔄 Retrying in 5 seconds... (${retryCount + 1}/${maxRetries})`, + ); + setTimeout(() => triggerMigrations(retryCount + 1, maxRetries), 5000); + } else { + console.error(`🚨 All ${maxRetries} migration attempts failed.`); + process.exit(1); // Exit with error code if all attempts fail + } + } + }; + // Add a timeout to trigger migrations after 5 seconds on server start + setTimeout(() => triggerMigrations(), 5000); + setTimeout(() => createS3Bucket(), 5000); } async function createS3Bucket() { diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index 768ef23bcc..8e18a54a57 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -68,18 +68,6 @@ const WorkflowRpcLive = Layer.scoped( }), ); -const WorkflowHttpLive = Layer.scoped( - Workflows.HttpClient, - Effect.gen(function* () { - const url = Option.getOrElse( - yield* Config.option(Config.string("REMOTE_WORKFLOW_URL")), - () => "http://127.0.0.1:42169", - ); - - return yield* HttpApiClient.make(Workflows.Api, { baseUrl: url }); - }), -); - export const Dependencies = Layer.mergeAll( S3Buckets.Default, Videos.Default, @@ -89,7 +77,6 @@ export const Dependencies = Layer.mergeAll( OrganisationsPolicy.Default, Spaces.Default, WorkflowRpcLive, - WorkflowHttpLive, ).pipe( Layer.provideMerge(Layer.mergeAll(Database.Default, FetchHttpClient.layer)), ); From b4361e4aa418f0fea856311586f9b4e7e2dfb8c6 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 10 Oct 2025 09:56:30 +0800 Subject: [PATCH 11/25] types --- infra/sst-env.d.ts | 99 ++++++++++++++++----------------- packages/database/tsconfig.json | 8 ++- packages/web-domain/src/Loom.ts | 2 +- 3 files changed, 57 insertions(+), 52 deletions(-) diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index 4aee4b2323..2f7e8de340 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -4,56 +4,55 @@ /* deno-fmt-ignore-file */ declare module "sst" { - export interface Resource { - "AuroraDB": { - "clusterArn": string - "database": string - "host": string - "password": string - "port": number - "reader": string - "secretArn": string - "type": "sst.aws.Aurora" - "username": string - } - "CAP_AWS_ACCESS_KEY": { - "type": "sst.sst.Secret" - "value": string - } - "CAP_AWS_SECRET_KEY": { - "type": "sst.sst.Secret" - "value": string - } - "DATABASE_URL_HTTP": { - "type": "sst.sst.Secret" - "value": string - } - "DATABASE_URL_MYSQL": { - "type": "sst.sst.Secret" - "value": string - } - "GITHUB_PAT": { - "type": "sst.sst.Secret" - "value": string - } - "MyApi": { - "type": "sst.aws.ApiGatewayV2" - "url": string - } - "Runner": { - "service": string - "type": "sst.aws.Service" - } - "ShardManager": { - "service": string - "type": "sst.aws.Service" - } - "Vpc": { - "type": "sst.aws.Vpc" - } - } + export interface Resource { + AuroraDB: { + clusterArn: string; + database: string; + host: string; + password: string; + port: number; + reader: string; + secretArn: string; + type: "sst.aws.Aurora"; + username: string; + }; + CAP_AWS_ACCESS_KEY: { + type: "sst.sst.Secret"; + value: string; + }; + CAP_AWS_SECRET_KEY: { + type: "sst.sst.Secret"; + value: string; + }; + DATABASE_URL_HTTP: { + type: "sst.sst.Secret"; + value: string; + }; + DATABASE_URL_MYSQL: { + type: "sst.sst.Secret"; + value: string; + }; + GITHUB_PAT: { + type: "sst.sst.Secret"; + value: string; + }; + MyApi: { + type: "sst.aws.ApiGatewayV2"; + url: string; + }; + Runner: { + service: string; + type: "sst.aws.Service"; + }; + ShardManager: { + service: string; + type: "sst.aws.Service"; + }; + Vpc: { + type: "sst.aws.Vpc"; + }; + } } /// -import "sst" -export {} \ No newline at end of file +import "sst"; diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index f3acae5111..fc8cf80731 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -1,7 +1,13 @@ { "extends": "../config/base.tsconfig.json", "exclude": ["node_modules", "dist"], - "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx", + "./package.json" + ], "compilerOptions": { "composite": true, "outDir": "dist", diff --git a/packages/web-domain/src/Loom.ts b/packages/web-domain/src/Loom.ts index 5be512b9d8..032f5a1520 100644 --- a/packages/web-domain/src/Loom.ts +++ b/packages/web-domain/src/Loom.ts @@ -71,7 +71,7 @@ export class LoomHttpApi extends HttpApiGroup.make("loom") HttpApiEndpoint.post("importVideo", "/video") .setPayload( Schema.Struct({ - cap: Schema.Struct({ orgId: Schema.String }), + cap: Schema.Struct({ orgId: OrganisationId }), loom: ImportVideoLoomData, }), ) From 2a91e42bf083381823f1e21c94f2d3112bda94de Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 10 Oct 2025 09:58:58 +0800 Subject: [PATCH 12/25] types --- apps/web/lib/EffectRuntime.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/web/lib/EffectRuntime.ts b/apps/web/lib/EffectRuntime.ts index f39bf777a6..e9c8bccdfa 100644 --- a/apps/web/lib/EffectRuntime.ts +++ b/apps/web/lib/EffectRuntime.ts @@ -1,4 +1,3 @@ -import * as WebSdk from "@effect/opentelemetry/WebSdk"; import { FetchHttpClient } from "@effect/platform"; import { Layer, ManagedRuntime } from "effect"; import { @@ -6,15 +5,8 @@ import { makeUseEffectQuery, } from "./effect-react-query"; import { Rpc } from "./Rpcs"; -import { getTracingConfig } from "./tracing"; -// const TracingLayer = WebSdk.layer(getTracingConfig); - -const RuntimeLayer = Layer.mergeAll( - Rpc.Default, - // TracingLayer, - FetchHttpClient.layer, -); +const RuntimeLayer = Layer.mergeAll(Rpc.Default, FetchHttpClient.layer); export type RuntimeLayer = typeof RuntimeLayer; From b489244162dd7914dd571b0730e33c4607688b4c Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 20:08:45 +0800 Subject: [PATCH 13/25] update infra --- infra/sst-env.d.ts | 57 +++++++-------------------------------------- infra/sst.config.ts | 21 +++++++++++++++-- 2 files changed, 27 insertions(+), 51 deletions(-) diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index 2f7e8de340..a570b0cfe2 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -4,55 +4,14 @@ /* deno-fmt-ignore-file */ declare module "sst" { - export interface Resource { - AuroraDB: { - clusterArn: string; - database: string; - host: string; - password: string; - port: number; - reader: string; - secretArn: string; - type: "sst.aws.Aurora"; - username: string; - }; - CAP_AWS_ACCESS_KEY: { - type: "sst.sst.Secret"; - value: string; - }; - CAP_AWS_SECRET_KEY: { - type: "sst.sst.Secret"; - value: string; - }; - DATABASE_URL_HTTP: { - type: "sst.sst.Secret"; - value: string; - }; - DATABASE_URL_MYSQL: { - type: "sst.sst.Secret"; - value: string; - }; - GITHUB_PAT: { - type: "sst.sst.Secret"; - value: string; - }; - MyApi: { - type: "sst.aws.ApiGatewayV2"; - url: string; - }; - Runner: { - service: string; - type: "sst.aws.Service"; - }; - ShardManager: { - service: string; - type: "sst.aws.Service"; - }; - Vpc: { - type: "sst.aws.Vpc"; - }; - } + export interface Resource { + "DATABASE_URL": { + "type": "sst.sst.Secret" + "value": string + } + } } /// -import "sst"; +import "sst" +export {} \ No newline at end of file diff --git a/infra/sst.config.ts b/infra/sst.config.ts index eb1dba675f..dec3b2afa4 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -1,5 +1,7 @@ /// +import type { Input, Output } from "@pulumi/pulumi"; + const GITHUB_ORG = "CapSoftware"; const GITHUB_REPO = "Cap"; const GITHUB_APP_ID = "1196731"; @@ -30,6 +32,7 @@ export default $config({ aws: {}, planetscale: true, awsx: "2.21.1", + random: true, }, }; }, @@ -152,6 +155,10 @@ export default $config({ [ ...vercelVariables, { key: "REMOTE_WORKFLOW_URL", value: workflowCluster.api.url }, + { + key: "REMOTE_WORKFLOW_SECRET", + value: secrets.WORKFLOW_RPC_SECRET.result, + }, { key: "VERCEL_AWS_ROLE_ARN", value: vercelAwsAccessRole.arn }, ].map( (v) => @@ -179,6 +186,9 @@ function Secrets() { CAP_AWS_ACCESS_KEY: new sst.Secret("CAP_AWS_ACCESS_KEY"), CAP_AWS_SECRET_KEY: new sst.Secret("CAP_AWS_SECRET_KEY"), GITHUB_PAT: new sst.Secret("GITHUB_PAT"), + WORKFLOW_RPC_SECRET: new random.RandomString("WORKFLOW_RPC_SECRET", { + length: 48, + }), }; } @@ -286,8 +296,8 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { }); const commonEnvironment = { - CAP_AWS_REGION: bucket.region, - CAP_AWS_BUCKET: bucket.bucket, + CAP_AWS_REGION: $output(bucket).region, + CAP_AWS_BUCKET: $output(bucket).bucket, SHARD_DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, @@ -295,6 +305,7 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { AXIOM_API_TOKEN, AXIOM_DOMAIN: "api.axiom.co", AXIOM_DATASET, + AUTH_SECRET: secrets.WORKFLOW_RPC_SECRET.result, }; const ghcrCredentialsSecret = new aws.secretsmanager.Secret( @@ -409,6 +420,12 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { ghcrCredentialsTransform.taskDefinition(args); }, }, + permissions: [ + { + actions: ["s3:*"], + resources: [bucket.arn, $interpolate`${bucket.arn}/*`], + }, + ], }); const api = new sst.aws.ApiGatewayV2("MyApi", { From 96a6aa006f9dee4bfd816b60f59093bb02e0d511 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 20:20:29 +0800 Subject: [PATCH 14/25] workflow secret --- .dockerignore | 7 +- .npmrc | 1 + apps/web-cluster/package.json | 3 +- apps/web-cluster/src/runner/index.ts | 24 ++- apps/web/lib/server.ts | 38 +++- crates/recording/src/output_pipeline/core.rs | 2 +- packages/web-backend/src/Http/Errors.ts | 5 + packages/web-backend/src/Workflows.ts | 14 +- pnpm-lock.yaml | 179 ++++++++++++++++++- scripts/setup.js | 2 +- 10 files changed, 259 insertions(+), 16 deletions(-) diff --git a/.dockerignore b/.dockerignore index f3006cb251..049a67b542 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ -target/ -node_modules/ -crates/ +target +crates +**/node_modules +**/.next diff --git a/.npmrc b/.npmrc index ded82e2f63..5af059cef4 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ auto-install-peers = true +force-legacy-deploy = true diff --git a/apps/web-cluster/package.json b/apps/web-cluster/package.json index 0408d4d7b6..ac4b56cafc 100644 --- a/apps/web-cluster/package.json +++ b/apps/web-cluster/package.json @@ -22,7 +22,8 @@ "effect": "^3.17.14", "rolldown": "1.0.0-beta.42", "tsdown": "^0.15.6", - "tsup": "^8.5.0" + "tsup": "^8.5.0", + "vite": "^6.3.5" }, "devDependencies": { "concurrently": "^9.2.1", diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts index 11e773bc05..6a6e6450bc 100644 --- a/apps/web-cluster/src/runner/index.ts +++ b/apps/web-cluster/src/runner/index.ts @@ -4,8 +4,7 @@ import { ClusterWorkflowEngine, RunnerAddress } from "@effect/cluster"; import * as NodeSdk from "@effect/opentelemetry/NodeSdk"; import { FetchHttpClient, - HttpApiBuilder, - HttpMiddleware, + Headers, HttpRouter, HttpServer, } from "@effect/platform"; @@ -24,6 +23,10 @@ import { ContainerMetadata } from "../cluster/container-metadata.ts"; import { DatabaseLive, ShardDatabaseLive } from "../shared/database.ts"; import { HealthServerLive } from "./health-server.ts"; +class RpcAuthSecret extends Effect.Service()("RpcAuthSecret", { + effect: Effect.map(Config.string("AUTH_SECRET"), (v) => ({ authSecret: v })), +}) {} + const ClusterWorkflowLive = Layer.unwrapEffect( Effect.gen(function* () { const containerMeta = yield* ContainerMetadata; @@ -48,6 +51,22 @@ const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( Layer.provide(Workflows.WorkflowsLayer), Layer.provide(ClusterWorkflowLive), Layer.provide(RpcServer.layerProtocolHttp({ path: "/" })), + Layer.provide( + Layer.effect( + Workflows.SecretAuthMiddleware, + Effect.gen(function* () { + const { authSecret } = yield* RpcAuthSecret; + + return Workflows.SecretAuthMiddleware.of((options) => { + const authHeader = Headers.get(options.headers, "authorization"); + if (Option.isNone(authHeader) || authHeader.value !== authSecret) + return new Workflows.InvalidRpcAuth(); + + return options.next; + }); + }), + ), + ), Layer.provide(Workflows.RpcSerialization), ); @@ -92,6 +111,7 @@ HttpRouter.Default.serve().pipe( Layer.provide(FetchHttpClient.layer), Layer.provide(DatabaseLive), Layer.provide(TracingLayer), + Layer.provide(RpcAuthSecret.Default), Layer.launch, NodeRuntime.runMain, ); diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index 8e18a54a57..6dba486ef5 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -16,13 +16,14 @@ import { import { type HttpAuthMiddleware, Video } from "@cap/web-domain"; import { FetchHttpClient, + Headers, type HttpApi, HttpApiBuilder, HttpApiClient, HttpMiddleware, HttpServer, } from "@effect/platform"; -import { RpcClient } from "@effect/rpc"; +import { RpcClient, RpcMessage, RpcMiddleware } from "@effect/rpc"; import { Cause, Config, @@ -31,6 +32,7 @@ import { Layer, ManagedRuntime, Option, + Redacted, } from "effect"; import { cookies } from "next/headers"; @@ -50,6 +52,16 @@ const CookiePasswordAttachmentLive = Layer.effect( }), ); +class WorkflowRpcSecret extends Effect.Service()( + "WorkflowRpcSecret", + { + effect: Effect.map( + Config.redacted(Config.string("REMOTE_WORKFLOW_SECRET")), + (v) => ({ authSecret: v }), + ), + }, +) {} + const WorkflowRpcLive = Layer.scoped( Workflows.RpcClient, Effect.gen(function* () { @@ -66,6 +78,22 @@ const WorkflowRpcLive = Layer.scoped( ), ); }), +).pipe( + Layer.provide( + RpcMiddleware.layerClient(Workflows.SecretAuthMiddleware, ({ request }) => + Effect.gen(function* () { + const { authSecret } = yield* WorkflowRpcSecret; + return { + ...request, + headers: Headers.set( + request.headers, + "authorization", + Redacted.value(authSecret), + ), + }; + }), + ), + ), ); export const Dependencies = Layer.mergeAll( @@ -78,7 +106,13 @@ export const Dependencies = Layer.mergeAll( Spaces.Default, WorkflowRpcLive, ).pipe( - Layer.provideMerge(Layer.mergeAll(Database.Default, FetchHttpClient.layer)), + Layer.provideMerge( + Layer.mergeAll( + Database.Default, + FetchHttpClient.layer, + WorkflowRpcSecret.Default, + ), + ), ); // purposefully not exposed diff --git a/crates/recording/src/output_pipeline/core.rs b/crates/recording/src/output_pipeline/core.rs index 817fb123bb..017f787a99 100644 --- a/crates/recording/src/output_pipeline/core.rs +++ b/crates/recording/src/output_pipeline/core.rs @@ -128,7 +128,7 @@ impl TaskPool { let res = future.await; match &res { Ok(_) => info!("Task finished successfully"), - Err(err) => error!("Task failed: {}", err), + Err(err) => error!("Task failed: {:#}", err), } res } diff --git a/packages/web-backend/src/Http/Errors.ts b/packages/web-backend/src/Http/Errors.ts index f15bd1f9d0..f304279267 100644 --- a/packages/web-backend/src/Http/Errors.ts +++ b/packages/web-backend/src/Http/Errors.ts @@ -1,5 +1,6 @@ import { DatabaseError, Http, S3Error } from "@cap/web-domain"; import { Effect, Schema } from "effect"; +import { InvalidRpcAuth } from "../Workflows"; export const handleDomainError = (e: Effect.Effect) => e.pipe( @@ -11,4 +12,8 @@ export const handleDomainError = (e: Effect.Effect) => (e) => Schema.is(S3Error)(e), () => new Http.InternalServerError({ cause: "database" }), ), + Effect.catchIf( + (e) => Schema.is(InvalidRpcAuth)(e), + () => new Http.InternalServerError({ cause: "unknown" }), + ), ); diff --git a/packages/web-backend/src/Workflows.ts b/packages/web-backend/src/Workflows.ts index 2a2a469f9b..e689148f4b 100644 --- a/packages/web-backend/src/Workflows.ts +++ b/packages/web-backend/src/Workflows.ts @@ -2,12 +2,22 @@ import { Loom } from "@cap/web-domain"; import { HttpApi, type HttpApiClient } from "@effect/platform"; import * as Rpc from "@effect/rpc"; import { WorkflowProxy, WorkflowProxyServer } from "@effect/workflow"; -import { Context, Layer } from "effect"; +import { Context, Layer, Schema } from "effect"; import { LoomImportVideoLive } from "./Loom/index.ts"; +export class InvalidRpcAuth extends Schema.TaggedError()( + "InvalidRpcAuth", + {}, +) {} +export class SecretAuthMiddleware extends Rpc.RpcMiddleware.Tag()( + "SecretAuthMiddleware", + { requiredForClient: true, wrap: true, failure: InvalidRpcAuth }, +) {} + export const Workflows = [Loom.ImportVideo] as const; -export const RpcGroup = WorkflowProxy.toRpcGroup(Workflows); +export const RpcGroup = + WorkflowProxy.toRpcGroup(Workflows).middleware(SecretAuthMiddleware); export const RpcSerialization = Rpc.RpcSerialization.layerJson; export class RpcClient extends Context.Tag("Workflows/RpcClient")< diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a67fc7ca6..724dec00ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -877,6 +877,9 @@ importers: tsup: specifier: ^8.5.0 version: 8.5.0(jiti@2.6.1)(postcss@8.5.3)(typescript@5.8.3)(yaml@2.8.1) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) devDependencies: concurrently: specifier: ^9.2.1 @@ -3836,6 +3839,9 @@ packages: '@napi-rs/wasm-runtime@1.0.6': resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@netlify/binary-info@1.0.0': resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} @@ -5293,86 +5299,172 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.42': resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.43': + resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.42': resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -12551,6 +12643,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-beta.43: + resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-inject@3.0.2: resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. @@ -17346,6 +17443,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@netlify/binary-info@1.0.0': {} '@netlify/blobs@9.1.0': @@ -19006,49 +19110,95 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.42': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.43': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.42': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.43': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': dependencies: '@napi-rs/wasm-runtime': 1.0.6 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + optional: true + '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rollup/plugin-alias@5.1.1(rollup@4.40.2)': optionalDependencies: rollup: 4.40.2 @@ -27867,7 +28017,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -27878,7 +28028,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.11.0 magic-string: 0.30.19 - rolldown: 1.0.0-beta.42 + rolldown: 1.0.0-beta.43 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -27906,6 +28056,27 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + rolldown@1.0.0-beta.43: + dependencies: + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.43 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-x64': 1.0.0-beta.43 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 + rollup-plugin-inject@3.0.2: dependencies: estree-walker: 0.6.1 @@ -29120,8 +29291,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.42 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.8.3) + rolldown: 1.0.0-beta.43 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 diff --git a/scripts/setup.js b/scripts/setup.js index afd8413939..235ce33af8 100644 --- a/scripts/setup.js +++ b/scripts/setup.js @@ -230,7 +230,7 @@ async function signMacOSFrameworkLibs(frameworkDir) { .map((entry) => exec( `codesign ${keychain} -s "${signId}" -f "${path.join( - entry.path, + entry.parentPath, entry.name, )}"`, ), From 943512429ad77a0a9518e4cf293aa981d4831402 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Mon, 13 Oct 2025 12:40:36 +0000 Subject: [PATCH 15/25] remove aws keys from ecs --- infra/sst.config.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/infra/sst.config.ts b/infra/sst.config.ts index c68b096d8c..915e523251 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -300,8 +300,6 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { CAP_AWS_BUCKET: bucket.bucket, SHARD_DATABASE_URL: $interpolate`mysql://${db.username}:${db.password}@${db.host}:${db.port}/${db.database}`, DATABASE_URL: secrets.DATABASE_URL_MYSQL.value, - CAP_AWS_ACCESS_KEY: secrets.CAP_AWS_ACCESS_KEY.value, - CAP_AWS_SECRET_KEY: secrets.CAP_AWS_SECRET_KEY.value, AXIOM_API_TOKEN, AXIOM_DOMAIN: "api.axiom.co", AXIOM_DATASET, From 039b88b7e85d5938177b23d1c57af65fd83bdc31 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 20:55:27 +0800 Subject: [PATCH 16/25] update deps --- pnpm-lock.yaml | 172 ++++++++++++++++++++++++++++++------------------- 1 file changed, 104 insertions(+), 68 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ac33f34d5..10a15597da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,7 +112,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -199,7 +199,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -479,7 +479,7 @@ importers: version: 0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1) '@effect/opentelemetry': specifier: ^0.58.0 - version: 0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.18.4) + version: 0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)(effect@3.18.4) '@effect/platform': specifier: ^0.92.1 version: 0.92.1(effect@3.18.4) @@ -518,7 +518,7 @@ importers: version: 0.0.14 '@kubiks/otel-drizzle': specifier: ^2.1.0 - version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)) + version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2)) '@mux/mux-node': specifier: ^8.5.1 version: 8.8.0(encoding@0.1.13) @@ -644,7 +644,7 @@ importers: version: 16.5.0 drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) dub: specifier: ^0.64.0 version: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) @@ -846,7 +846,7 @@ importers: version: 0.50.4(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(@effect/workflow@0.11.3(@effect/platform@0.92.1(effect@3.18.4))(@effect/rpc@0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4))(effect@3.18.4) '@effect/opentelemetry': specifier: ^0.58.0 - version: 0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.18.4) + version: 0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)(effect@3.18.4) '@effect/platform': specifier: ^0.92.1 version: 0.92.1(effect@3.18.4) @@ -975,7 +975,7 @@ importers: version: 0.47.0(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4) '@kubiks/otel-drizzle': specifier: ^2.1.0 - version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1)) + version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2)) '@mattrax/mysql-planetscale': specifier: ^0.0.3 version: 0.0.3 @@ -996,7 +996,7 @@ importers: version: 1.0.5(react@19.1.1) drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) dub: specifier: ^0.64.0 version: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) @@ -1353,7 +1353,7 @@ importers: version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) effect: specifier: ^3.18.4 version: 3.18.4 @@ -4397,6 +4397,10 @@ packages: resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} @@ -6877,6 +6881,9 @@ packages: '@types/node@20.19.19': resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==} + '@types/node@20.19.21': + resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==} + '@types/node@22.15.14': resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} @@ -7780,8 +7787,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.12: - resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} hasBin: true basic-auth@2.0.1: @@ -7973,8 +7980,8 @@ packages: caniuse-lite@1.0.30001743: resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} - caniuse-lite@1.0.30001748: - resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} @@ -8599,6 +8606,10 @@ packages: resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -8867,8 +8878,8 @@ packages: electron-to-chromium@1.5.150: resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} - electron-to-chromium@1.5.231: - resolution: {integrity: sha512-cyl6vqZGkEBnz/PmvFHn/u9G/hbo+FF2CNAOXriG87QOeLsUdifCZ9UbHNscE9wGdrC8XstNMli0CbQnZQ+fkA==} + electron-to-chromium@1.5.234: + resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -10796,8 +10807,8 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} local-pkg@0.5.1: @@ -11383,6 +11394,10 @@ packages: resolution: {integrity: sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==} engines: {node: '>= 8.0'} + mysql2@3.15.2: + resolution: {integrity: sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg==} + engines: {node: '>= 8.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -12215,8 +12230,8 @@ packages: property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} proxy-addr@2.0.7: @@ -16024,10 +16039,10 @@ snapshots: '@effect/language-service@0.44.0': {} - '@effect/opentelemetry@0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.18.4)': + '@effect/opentelemetry@0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)(effect@3.18.4)': dependencies: '@effect/platform': 0.92.1(effect@3.18.4) - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 effect: 3.18.4 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -16038,10 +16053,10 @@ snapshots: '@opentelemetry/sdk-trace-node': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': 2.1.0(@opentelemetry/api@1.9.0) - '@effect/opentelemetry@0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.18.4)': + '@effect/opentelemetry@0.58.0(@effect/platform@0.92.1(effect@3.18.4))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)(effect@3.18.4)': dependencies: '@effect/platform': 0.92.1(effect@3.18.4) - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 effect: 3.18.4 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -16100,7 +16115,7 @@ snapshots: '@effect/platform': 0.92.1(effect@3.18.4) '@effect/sql': 0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4) effect: 3.18.4 - mysql2: 3.14.1 + mysql2: 3.15.2 '@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)': dependencies: @@ -16740,7 +16755,7 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.4.0 + protobufjs: 7.5.4 yargs: 17.7.2 '@headlessui/react@1.7.19(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': @@ -17296,10 +17311,10 @@ snapshots: '@solid-primitives/utils': 6.3.1(solid-js@1.9.6) solid-js: 1.9.6 - '@kubiks/otel-drizzle@2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))': + '@kubiks/otel-drizzle@2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))': dependencies: '@opentelemetry/api': 1.9.0 - drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) + drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) '@logdna/tail-file@2.2.0': {} @@ -18006,13 +18021,13 @@ snapshots: '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 optional: true '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -18091,7 +18106,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.206.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - protobufjs: 7.4.0 + protobufjs: 7.5.4 '@opentelemetry/otlp-transformer@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -18102,7 +18117,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - protobufjs: 7.4.0 + protobufjs: 7.5.4 '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18124,14 +18139,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 optional: true '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18179,7 +18194,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.36.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18210,6 +18225,8 @@ snapshots: '@opentelemetry/semantic-conventions@1.36.0': {} + '@opentelemetry/semantic-conventions@1.37.0': {} + '@oxc-project/types@0.94.0': {} '@panva/hkdf@1.2.1': {} @@ -19984,11 +20001,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -19999,7 +20016,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -20874,6 +20891,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@20.19.21': + dependencies: + undici-types: 6.21.0 + '@types/node@22.15.14': dependencies: undici-types: 6.21.0 @@ -21338,7 +21359,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -21349,18 +21370,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -22053,7 +22074,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.12: {} + baseline-browser-mapping@2.8.16: {} basic-auth@2.0.1: dependencies: @@ -22164,9 +22185,9 @@ snapshots: browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.12 - caniuse-lite: 1.0.30001748 - electron-to-chromium: 1.5.231 + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.234 node-releases: 2.0.23 update-browserslist-db: 1.1.3(browserslist@4.26.3) @@ -22293,7 +22314,7 @@ snapshots: caniuse-lite@1.0.30001743: {} - caniuse-lite@1.0.30001748: {} + caniuse-lite@1.0.30001750: {} canvas-confetti@1.9.3: {} @@ -22715,10 +22736,10 @@ snapshots: dayjs@1.11.13: {} - db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1): + db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2): optionalDependencies: - drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1) - mysql2: 3.14.1 + drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) + mysql2: 3.15.2 debounce@2.2.0: {} @@ -22835,6 +22856,9 @@ snapshots: detect-libc@2.1.1: {} + detect-libc@2.1.2: + optional: true + detect-newline@3.1.0: {} detect-node-es@1.1.0: {} @@ -22973,12 +22997,12 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1): + drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2): optionalDependencies: '@cloudflare/workers-types': 4.20250507.0 '@opentelemetry/api': 1.9.0 '@planetscale/database': 1.19.0 - mysql2: 3.14.1 + mysql2: 3.15.2 dts-resolver@2.1.2: {} @@ -23011,7 +23035,7 @@ snapshots: electron-to-chromium@1.5.150: {} - electron-to-chromium@1.5.231: {} + electron-to-chromium@1.5.234: {} emittery@0.13.1: {} @@ -25557,7 +25581,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.19 + '@types/node': 20.19.21 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -25774,7 +25798,7 @@ snapshots: load-tsconfig@0.2.5: {} - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} local-pkg@0.5.1: dependencies: @@ -26569,6 +26593,18 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 + mysql2@3.15.2: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.0 + long: 5.3.2 + lru.min: 1.1.2 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -26683,7 +26719,7 @@ snapshots: cors: 2.8.5 next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -26705,7 +26741,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.0.0 crossws: 0.3.5 - db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1) + db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2) defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 @@ -26751,7 +26787,7 @@ snapshots: unenv: 2.0.0-rc.15 unimport: 5.0.1 unplugin-utils: 0.2.4 - unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(ioredis@5.6.1) + unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) untyped: 2.0.0 unwasm: 0.3.9 youch: 4.1.0-beta.7 @@ -26812,7 +26848,7 @@ snapshots: node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.1.1 + detect-libc: 2.1.2 optional: true node-gyp-build@4.8.4: {} @@ -27537,7 +27573,7 @@ snapshots: property-information@7.0.0: {} - protobufjs@7.4.0: + protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -27549,7 +27585,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.19.19 + '@types/node': 20.17.43 long: 5.3.2 proxy-addr@2.0.7: @@ -29786,7 +29822,7 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 - unstorage@1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(ioredis@5.6.1): + unstorage@1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -29798,7 +29834,7 @@ snapshots: ufo: 1.6.1 optionalDependencies: '@planetscale/database': 1.19.0 - db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1) + db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2) ioredis: 5.6.1 untun@0.1.3: @@ -29945,7 +29981,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.14.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29967,7 +30003,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(encoding@0.1.13)(mysql2@3.14.1)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -29978,7 +30014,7 @@ snapshots: ufo: 1.6.1 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.14.1))(mysql2@3.14.1))(ioredis@5.6.1) + unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: @@ -30230,7 +30266,7 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 From 9e02df8985dd51ac6bb3ba8e9d5929cea7a9af56 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 21:30:21 +0800 Subject: [PATCH 17/25] reorganise error handling a bit --- packages/web-backend/src/Loom/ImportVideo.ts | 55 +++++++++++--------- packages/web-domain/src/Loom.ts | 12 ++--- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/packages/web-backend/src/Loom/ImportVideo.ts b/packages/web-backend/src/Loom/ImportVideo.ts index 5fa85f543f..fde9f79f12 100644 --- a/packages/web-backend/src/Loom/ImportVideo.ts +++ b/packages/web-backend/src/Loom/ImportVideo.ts @@ -16,7 +16,7 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( yield* Activity.make({ name: "VerifyURLValid", - error: Schema.Union(Loom.VideoURLInvalidError, Loom.ExternalLoomError), + error: Schema.Union(Loom.VideoInvalidError, Loom.ExternalLoomError), execute: http .get(payload.loom.video.downloadUrl, { headers: { range: "bytes=0-0" }, @@ -29,12 +29,12 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( cause, ): Effect.Effect< never, - Loom.VideoURLInvalidError | Loom.ExternalLoomError + Loom.VideoInvalidError | Loom.ExternalLoomError > => { if (cause.response.status < 500) return Effect.fail( - new Loom.VideoURLInvalidError({ - status: cause.response.status, + new Loom.VideoInvalidError({ + cause: "NotFound", }), ); @@ -46,7 +46,7 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( Effect.retry({ schedule: Schedule.exponential("200 millis"), times: 3, - while: (e) => e._tag !== "VideoURLInvalidError", + while: (e) => e._tag !== "VideoInvalidError", }), Effect.catchTag("RequestError", Effect.die), ), @@ -103,7 +103,12 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( yield* Activity.make({ name: "DownloadVideo", - error: Schema.Union(S3Error, DatabaseError, Loom.ExternalLoomError), + error: Schema.Union( + S3Error, + DatabaseError, + Loom.VideoInvalidError, + Loom.ExternalLoomError, + ), execute: Effect.gen(function* () { const [s3Bucket] = yield* s3Buckets.getBucketAccess(customBucketId); @@ -113,9 +118,15 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( .pipe( Effect.catchAll((cause) => new Loom.ExternalLoomError({ cause })), ); - const contentLength = Headers.get(resp.headers, "content-length").pipe( + const contentLength = yield* Headers.get( + resp.headers, + "content-length", + ).pipe( Option.map((v) => Number(v)), - Option.getOrUndefined, + Effect.catchTag( + "NoSuchElementException", + () => new Loom.VideoInvalidError({ cause: "InvalidContentLength" }), + ), ); yield* Effect.log(`Downloading ${contentLength} bytes`); @@ -123,8 +134,17 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( const key = source.getFileKey(); - yield* s3Bucket - .putObject( + yield* Effect.gen(function* () { + // TODO: Connect this with upload progress + yield* Effect.repeat( + Effect.gen(function* () { + const bytes = yield* Effect.succeed(downloadedBytes); + yield* Effect.log(`Downloaded ${bytes}/${contentLength} bytes`); + }), + Schedule.forever.pipe(Schedule.delayed(() => "2 seconds")), + ).pipe(Effect.delay("100 millis"), Effect.forkScoped); + + yield* s3Bucket.putObject( key, resp.stream.pipe( Stream.tap((bytes) => { @@ -133,21 +153,8 @@ export const LoomImportVideoLive = Loom.ImportVideo.toLayer( }), ), { contentLength }, - ) - .pipe( - Effect.race( - // TODO: Connect this with upload progress - Effect.repeat( - Effect.gen(function* () { - const bytes = yield* Effect.succeed(downloadedBytes); - yield* Effect.log( - `Downloaded ${bytes}/${contentLength} bytes`, - ); - }), - Schedule.forever.pipe(Schedule.delayed(() => "2 seconds")), - ).pipe(Effect.delay("100 millis")), - ), ); + }).pipe(Effect.scoped); yield* Effect.log( `Uploaded video for user '${payload.cap.userId}' at key '${key}'`, diff --git a/packages/web-domain/src/Loom.ts b/packages/web-domain/src/Loom.ts index 032f5a1520..067ed396df 100644 --- a/packages/web-domain/src/Loom.ts +++ b/packages/web-domain/src/Loom.ts @@ -22,10 +22,10 @@ export class ExternalLoomError extends Schema.TaggedError()( HttpApiSchema.annotations({ status: 500 }), ) {} -export class VideoURLInvalidError extends Schema.TaggedError()( - "VideoURLInvalidError", - { status: Schema.Number }, - HttpApiSchema.annotations({ status: 404 }), +export class VideoInvalidError extends Schema.TaggedError()( + "VideoInvalidError", + { cause: Schema.Literal("NotFound", "InvalidContentLength") }, + HttpApiSchema.annotations({ status: 400 }), ) {} export const ImportVideoLoomData = Schema.Struct({ @@ -60,7 +60,7 @@ export const ImportVideo = Workflow.make({ Video.NotFoundError, S3Error, ExternalLoomError, - VideoURLInvalidError, + VideoInvalidError, ), idempotencyKey: (p) => `${p.cap.userId}-${p.loom.orgId}-${p.loom.video.id}-${p.attempt ?? 0}`, @@ -76,7 +76,7 @@ export class LoomHttpApi extends HttpApiGroup.make("loom") }), ) .addSuccess(Schema.Struct({ videoId: Video.VideoId })) - .addError(VideoURLInvalidError) + .addError(VideoInvalidError) .addError(InternalServerError) .addError(PolicyDeniedError) .addError(Video.NotFoundError) From c51258792944a787e1dfad11455c98230c1ef46b Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 22:02:04 +0800 Subject: [PATCH 18/25] fixup envs --- apps/web-cluster/src/runner/index.ts | 4 +++- apps/web/lib/server.ts | 4 ++-- infra/sst.config.ts | 10 +++++----- packages/web-backend/src/Http/Errors.ts | 2 +- packages/web-backend/src/Spaces/index.ts | 6 +++--- packages/web-domain/src/S3Bucket.ts | 2 +- scripts/env-cli.js | 1 + 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts index 24c5a50523..d8c0e594c8 100644 --- a/apps/web-cluster/src/runner/index.ts +++ b/apps/web-cluster/src/runner/index.ts @@ -26,7 +26,9 @@ import { DatabaseLive, ShardDatabaseLive } from "../shared/database.ts"; import { HealthServerLive } from "./health-server.ts"; class RpcAuthSecret extends Effect.Service()("RpcAuthSecret", { - effect: Effect.map(Config.string("AUTH_SECRET"), (v) => ({ authSecret: v })), + effect: Effect.map(Config.string("WORKFLOWS_RPC_SECRET"), (v) => ({ + authSecret: v, + })), }) {} const ClusterWorkflowLive = Layer.unwrapEffect( diff --git a/apps/web/lib/server.ts b/apps/web/lib/server.ts index c945e9832a..adef04d2a2 100644 --- a/apps/web/lib/server.ts +++ b/apps/web/lib/server.ts @@ -56,7 +56,7 @@ class WorkflowRpcSecret extends Effect.Service()( "WorkflowRpcSecret", { effect: Effect.map( - Config.redacted(Config.string("REMOTE_WORKFLOW_SECRET")), + Config.redacted(Config.string("WORKFLOWS_RPC_SECRET")), (v) => ({ authSecret: v }), ), }, @@ -66,7 +66,7 @@ const WorkflowRpcLive = Layer.scoped( Workflows.RpcClient, Effect.gen(function* () { const url = Option.getOrElse( - yield* Config.option(Config.string("REMOTE_WORKFLOW_URL")), + yield* Config.option(Config.string("WORKFLOWS_RPC_URL")), () => "http://127.0.0.1:42169", ); diff --git a/infra/sst.config.ts b/infra/sst.config.ts index 915e523251..3423bdcb95 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -154,10 +154,10 @@ export default $config({ if ($app.stage === "staging" || $app.stage === "production") { [ ...vercelVariables, - { key: "REMOTE_WORKFLOW_URL", value: workflowCluster.api.url }, + { key: "WORKFLOWS_RPC_URL", value: workflowCluster.api.url }, { - key: "REMOTE_WORKFLOW_SECRET", - value: secrets.WORKFLOW_RPC_SECRET.result, + key: "WORKFLOWS_RPC_SECRET", + value: secrets.WORKFLOWS_RPC_SECRET.result, }, { key: "VERCEL_AWS_ROLE_ARN", value: vercelAwsAccessRole.arn }, ].map( @@ -186,7 +186,7 @@ function Secrets() { CAP_AWS_ACCESS_KEY: new sst.Secret("CAP_AWS_ACCESS_KEY"), CAP_AWS_SECRET_KEY: new sst.Secret("CAP_AWS_SECRET_KEY"), GITHUB_PAT: new sst.Secret("GITHUB_PAT"), - WORKFLOW_RPC_SECRET: new random.RandomString("WORKFLOW_RPC_SECRET", { + WORKFLOWS_RPC_SECRET: new random.RandomString("WORKFLOWS_RPC_SECRET", { length: 48, }), }; @@ -303,7 +303,7 @@ async function WorkflowCluster(bucket: aws.s3.BucketV2, secrets: Secrets) { AXIOM_API_TOKEN, AXIOM_DOMAIN: "api.axiom.co", AXIOM_DATASET, - AUTH_SECRET: secrets.WORKFLOW_RPC_SECRET.result, + WORKFLOWS_RPC_SECRET: secrets.WORKFLOWS_RPC_SECRET.result, }; const ghcrCredentialsSecret = new aws.secretsmanager.Secret( diff --git a/packages/web-backend/src/Http/Errors.ts b/packages/web-backend/src/Http/Errors.ts index f304279267..68bf33d6ff 100644 --- a/packages/web-backend/src/Http/Errors.ts +++ b/packages/web-backend/src/Http/Errors.ts @@ -1,6 +1,6 @@ import { DatabaseError, Http, S3Error } from "@cap/web-domain"; import { Effect, Schema } from "effect"; -import { InvalidRpcAuth } from "../Workflows"; +import { InvalidRpcAuth } from "../Workflows.ts"; export const handleDomainError = (e: Effect.Effect) => e.pipe( diff --git a/packages/web-backend/src/Spaces/index.ts b/packages/web-backend/src/Spaces/index.ts index 854da82ce1..c0aecf7ba5 100644 --- a/packages/web-backend/src/Spaces/index.ts +++ b/packages/web-backend/src/Spaces/index.ts @@ -3,9 +3,9 @@ import { type Organisation, Policy, type Space } from "@cap/web-domain"; import * as Dz from "drizzle-orm"; import { Effect } from "effect"; -import { Database } from "../Database"; -import { OrganisationsPolicy } from "../Organisations/OrganisationsPolicy"; -import { SpacesPolicy } from "./SpacesPolicy"; +import { Database } from "../Database.ts"; +import { OrganisationsPolicy } from "../Organisations/OrganisationsPolicy.ts"; +import { SpacesPolicy } from "./SpacesPolicy.ts"; export class Spaces extends Effect.Service()("Spaces", { effect: Effect.gen(function* () { diff --git a/packages/web-domain/src/S3Bucket.ts b/packages/web-domain/src/S3Bucket.ts index c0dc494642..60f264f3ce 100644 --- a/packages/web-domain/src/S3Bucket.ts +++ b/packages/web-domain/src/S3Bucket.ts @@ -1,5 +1,5 @@ import { Schema } from "effect"; -import { UserId } from "./User"; +import { UserId } from "./User.ts"; export const S3BucketId = Schema.String.pipe(Schema.brand("S3BucketId")); export type S3BucketId = typeof S3BucketId.Type; diff --git a/scripts/env-cli.js b/scripts/env-cli.js index d54af88133..d48146a2ef 100644 --- a/scripts/env-cli.js +++ b/scripts/env-cli.js @@ -58,6 +58,7 @@ async function main() { envs.VITE_SERVER_URL = "http://localhost:3000"; envs.WEB_URL = "http://localhost:3000"; envs.NEXTAUTH_URL = envs.WEB_URL; + envs.WORKFLOWS_RPC_SECRET = crypto.randomBytes(32).toString("base64"); if (!allEnvs.NEXTAUTH_SECRET) { allEnvs.NEXTAUTH_SECRET = crypto.randomBytes(32).toString("base64"); From 1cdc86393b39bdd14cfa80d0e45ed70c04951515 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 22:07:33 +0800 Subject: [PATCH 19/25] fix handleDomainError --- packages/web-backend/src/Http/Errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-backend/src/Http/Errors.ts b/packages/web-backend/src/Http/Errors.ts index 68bf33d6ff..44ef6cb440 100644 --- a/packages/web-backend/src/Http/Errors.ts +++ b/packages/web-backend/src/Http/Errors.ts @@ -10,7 +10,7 @@ export const handleDomainError = (e: Effect.Effect) => ), Effect.catchIf( (e) => Schema.is(S3Error)(e), - () => new Http.InternalServerError({ cause: "database" }), + () => new Http.InternalServerError({ cause: "s3" }), ), Effect.catchIf( (e) => Schema.is(InvalidRpcAuth)(e), From 71f9f7416177eda9152b7fd3f381c8ba15f44017 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 13 Oct 2025 22:17:38 +0800 Subject: [PATCH 20/25] log if no rpc auth header --- apps/web-cluster/src/runner/index.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/web-cluster/src/runner/index.ts b/apps/web-cluster/src/runner/index.ts index d8c0e594c8..7f0a77ab14 100644 --- a/apps/web-cluster/src/runner/index.ts +++ b/apps/web-cluster/src/runner/index.ts @@ -61,13 +61,19 @@ const RpcsLive = RpcServer.layer(Workflows.RpcGroup).pipe( Effect.gen(function* () { const { authSecret } = yield* RpcAuthSecret; - return Workflows.SecretAuthMiddleware.of((options) => { - const authHeader = Headers.get(options.headers, "authorization"); - if (Option.isNone(authHeader) || authHeader.value !== authSecret) - return new Workflows.InvalidRpcAuth(); + return Workflows.SecretAuthMiddleware.of( + Effect.fn(function* (options) { + const authHeader = Headers.get(options.headers, "authorization"); + if (Option.isNone(authHeader) || authHeader.value !== authSecret) { + if (Option.isNone(authHeader)) + yield* Effect.log("No auth header provided"); - return options.next; - }); + return yield* new Workflows.InvalidRpcAuth(); + } + + return yield* options.next; + }), + ); }), ), ), From 30526276e2b2afa9eb22568fed482a55644e04dd Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 14 Oct 2025 01:00:39 +0800 Subject: [PATCH 21/25] remove some NEXT_PUBLIC envs + add s3 buffer --- .github/workflows/ci.yml | 4 - .github/workflows/docker-build-web.yml | 2 - .github/workflows/publish.yml | 2 - CLAUDE.md | 9 +- apps/web/Dockerfile | 2 - infra/sst.config.ts | 1 - packages/env/build.ts | 8 - packages/web-backend/package.json | 1 + packages/web-backend/src/S3Buckets/index.ts | 39 +- pnpm-lock.yaml | 972 +++++++++++++++++++- scripts/env-cli.js | 8 - 11 files changed, 965 insertions(+), 83 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 827c80e279..d53554a4da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,8 +115,6 @@ jobs: echo 'VITE_POSTHOG_KEY=${{ secrets.NEXT_PUBLIC_POSTHOG_KEY }}' >> .env echo 'VITE_POSTHOG_HOST=${{ secrets.NEXT_PUBLIC_POSTHOG_HOST }}' >> .env echo 'VITE_SERVER_URL=${{ secrets.NEXT_PUBLIC_WEB_URL }}' >> .env - echo "NEXT_PUBLIC_CAP_AWS_REGION=${{ secrets.NEXT_PUBLIC_CAP_AWS_REGION }}" >> .env - echo "NEXT_PUBLIC_CAP_AWS_BUCKET=${{ secrets.NEXT_PUBLIC_CAP_AWS_BUCKET }}" >> .env cat .env >> $GITHUB_ENV @@ -185,8 +183,6 @@ jobs: echo 'VITE_POSTHOG_KEY=${{ secrets.NEXT_PUBLIC_POSTHOG_KEY }}' >> .env echo 'VITE_POSTHOG_HOST=${{ secrets.NEXT_PUBLIC_POSTHOG_HOST }}' >> .env echo 'VITE_SERVER_URL=${{ secrets.NEXT_PUBLIC_WEB_URL }}' >> .env - echo "NEXT_PUBLIC_CAP_AWS_REGION=${{ secrets.NEXT_PUBLIC_CAP_AWS_REGION }}" >> .env - echo "NEXT_PUBLIC_CAP_AWS_BUCKET=${{ secrets.NEXT_PUBLIC_CAP_AWS_BUCKET }}" >> .env - name: Copy .env to apps/desktop run: cp .env apps/desktop/.env diff --git a/.github/workflows/docker-build-web.yml b/.github/workflows/docker-build-web.yml index af6a883dd2..a6bbbd1014 100644 --- a/.github/workflows/docker-build-web.yml +++ b/.github/workflows/docker-build-web.yml @@ -36,8 +36,6 @@ jobs: run: | echo "WEB_URL=http://localhost:3000" > .env echo "NEXT_PUBLIC_DOCKER_BUILD=true" >> .env - echo "NEXT_PUBLIC_CAP_AWS_BUCKET=capso" >> .env - echo "NEXT_PUBLIC_CAP_AWS_REGION=us-east-1" >> .env - name: Login to GitHub Container Registry uses: docker/login-action@v3 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d0e1222fad..770f552ded 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -185,8 +185,6 @@ jobs: echo 'VITE_POSTHOG_KEY=${{ secrets.VITE_POSTHOG_KEY }}' >> .env echo 'VITE_POSTHOG_HOST=${{ secrets.VITE_POSTHOG_HOST }}' >> .env echo 'VITE_SERVER_URL=${{ secrets.NEXT_PUBLIC_WEB_URL }}' >> .env - echo "NEXT_PUBLIC_CAP_AWS_REGION=${{ secrets.NEXT_PUBLIC_CAP_AWS_REGION }}" >> .env - echo "NEXT_PUBLIC_CAP_AWS_BUCKET=${{ secrets.NEXT_PUBLIC_CAP_AWS_BUCKET }}" >> .env echo 'RUST_TARGET_TRIPLE=${{ matrix.settings.target }}' >> .env - name: Build app diff --git a/CLAUDE.md b/CLAUDE.md index eb48022aaa..47d58dbf00 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -171,7 +171,7 @@ import { getCurrentUser } from "@cap/database/auth/session"; export async function updateVideo(data: FormData) { const user = await getCurrentUser(); if (!user?.id) throw new Error("Unauthorized"); - + // Database operations with Drizzle return await db().update(videos).set({ ... }).where(eq(videos.id, id)); } @@ -220,7 +220,6 @@ const updateMutation = useMutation({ ### Build/Client (selected) - `NEXT_PUBLIC_WEB_URL` -- `NEXT_PUBLIC_CAP_AWS_BUCKET`, `NEXT_PUBLIC_CAP_AWS_REGION` - `NEXT_PUBLIC_POSTHOG_KEY`, `NEXT_PUBLIC_POSTHOG_HOST` - `NEXT_PUBLIC_DOCKER_BUILD` (enables Next.js standalone output) @@ -268,7 +267,7 @@ const updateMutation = useMutation({ - **Connection errors**: Verify Docker containers are running - **Schema drift**: Run `pnpm --dir packages/database db:check` -### Desktop App Issues +### Desktop App Issues - **IPC binding errors**: Restart dev server to regenerate `tauri.ts` - **Rust compile errors**: Check Cargo.toml dependencies - **Permission issues**: macOS/Windows may require app permissions @@ -392,8 +391,8 @@ Minimize `useEffect` usage: compute during render, handle logic in event handler ### Media Processing Flow ``` -Desktop Recording → Local Files → Upload to S3 → -Background Processing (tasks service) → +Desktop Recording → Local Files → Upload to S3 → +Background Processing (tasks service) → Transcription/AI Enhancement → Database Storage ``` diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 634120f807..7250c97a41 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -12,8 +12,6 @@ RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store pnpm i --fro ARG NEXT_PUBLIC_DOCKER_BUILD=true ENV NEXT_PUBLIC_WEB_URL=http://localhost:3000 -ENV NEXT_PUBLIC_CAP_AWS_BUCKET=capso -ENV NEXT_PUBLIC_CAP_AWS_REGION=us-east-1 RUN pnpm run build:web diff --git a/infra/sst.config.ts b/infra/sst.config.ts index 3423bdcb95..13c1b0a1d6 100644 --- a/infra/sst.config.ts +++ b/infra/sst.config.ts @@ -51,7 +51,6 @@ export default $config({ { key: "NEXT_PUBLIC_AXIOM_TOKEN", value: AXIOM_API_TOKEN }, { key: "NEXT_PUBLIC_AXIOM_DATASET", value: AXIOM_DATASET }, { key: "CAP_AWS_BUCKET", value: recordingsBucket.bucket }, - { key: "NEXT_PUBLIC_CAP_AWS_BUCKET", value: recordingsBucket.bucket }, { key: "DATABASE_URL", value: secrets.DATABASE_URL_HTTP.value }, ]; diff --git a/packages/env/build.ts b/packages/env/build.ts index 04d0f79196..e3fc2eb63c 100644 --- a/packages/env/build.ts +++ b/packages/env/build.ts @@ -14,8 +14,6 @@ const create = () => NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), NEXT_PUBLIC_WEB_URL: z.string(), - NEXT_PUBLIC_CAP_AWS_BUCKET: z.string(), - NEXT_PUBLIC_CAP_AWS_REGION: z.string(), NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), @@ -28,15 +26,9 @@ const create = () => NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, NEXT_PUBLIC_WEB_URL: process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, - NEXT_PUBLIC_CAP_AWS_BUCKET: - process.env.CAP_AWS_BUCKET ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET, - NEXT_PUBLIC_CAP_AWS_REGION: - process.env.CAP_AWS_REGION ?? process.env.NEXT_PUBLIC_CAP_AWS_REGION, NEXT_PUBLIC_CAP_AWS_ENDPOINT: process.env.CAP_AWS_ENDPOINT ?? process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: - process.env.CAP_AWS_URL ?? process.env.NEXT_PUBLIC_CAP_AWS_BUCKET_URL, NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, }, }); diff --git a/packages/web-backend/package.json b/packages/web-backend/package.json index 2d54cba6e2..22b0d0ef47 100644 --- a/packages/web-backend/package.json +++ b/packages/web-backend/package.json @@ -13,6 +13,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.485.0", "@aws-sdk/cloudfront-signer": "^3.821.0", + "@aws-sdk/credential-providers": "^3.908.0", "@aws-sdk/s3-presigned-post": "^3.485.0", "@aws-sdk/s3-request-presigner": "^3.485.0", "@cap/database": "workspace:*", diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index ccb60f6957..2108239f07 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -1,5 +1,6 @@ import * as S3 from "@aws-sdk/client-s3"; import * as CloudFrontPresigner from "@aws-sdk/cloudfront-signer"; +import { fromInstanceMetadata, fromSSO } from "@aws-sdk/credential-providers"; import { decrypt } from "@cap/database/crypto"; import type { S3Bucket, User } from "@cap/web-domain"; import { awsCredentialsProvider } from "@vercel/functions/oidc"; @@ -24,24 +25,33 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Config.option, ), region: yield* Config.string("CAP_AWS_REGION"), - credentials: Option.getOrUndefined( - yield* Config.option( - Config.all([ - Config.string("CAP_AWS_ACCESS_KEY"), - Config.string("CAP_AWS_SECRET_KEY"), - ]).pipe( - Config.map(([accessKeyId, secretAccessKey]) => ({ - accessKeyId, - secretAccessKey, - })), - Config.orElse(() => - Config.string("VERCEL_AWS_ROLE_ARN").pipe( - Config.map((arn) => awsCredentialsProvider({ roleArn: arn })), - ), + credentials: yield* Config.option( + Config.all([ + Config.string("CAP_AWS_ACCESS_KEY"), + Config.string("CAP_AWS_SECRET_KEY"), + ]).pipe( + Config.map(([accessKeyId, secretAccessKey]) => ({ + accessKeyId, + secretAccessKey, + })), + Config.orElse(() => + Config.string("VERCEL_AWS_ROLE_ARN").pipe( + Config.map((arn) => awsCredentialsProvider({ roleArn: arn })), + ), + ), + ), + ).pipe( + Effect.flatMap( + Effect.catchTag("NoSuchElementException", () => + Effect.succeed( + process.env.NODE_ENV === "development" + ? fromSSO({ profile: process.env.AWS_DEFAULT_PROFILE }) + : fromInstanceMetadata(), ), ), ), ), + forcePathStyle: Option.getOrNull( yield* Config.boolean("S3_PATH_STYLE").pipe(Config.option), @@ -57,6 +67,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { region: defaultConfigs.region, credentials: defaultConfigs.credentials, forcePathStyle: defaultConfigs.forcePathStyle, + requestStreamBufferSize: 16 * 1024, }); const createBucketClient = async (bucket: S3Bucket.S3Bucket) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10a15597da..d7d43471b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,7 +112,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -199,7 +199,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -608,7 +608,7 @@ importers: version: 2.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@vercel/functions': specifier: ^3.1.0 - version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.908.0) '@vercel/otel': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api-logs@0.206.0)(@opentelemetry/api@1.9.0)(@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.206.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)) @@ -701,7 +701,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1011,7 +1011,7 @@ importers: version: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-email: specifier: ^4.0.16 version: 4.0.16(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1318,6 +1318,9 @@ importers: '@aws-sdk/cloudfront-signer': specifier: ^3.821.0 version: 3.821.0 + '@aws-sdk/credential-providers': + specifier: ^3.908.0 + version: 3.908.0 '@aws-sdk/s3-presigned-post': specifier: ^3.485.0 version: 3.804.0 @@ -1350,7 +1353,7 @@ importers: version: 4.3.1 '@vercel/functions': specifier: ^3.1.0 - version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0) + version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.908.0) drizzle-orm: specifier: 0.44.6 version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2) @@ -1441,6 +1444,10 @@ packages: resolution: {integrity: sha512-ssZX7+bEWPXjfmKRJTDzoP18Uyz8b0dCHLpvV1LDcd+vaJ9lRqIc45XgCfK40OwJm57TNFJcNpzADk/0kqvovw==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-cognito-identity@3.908.0': + resolution: {integrity: sha512-XEva6l07dtF+6QNzTZHB+PEOX03sdcOudh+XVa4UjlUPlqrl/LAk/MzRxbw6pHScG5DPMx6Iyeicm7pJBOTdYg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-mediaconvert@3.804.0': resolution: {integrity: sha512-xjgAXzcwm2dp2okjrJZPjTby8WunxJ+mUngSksLs7jLA+6pTpxWbYgRcBizDo5Zc2UxrXDWQSTnyCDFRckHjAA==} engines: {node: '>=18.0.0'} @@ -1453,6 +1460,10 @@ packages: resolution: {integrity: sha512-6D5iQbL0MqlJ7B5aaHdP21k9+3H/od0jHjHSXegvFd4h2KQbD+QVTdEOSLeakgBGgHYRfiQXsrdMMzUz8vcpsw==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.908.0': + resolution: {integrity: sha512-PseFMWvtac+Q+zaY9DMISE+2+glNh0ROJ1yR4gMzeafNHSwkdYu4qcgxLWIOnIodGydBv/tQ6nzHPzExXnUUgw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/cloudfront-signer@3.821.0': resolution: {integrity: sha512-5sDWEB23+eAzGklyjV1rYi4bSPWpG42N2+1WQhxF0491g5cElXwKN+eLgh/zT4Im3fq3Pum4Oj7P7SmMJLbATw==} engines: {node: '>=18.0.0'} @@ -1461,34 +1472,74 @@ packages: resolution: {integrity: sha512-KrYDEc6HaJE+Mx5lrwq6uhJxj1RYYfggQ+X+zQeKRyrZHl2GOxFl7PdnpdwtnaQIjX0gNkDzquhZSdyT0ar5rA==} engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.908.0': + resolution: {integrity: sha512-okl6FC2cQT1Oidvmnmvyp/IEvqENBagKO0ww4YV5UtBkf0VlhAymCWkZqhovtklsqgq0otag2VRPAgnrMt6nVQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.908.0': + resolution: {integrity: sha512-Lmb5GatPNDY5cODfwH3XGWpKZqg/lh7ghCn4Y9BTMi5W9Z/E2Jq5YF7yaLobOjOpx+lVoxS+EsVrtSm6p3ffuw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.804.0': resolution: {integrity: sha512-5mjrWPa4iaBK9/HDEIVN8lGxsnjk60eBjwGaJV0I2uqxnTo1EuQmpLV3XdY/OzQeqJdpuH/DbC6XUIdy9bXNQA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.908.0': + resolution: {integrity: sha512-FK2YuxoI5CxUflPOIMbVAwDbi6Xvu+2sXopXLmrHc2PfI39M3vmjEoQwYCP8WuQSRb+TbAP3xAkxHjFSBFR35w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.804.0': resolution: {integrity: sha512-TD84TXS/iDWcf+ggCq3n6yx36p1WXB2qgyHkbP/yVbdmix/vKU1twuB5qJvaY0PJWI0TOwBa9680XfsYrzaJAA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.908.0': + resolution: {integrity: sha512-eLbz0geVW9EykujQNnYfR35Of8MreI6pau5K6XDFDUSWO9GF8wqH7CQwbXpXHBlCTHtq4QSLxzorD8U5CROhUw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.804.0': resolution: {integrity: sha512-LfReL9TnOOunJWeZbDXPePFEnvJE+jcA7iY/ItsThUALgTy+ydLUdOiwzMZFo1f0JZN/Rfrsb9FOd/xTOoZiFw==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.908.0': + resolution: {integrity: sha512-7Cgnv5wabgFtsgr+Uc/76EfPNGyxmbG8aICn3g3D3iJlcO4uuOZI8a77i0afoDdchZrTC6TG6UusS/NAW6zEoQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.804.0': resolution: {integrity: sha512-L2EK5fy2+7El7j7TcRcuwr2lzU5tQfXsfscg+dtFkLPjOqShknnqV/lXylb3QlWx8B3K/c/KK5rcWQl6cYUiDQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.908.0': + resolution: {integrity: sha512-8OKbykpGw5bdfF/pLTf8YfUi1Kl8o1CTjBqWQTsLOkE3Ho3hsp1eQx8Cz4ttrpv0919kb+lox62DgmAOEmTr1w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.804.0': resolution: {integrity: sha512-s6ng/rZj7WP8GGgxBXsoPZYlSu7MZAm9O8OLgSSWcw8/vaYW7hBVSEVVNMEUkJiJeEo7Lh+Y/3d6SY27S1of/g==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.908.0': + resolution: {integrity: sha512-sWnbkGjDPBi6sODUzrAh5BCDpnPw0wpK8UC/hWI13Q8KGfyatAmCBfr+9OeO3+xBHa8N5AskMncr7C4qS846yQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.804.0': resolution: {integrity: sha512-9Tt5zmhiK2nBfJv52Is5gNtW6bhK0W20GRhckg4T+BlnxOkPy//2ui23DzYacrwETH6TE3kdoyL3xgEL++HSLg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.908.0': + resolution: {integrity: sha512-WV/aOzuS6ZZhrkPty6TJ3ZG24iS8NXP0m3GuTVuZ5tKi9Guss31/PJ1CrKPRCYGm15CsIjf+mrUxVnNYv9ap5g==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.804.0': resolution: {integrity: sha512-eBICjQUnqaoiHl9/AHKVPt/YkrifDddAUNGWUj+9cb3bRml6PEBSHE0k/tbbCTMq1xz7CCP+gmnnAA92ChnseA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.908.0': + resolution: {integrity: sha512-9xWrFn6nWlF5KlV4XYW+7E6F33S3wUUEGRZ/+pgDhkIZd527ycT2nPG2dZ3fWUZMlRmzijP20QIJDqEbbGWe1Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-providers@3.908.0': + resolution: {integrity: sha512-WuAttxDemeKyMAgNEwBdgz11/W8IOosDxAU9GOk8ZbNJI/Cp0SiCp5p9bu0hlroq2V4HxECIRIMNeJZLh7fIgg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.804.0': resolution: {integrity: sha512-vVphifJ5Ab2JUjB27UvdNV51ezxTn3f/jNbC/Y+KF1vNcYkwWXqo+U1gD8SUsDK+NhnD3wasfVBVLOdJa7qqKw==} engines: {node: '>=18.0.0'} @@ -1505,6 +1556,10 @@ packages: resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.901.0': + resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-location-constraint@3.804.0': resolution: {integrity: sha512-AMtKnllIWKgoo7hiJfphLYotEwTERfjVMO2+cKAncz9w1g+bnYhHxiVhJJoR94y047c06X4PU5MsTxvdQ73Znw==} engines: {node: '>=18.0.0'} @@ -1513,10 +1568,18 @@ packages: resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.901.0': + resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.804.0': resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.901.0': + resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-sdk-s3@3.804.0': resolution: {integrity: sha512-kiuqjV2ozoyI6w34+KMhZU+YVOLTPgh1Kp1DSpuS+tbkwkxnQCrPGziQhuSA5/Y0bUFaa2zLwUh2jpCmJQbLyA==} engines: {node: '>=18.0.0'} @@ -1529,14 +1592,26 @@ packages: resolution: {integrity: sha512-HoBaun4t3vAFhMj/I7L/HNBKBrAYu7Sb5bTFINx8kFCxPbqsvF+jOrEE8WiljHNy7FbPjz0mPVRUwO7RZSYNiQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.908.0': + resolution: {integrity: sha512-R0ePEOku72EvyJWy/D0Z5f/Ifpfxa0U9gySO3stpNhOox87XhsILpcIsCHPy0OHz1a7cMoZsF6rMKSzDeCnogQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.804.0': resolution: {integrity: sha512-IOUcw6stjqYBMhLoAXlLVipYpAqLlA17jcyI0OzpS0pTD1RvBqEBckYibF4HJeReI+IiEHu/m0If0SKVR5WyXQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.908.0': + resolution: {integrity: sha512-ZxDYrfxOKXNFHLyvJtT96TJ0p4brZOhwRE4csRXrezEVUN+pNgxuem95YvMALPVhlVqON2CTzr8BX+CcBKvX9Q==} + engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.804.0': resolution: {integrity: sha512-Qlr8jVUL5U8Ej+84ElUTGeOok6hQXcJdx5IOSRoqKs6bCKVa8TtwgX1zZIajzjMhMgMlR3/V+M8oDVDKPB43Ug==} engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.901.0': + resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} + engines: {node: '>=18.0.0'} + '@aws-sdk/s3-presigned-post@3.804.0': resolution: {integrity: sha512-j+f/XG+i127XSln0UHsBzoMoXNK9slMV+O+3zcrX8fTbLqVDD+aqnxzpb17+6DQeHsGvoiK2Vk+KQ29/FdLlSQ==} engines: {node: '>=18.0.0'} @@ -1553,10 +1628,18 @@ packages: resolution: {integrity: sha512-ndcLGD1nHEVJdWRl0lK8SfC0dN4j3X4gcGXEJxK16KZD23veMB2adHP69ySYXNFNo5gI6W9Ct9QXnB+tJCCS1Q==} engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.908.0': + resolution: {integrity: sha512-4SosHWRQ8hj1X2yDenCYHParcCjHcd7S+Mdb/lelwF0JBFCNC+dNCI9ws3cP/dFdZO/AIhJQGUBzEQtieloixw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.804.0': resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.901.0': + resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-arn-parser@3.804.0': resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} engines: {node: '>=18.0.0'} @@ -1565,6 +1648,10 @@ packages: resolution: {integrity: sha512-mT2R1De1fBT3vgm00ELVFoaArblW3PqGUCVteGGSUdJA525To7h6xPThrNrw3Dn8blAcR8VYGYte/JX7vKgFxw==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.901.0': + resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-format-url@3.804.0': resolution: {integrity: sha512-1nOwSg7B0bj5LFGor0udF/HSdvDuSCxP+NC0IuSOJ5RgJ2AphFo03pLtK2UwArHY5WWZaejAEz5VBND6xxOEhA==} engines: {node: '>=18.0.0'} @@ -1576,6 +1663,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.804.0': resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} + '@aws-sdk/util-user-agent-browser@3.907.0': + resolution: {integrity: sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==} + '@aws-sdk/util-user-agent-node@3.804.0': resolution: {integrity: sha512-TacXL50ZHOeTUvN9LbHjS3muvvJNpzZp9cAtGRKpKXzlu8zCxPHrVU7dGOF6ONuNG30GpN2xzz81/XcCtg+8/A==} engines: {node: '>=18.0.0'} @@ -1585,10 +1675,27 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.908.0': + resolution: {integrity: sha512-l6AEaKUAYarcEy8T8NZ+dNZ00VGLs3fW2Cqu1AuPENaSad0/ahEU+VU7MpXS8FhMRGPgplxKVgCTLyTY0Lbssw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/xml-builder@3.804.0': resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==} engines: {node: '>=18.0.0'} + '@aws-sdk/xml-builder@3.901.0': + resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -5749,6 +5856,10 @@ packages: resolution: {integrity: sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==} engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.0': + resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} + engines: {node: '>=18.0.0'} + '@smithy/chunked-blob-reader-native@4.0.0': resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} engines: {node: '>=18.0.0'} @@ -5761,6 +5872,14 @@ packages: resolution: {integrity: sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.3.0': + resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.15.0': + resolution: {integrity: sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==} + engines: {node: '>=18.0.0'} + '@smithy/core@3.3.1': resolution: {integrity: sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ==} engines: {node: '>=18.0.0'} @@ -5769,6 +5888,10 @@ packages: resolution: {integrity: sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.0': + resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@4.0.2': resolution: {integrity: sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==} engines: {node: '>=18.0.0'} @@ -5793,6 +5916,10 @@ packages: resolution: {integrity: sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==} engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.3.1': + resolution: {integrity: sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==} + engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.0.2': resolution: {integrity: sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==} engines: {node: '>=18.0.0'} @@ -5801,6 +5928,10 @@ packages: resolution: {integrity: sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==} engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.2.0': + resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} + engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.0.2': resolution: {integrity: sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==} engines: {node: '>=18.0.0'} @@ -5809,6 +5940,10 @@ packages: resolution: {integrity: sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==} engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.2.0': + resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} + engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -5817,6 +5952,10 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.0.2': resolution: {integrity: sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==} engines: {node: '>=18.0.0'} @@ -5825,42 +5964,82 @@ packages: resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.2.0': + resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.1.2': resolution: {integrity: sha512-EqOy3xaEGQpsKxLlzYstDRJ8eY90CbyBP4cl+w7r45mE60S8YliyL9AgWsdWcyNiB95E2PMqHBEv67nNl1zLfg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.3.1': + resolution: {integrity: sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.1.3': resolution: {integrity: sha512-AsJtI9KiFoEGAhcEKZyzzPfrszAQGcf4HSYKmenz0WGx/6YNvoPPv4OSGfZTCsDmgPHv4pXzxE+7QV7jcGWNKw==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.1': + resolution: {integrity: sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.0.3': resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.0': + resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.0.2': resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.0': + resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.0.2': resolution: {integrity: sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.0': + resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.0.4': resolution: {integrity: sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.3.0': + resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.0.2': resolution: {integrity: sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.0': + resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.1.0': resolution: {integrity: sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.0': + resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.0.2': resolution: {integrity: sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==} engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.0': + resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.0.2': resolution: {integrity: sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==} engines: {node: '>=18.0.0'} @@ -5869,26 +6048,50 @@ packages: resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.0': + resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.0.3': resolution: {integrity: sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q==} engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.0': + resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} + engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.0.2': resolution: {integrity: sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.3.0': + resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.1.0': resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.0': + resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.2.2': resolution: {integrity: sha512-3AnHfsMdq9Wg7+3BeR1HuLWI9+DMA/SoHVpCWq6xSsa52ikNd6nlF/wFzdpHyGtVa+Aji6lMgvwOF4sGcVA7SA==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.7.1': + resolution: {integrity: sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.3.1': resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} + '@smithy/types@4.6.0': + resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.0.2': resolution: {integrity: sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==} engines: {node: '>=18.0.0'} @@ -5897,18 +6100,34 @@ packages: resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.0': + resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.0.0': resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.0.0': resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.0.0': resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} @@ -5917,42 +6136,82 @@ packages: resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.0.0': resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.0.10': resolution: {integrity: sha512-2k6fgUNOZ1Rn0gEjvGPGrDEINLG8qSBHsN7xlkkbO+fnHJ36BQPDzhFfMmYSDS8AgzoygqQiDOQ+6Hp2vBTUdA==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.0': + resolution: {integrity: sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.0.10': resolution: {integrity: sha512-2XR1WRglLVmoIFts7bODUTgBdVyvkfKNkydHrlsI5VxW9q3s1hnJCuY+f1OHzvj5ue23q4vydM2fjrMjf2HSdQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.1': + resolution: {integrity: sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.0.2': resolution: {integrity: sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.2.0': + resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.0.0': resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.0.2': resolution: {integrity: sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.0': + resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.0.3': resolution: {integrity: sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.0': + resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.2.0': resolution: {integrity: sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.0': + resolution: {integrity: sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.0.0': resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} @@ -5961,10 +6220,18 @@ packages: resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.0.3': resolution: {integrity: sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==} engines: {node: '>=18.0.0'} + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -9465,6 +9732,10 @@ packages: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -13291,6 +13562,9 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + style-to-js@1.1.16: resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} @@ -14863,6 +15137,50 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-cognito-identity@3.908.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-node': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-mediaconvert@3.804.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -14999,7 +15317,7 @@ snapshots: '@smithy/protocol-http': 5.1.0 '@smithy/smithy-client': 4.2.2 '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.2 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 @@ -15013,6 +15331,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sso@3.908.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/cloudfront-signer@3.821.0': dependencies: '@smithy/url-parser': 4.0.4 @@ -15032,6 +15393,32 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 + '@aws-sdk/core@3.908.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.908.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-env@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15040,6 +15427,14 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15053,6 +15448,19 @@ snapshots: '@smithy/util-stream': 4.2.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-ini@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15071,6 +15479,24 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-env': 3.908.0 + '@aws-sdk/credential-provider-http': 3.908.0 + '@aws-sdk/credential-provider-process': 3.908.0 + '@aws-sdk/credential-provider-sso': 3.908.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.804.0': dependencies: '@aws-sdk/credential-provider-env': 3.804.0 @@ -15088,6 +15514,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.908.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.908.0 + '@aws-sdk/credential-provider-http': 3.908.0 + '@aws-sdk/credential-provider-ini': 3.908.0 + '@aws-sdk/credential-provider-process': 3.908.0 + '@aws-sdk/credential-provider-sso': 3.908.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15097,6 +15540,15 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-process@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-sso@3.804.0': dependencies: '@aws-sdk/client-sso': 3.804.0 @@ -15110,6 +15562,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.908.0': + dependencies: + '@aws-sdk/client-sso': 3.908.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/token-providers': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15121,6 +15586,42 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-providers@3.908.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.908.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-cognito-identity': 3.908.0 + '@aws-sdk/credential-provider-env': 3.908.0 + '@aws-sdk/credential-provider-http': 3.908.0 + '@aws-sdk/credential-provider-ini': 3.908.0 + '@aws-sdk/credential-provider-node': 3.908.0 + '@aws-sdk/credential-provider-process': 3.908.0 + '@aws-sdk/credential-provider-sso': 3.908.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/middleware-bucket-endpoint@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -15161,6 +15662,13 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -15173,6 +15681,12 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -15180,6 +15694,14 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 @@ -15213,6 +15735,16 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.804.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -15242,7 +15774,7 @@ snapshots: '@smithy/protocol-http': 5.1.0 '@smithy/smithy-client': 4.2.2 '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.2 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 @@ -15256,6 +15788,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.908.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -15265,6 +15840,15 @@ snapshots: '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/s3-presigned-post@3.804.0': dependencies: '@aws-sdk/client-s3': 3.804.0 @@ -15310,11 +15894,28 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.804.0': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/types@3.901.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/util-arn-parser@3.804.0': dependencies: tslib: 2.8.1 @@ -15326,6 +15927,14 @@ snapshots: '@smithy/util-endpoints': 3.0.2 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + tslib: 2.8.1 + '@aws-sdk/util-format-url@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 @@ -15344,6 +15953,13 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-browser@3.907.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + bowser: 2.11.0 + tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.804.0': dependencies: '@aws-sdk/middleware-user-agent': 3.804.0 @@ -15352,11 +15968,27 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.908.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@aws-sdk/xml-builder@3.804.0': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@aws-sdk/xml-builder@3.901.0': + dependencies: + '@smithy/types': 4.6.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.0.1': {} + '@babel/code-frame@7.12.11': dependencies: '@babel/highlight': 7.25.9 @@ -19497,6 +20129,11 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/abort-controller@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/chunked-blob-reader-native@4.0.0': dependencies: '@smithy/util-base64': 4.0.0 @@ -19514,6 +20151,27 @@ snapshots: '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 + '@smithy/config-resolver@4.3.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + + '@smithy/core@3.15.0': + dependencies: + '@smithy/middleware-serde': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + '@smithy/core@3.3.1': dependencies: '@smithy/middleware-serde': 4.0.3 @@ -19533,6 +20191,14 @@ snapshots: '@smithy/url-parser': 4.0.2 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.2.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + tslib: 2.8.1 + '@smithy/eventstream-codec@4.0.2': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -19571,6 +20237,14 @@ snapshots: '@smithy/util-base64': 4.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.3.1': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + '@smithy/hash-blob-browser@4.0.2': dependencies: '@smithy/chunked-blob-reader': 5.0.0 @@ -19585,6 +20259,13 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/hash-node@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/hash-stream-node@4.0.2': dependencies: '@smithy/types': 4.3.1 @@ -19596,6 +20277,11 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/invalid-dependency@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 @@ -19604,6 +20290,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/md5-js@4.0.2': dependencies: '@smithy/types': 4.3.1 @@ -19616,6 +20306,12 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/middleware-content-length@4.2.0': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/middleware-endpoint@4.1.2': dependencies: '@smithy/core': 3.3.1 @@ -19627,6 +20323,17 @@ snapshots: '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.3.1': + dependencies: + '@smithy/core': 3.15.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + '@smithy/middleware-retry@4.1.3': dependencies: '@smithy/node-config-provider': 4.0.2 @@ -19639,16 +20346,39 @@ snapshots: tslib: 2.8.1 uuid: 9.0.1 + '@smithy/middleware-retry@4.4.1': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + '@smithy/middleware-serde@4.0.3': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/middleware-serde@4.2.0': + dependencies: + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/middleware-stack@4.0.2': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/middleware-stack@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/node-config-provider@4.0.2': dependencies: '@smithy/property-provider': 4.0.2 @@ -19656,6 +20386,13 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/node-config-provider@4.3.0': + dependencies: + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/node-http-handler@4.0.4': dependencies: '@smithy/abort-controller': 4.0.2 @@ -19664,22 +20401,46 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/node-http-handler@4.3.0': + dependencies: + '@smithy/abort-controller': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/property-provider@4.0.2': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/property-provider@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/protocol-http@5.1.0': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/protocol-http@5.3.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/querystring-builder@4.0.2': dependencies: '@smithy/types': 4.3.1 '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + '@smithy/querystring-parser@4.0.2': dependencies: '@smithy/types': 4.3.1 @@ -19690,15 +20451,29 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/querystring-parser@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/service-error-classification@4.0.3': dependencies: '@smithy/types': 4.3.1 + '@smithy/service-error-classification@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + '@smithy/shared-ini-file-loader@4.0.2': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.3.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/signature-v4@5.1.0': dependencies: '@smithy/is-array-buffer': 4.0.0 @@ -19710,6 +20485,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.3.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/smithy-client@4.2.2': dependencies: '@smithy/core': 3.3.1 @@ -19720,10 +20506,24 @@ snapshots: '@smithy/util-stream': 4.2.0 tslib: 2.8.1 + '@smithy/smithy-client@4.7.1': + dependencies: + '@smithy/core': 3.15.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-stack': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 + '@smithy/types@4.6.0': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@4.0.2': dependencies: '@smithy/querystring-parser': 4.0.2 @@ -19736,20 +20536,40 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/url-parser@4.2.0': + dependencies: + '@smithy/querystring-parser': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-base64@4.0.0': dependencies: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/util-body-length-browser@4.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-body-length-node@4.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 @@ -19760,10 +20580,19 @@ snapshots: '@smithy/is-array-buffer': 4.0.0 tslib: 2.8.1 + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + '@smithy/util-config-provider@4.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.0.10': dependencies: '@smithy/property-provider': 4.0.2 @@ -19772,6 +20601,13 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.3.0': + dependencies: + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.0.10': dependencies: '@smithy/config-resolver': 4.1.0 @@ -19782,27 +20618,58 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.2.1': + dependencies: + '@smithy/config-resolver': 4.3.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-endpoints@3.0.2': dependencies: '@smithy/node-config-provider': 4.0.2 '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/util-endpoints@3.2.0': + dependencies: + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-middleware@4.0.2': dependencies: '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/util-middleware@4.2.0': + dependencies: + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-retry@4.0.3': dependencies: '@smithy/service-error-classification': 4.0.3 '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/util-retry@4.2.0': + dependencies: + '@smithy/service-error-classification': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + '@smithy/util-stream@4.2.0': dependencies: '@smithy/fetch-http-handler': 5.0.2 @@ -19814,10 +20681,25 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/util-stream@4.5.0': + dependencies: + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@4.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 @@ -19828,12 +20710,21 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + '@smithy/util-waiter@4.0.3': dependencies: '@smithy/abort-controller': 4.0.2 '@smithy/types': 4.3.1 tslib: 2.8.1 + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + '@socket.io/component-emitter@3.1.2': {} '@solid-primitives/bounds@0.0.122(solid-js@1.9.6)': @@ -20001,11 +20892,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -20016,7 +20907,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -21280,11 +22171,11 @@ snapshots: '@vercel/edge@1.2.1': {} - '@vercel/functions@3.1.0(@aws-sdk/credential-provider-web-identity@3.804.0)': + '@vercel/functions@3.1.0(@aws-sdk/credential-provider-web-identity@3.908.0)': dependencies: '@vercel/oidc': 3.0.0 optionalDependencies: - '@aws-sdk/credential-provider-web-identity': 3.804.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 '@vercel/nft@0.27.7(encoding@0.1.13)(rollup@4.40.2)': dependencies: @@ -21359,7 +22250,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -21370,18 +22261,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -23477,8 +24368,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.6.1)) @@ -23506,33 +24397,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 9.30.1(jiti@2.6.1) + eslint: 8.57.1 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@5.5.0) - eslint: 8.57.1 + eslint: 9.30.1(jiti@2.6.1) get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -23558,14 +24449,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -23627,7 +24518,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23638,7 +24529,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -24204,6 +25095,10 @@ snapshots: dependencies: strnum: 1.1.2 + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -26644,7 +27539,7 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 - next-auth@4.24.11(next@15.5.4(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 @@ -26719,7 +27614,7 @@ snapshots: cors: 2.8.5 next: 15.5.4(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -26773,7 +27668,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.43)(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -28184,13 +29079,14 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-beta.43)(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: + rolldown: 1.0.0-beta.43 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -28956,6 +29852,8 @@ snapshots: strnum@1.1.2: {} + strnum@2.1.1: {} + style-to-js@1.1.16: dependencies: style-to-object: 1.0.8 @@ -29981,7 +30879,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -30003,7 +30901,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-beta.43)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 diff --git a/scripts/env-cli.js b/scripts/env-cli.js index d48146a2ef..0c79021640 100644 --- a/scripts/env-cli.js +++ b/scripts/env-cli.js @@ -128,12 +128,6 @@ async function main() { defaultValue: allEnvs.CAP_AWS_BUCKET, placeholder: allEnvs.CAP_AWS_BUCKET, }), - CAP_AWS_REGION: () => - text({ - message: "CAP_AWS_REGION", - defaultValue: allEnvs.NEXT_PUBLIC_CAP_AWS_REGION, - placeholder: allEnvs.NEXT_PUBLIC_CAP_AWS_REGION, - }), CAP_AWS_ENDPOINT: () => text({ message: "CAP_AWS_ENDPOINT", @@ -160,8 +154,6 @@ async function main() { } envs.NEXT_PUBLIC_WEB_URL = envs.WEB_URL; - envs.NEXT_PUBLIC_CAP_AWS_BUCKET = envs.CAP_AWS_BUCKET; - envs.NEXT_PUBLIC_CAP_AWS_REGION = envs.CAP_AWS_REGION; } if (hasDesktop) { From 0c9d8db8f3d8ce9e36622bf5917ac34492b3b87c Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 14 Oct 2025 02:58:48 +0800 Subject: [PATCH 22/25] fix ECS credentials --- packages/web-backend/src/S3Buckets/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web-backend/src/S3Buckets/index.ts b/packages/web-backend/src/S3Buckets/index.ts index 2108239f07..0ba4f99c76 100644 --- a/packages/web-backend/src/S3Buckets/index.ts +++ b/packages/web-backend/src/S3Buckets/index.ts @@ -1,6 +1,6 @@ import * as S3 from "@aws-sdk/client-s3"; import * as CloudFrontPresigner from "@aws-sdk/cloudfront-signer"; -import { fromInstanceMetadata, fromSSO } from "@aws-sdk/credential-providers"; +import { fromContainerMetadata, fromSSO } from "@aws-sdk/credential-providers"; import { decrypt } from "@cap/database/crypto"; import type { S3Bucket, User } from "@cap/web-domain"; import { awsCredentialsProvider } from "@vercel/functions/oidc"; @@ -46,7 +46,7 @@ export class S3Buckets extends Effect.Service()("S3Buckets", { Effect.succeed( process.env.NODE_ENV === "development" ? fromSSO({ profile: process.env.AWS_DEFAULT_PROFILE }) - : fromInstanceMetadata(), + : fromContainerMetadata(), ), ), ), From 7ebeb56f0012bd140bdea7ad736d7926a37c02ac Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 14 Oct 2025 03:00:34 +0800 Subject: [PATCH 23/25] formatting --- infra/sst-env.d.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/infra/sst-env.d.ts b/infra/sst-env.d.ts index a570b0cfe2..ba2fdf30c1 100644 --- a/infra/sst-env.d.ts +++ b/infra/sst-env.d.ts @@ -4,14 +4,13 @@ /* deno-fmt-ignore-file */ declare module "sst" { - export interface Resource { - "DATABASE_URL": { - "type": "sst.sst.Secret" - "value": string - } - } + export interface Resource { + DATABASE_URL: { + type: "sst.sst.Secret"; + value: string; + }; + } } /// -import "sst" -export {} \ No newline at end of file +import "sst"; From 4edf3010fd84b0a9abc8bc5926977bdcec9fdbe3 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 14 Oct 2025 17:59:39 +0800 Subject: [PATCH 24/25] restrict loom import to team --- packages/web-backend/src/Loom/Http.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web-backend/src/Loom/Http.ts b/packages/web-backend/src/Loom/Http.ts index d702761a8d..3c29f782d8 100644 --- a/packages/web-backend/src/Loom/Http.ts +++ b/packages/web-backend/src/Loom/Http.ts @@ -1,4 +1,4 @@ -import { CurrentUser, Http, Policy, Video } from "@cap/web-domain"; +import { CurrentUser, Http, Policy } from "@cap/web-domain"; import { HttpApiBuilder } from "@effect/platform"; import { Effect } from "effect"; @@ -17,6 +17,8 @@ export const LoomHttpLive = HttpApiBuilder.group( return handlers.handle("importVideo", ({ payload }) => Effect.gen(function* () { const user = yield* CurrentUser; + if (!user.email.endsWith("@cap.so")) + return yield* Effect.die("Internal access only"); const result = yield* workflows .LoomImportVideo({ From 21f5b0fbbc8fa04f2ee70d55ac222f490c5309fa Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Tue, 14 Oct 2025 18:06:24 +0800 Subject: [PATCH 25/25] remove unused env --- packages/env/build.ts | 5 ----- scripts/env-cli.js | 6 ------ 2 files changed, 11 deletions(-) diff --git a/packages/env/build.ts b/packages/env/build.ts index e3fc2eb63c..a46bfb2788 100644 --- a/packages/env/build.ts +++ b/packages/env/build.ts @@ -14,8 +14,6 @@ const create = () => NEXT_PUBLIC_META_PIXEL_ID: z.string().optional(), NEXT_PUBLIC_GOOGLE_AW_ID: z.string().optional(), NEXT_PUBLIC_WEB_URL: z.string(), - NEXT_PUBLIC_CAP_AWS_ENDPOINT: z.string().optional(), - NEXT_PUBLIC_CAP_AWS_BUCKET_URL: z.string().optional(), NEXT_PUBLIC_DOCKER_BUILD: z.string().optional(), }, runtimeEnv: { @@ -26,9 +24,6 @@ const create = () => NEXT_PUBLIC_GOOGLE_AW_ID: process.env.NEXT_PUBLIC_GOOGLE_AW_ID, NEXT_PUBLIC_WEB_URL: process.env.WEB_URL ?? process.env.NEXT_PUBLIC_WEB_URL, - NEXT_PUBLIC_CAP_AWS_ENDPOINT: - process.env.CAP_AWS_ENDPOINT ?? - process.env.NEXT_PUBLIC_CAP_AWS_ENDPOINT, NEXT_PUBLIC_DOCKER_BUILD: process.env.NEXT_PUBLIC_DOCKER_BUILD, }, }); diff --git a/scripts/env-cli.js b/scripts/env-cli.js index 0c79021640..a4b7328606 100644 --- a/scripts/env-cli.js +++ b/scripts/env-cli.js @@ -128,12 +128,6 @@ async function main() { defaultValue: allEnvs.CAP_AWS_BUCKET, placeholder: allEnvs.CAP_AWS_BUCKET, }), - CAP_AWS_ENDPOINT: () => - text({ - message: "CAP_AWS_ENDPOINT", - defaultValue: allEnvs.NEXT_PUBLIC_CAP_AWS_ENDPOINT, - placeholder: allEnvs.NEXT_PUBLIC_CAP_AWS_ENDPOINT, - }), CAP_AWS_BUCKET_URL: () => text({ message: "CAP_AWS_BUCKET_URL" }), CAP_CLOUDFRONT_DISTRIBUTION_ID: () => text({ message: "CAP_CLOUDFRONT_DISTRIBUTION_ID" }),