From 6e73298731f8fe7d03bbf5c46fef4d7e2c60cab2 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Sat, 14 Jun 2025 09:43:06 +0700 Subject: [PATCH 01/18] feat: queue task for trial --- .gitignore | 3 +- .../[wsId]/calendar/active-sync.tsx | 9 + apps/web/src/app/api/hello-world/route.ts | 16 + bun.lock | 280 +++++++++++++++--- package.json | 3 + packages/trigger/example.ts | 16 + packages/trigger/package.json | 21 ++ packages/types/src/supabase.ts | 172 +++++------ trigger.config.ts | 22 ++ turbo.json | 3 +- 10 files changed, 420 insertions(+), 125 deletions(-) create mode 100644 apps/web/src/app/api/hello-world/route.ts create mode 100644 packages/trigger/example.ts create mode 100644 packages/trigger/package.json create mode 100644 trigger.config.ts diff --git a/.gitignore b/.gitignore index 2741f07754..2ca3823be8 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ yarn-error.log* # Typescript *.tsbuildinfo -next-env.d.ts \ No newline at end of file +next-env.d.ts +.trigger \ No newline at end of file diff --git a/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx b/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx index a627c27ce6..794e4b8edc 100644 --- a/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx +++ b/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx @@ -1,5 +1,7 @@ 'use client'; +import { tasks } from '@trigger.dev/sdk/v3'; +import { helloWorldTask } from '@tuturuuu/trigger'; import { Button } from '@tuturuuu/ui/button'; import { useCalendarSync } from '@tuturuuu/ui/hooks/use-calendar-sync'; import { Progress } from '@tuturuuu/ui/progress'; @@ -54,6 +56,12 @@ const InnerComponent = () => { } }; + const triggerHelloWorld = async () => { + const res = await fetch('/api/hello-world'); + const data = await res.json(); + console.log(data); + }; + return (
@@ -85,6 +93,7 @@ const InnerComponent = () => { > Switch to month +
{/* Add sync progress bar when syncing */} diff --git a/apps/web/src/app/api/hello-world/route.ts b/apps/web/src/app/api/hello-world/route.ts new file mode 100644 index 0000000000..34998da144 --- /dev/null +++ b/apps/web/src/app/api/hello-world/route.ts @@ -0,0 +1,16 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import { tasks } from '@trigger.dev/sdk/v3'; +import type { helloWorldTask } from '@tuturuuu/trigger/example'; +import { NextResponse } from 'next/server'; + +//tasks.trigger also works with the edge runtime +//export const runtime = "edge"; + +export async function GET() { + const handle = await tasks.trigger( + 'hello-world', + 'James' + ); + + return NextResponse.json(handle); +} diff --git a/bun.lock b/bun.lock index 9d1ea43b9f..87c59017aa 100644 --- a/bun.lock +++ b/bun.lock @@ -4,16 +4,19 @@ "": { "name": "tutur3u", "dependencies": { + "@trigger.dev/sdk": "^3.3.17", "cookies-next": "^6.0.0", "react-scan": "^0.3.4", }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.28.0", + "@trigger.dev/build": "^3.3.17", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@tuturuuu/eslint-config": "workspace:*", "@tuturuuu/typescript-config": "workspace:*", "@vitest/coverage-v8": "^3.2.3", + "concurrently": "^9.1.2", "eslint": "^9.28.0", "prettier": "^3.5.3", "prettier-eslint": "^16.4.2", @@ -642,6 +645,13 @@ "@types/react": "^19.1.7", }, }, + "packages/trigger": { + "name": "@tuturuuu/trigger", + "version": "0.1.0", + "dependencies": { + "@trigger.dev/sdk": "^3.0.0", + }, + }, "packages/types": { "name": "@tuturuuu/types", "version": "0.1.5", @@ -1016,6 +1026,8 @@ "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], + "@electric-sql/client": ["@electric-sql/client@1.0.0-beta.1", "", { "optionalDependencies": { "@rollup/rollup-darwin-arm64": "^4.18.1" } }, "sha512-Ei9jN3pDoGzc+a/bGqnB5ajb52IvSv7/n2btuyzUlcOHIR2kM9fqtYTJXPwZYKLkGZlHWlpHgWyRtrinkP2nHg=="], + "@emnapi/core": ["@emnapi/core@1.3.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog=="], "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], @@ -1132,8 +1144,14 @@ "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.1", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg=="], + "@google-cloud/precise-date": ["@google-cloud/precise-date@4.0.0", "", {}, "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA=="], + "@google/generative-ai": ["@google/generative-ai@0.24.1", "", {}, "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q=="], + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + "@hookform/resolvers": ["@hookform/resolvers@5.1.1", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], @@ -1212,6 +1230,10 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@jsonhero/path": ["@jsonhero/path@1.0.21", "", {}, "sha512-gVUDj/92acpVoJwsVJ/RuWOaHyG4oFzn898WNGQItLCTQ+hOaVlEaImhwE1WqOTf+l3dGOUkbSiVKlb3q1hd1Q=="], + "@mantine/hooks": ["@mantine/hooks@8.1.0", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-Ycg8g11zRFfG0ZOp3lIogZh8O1Y5+Jiteu1Ja0BeIeTPVLLXufUhhgyorNr7F4QTD18xKzB1nX8wZzKFD6czPQ=="], "@mermaid-js/parser": ["@mermaid-js/parser@0.4.0", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA=="], @@ -1304,6 +1326,48 @@ "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + + "@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/sdk-logs": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.52.1", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-transformer": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.52.1", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "lodash.merge": "^4.6.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", "@opentelemetry/exporter-trace-otlp-http": "0.52.1", "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", "@opentelemetry/exporter-zipkin": "1.25.1", "@opentelemetry/instrumentation": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.25.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.25.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/propagator-b3": "1.25.1", "@opentelemetry/propagator-jaeger": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], + "@pivanov/utils": ["@pivanov/utils@0.0.2", "", { "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-q9CN0bFWxWgMY5hVVYyBgez1jGiLBa6I+LkG37ycylPhFvEGOOeaADGtUSu46CaZasPnlY8fCdVJZmrgKb1EPA=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], @@ -1316,6 +1380,26 @@ "@preact/signals-core": ["@preact/signals-core@1.8.0", "", {}, "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], @@ -1792,6 +1876,12 @@ "@tldraw/validate": ["@tldraw/validate@3.13.1", "", { "dependencies": { "@tldraw/utils": "3.13.1" } }, "sha512-jBwVs4Ts216ylZbkTN3+mw98E2FhgxDmRMX/sj8y+iO8gOEzR8HKJJXqK4lStMbMbEjBnjqily8MtAB7xbMJvg=="], + "@trigger.dev/build": ["@trigger.dev/build@3.3.17", "", { "dependencies": { "@trigger.dev/core": "3.3.17", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", "tsconfck": "3.1.3" } }, "sha512-dfreMuVeLAcZypS3kkUA9nWNviiuOPIQ3ldy2ywPCmwmbHyd0BE8tI5D3A4kmVq/f53TdRMls4c+cYafxlwubQ=="], + + "@trigger.dev/core": ["@trigger.dev/core@3.3.17", "", { "dependencies": { "@electric-sql/client": "1.0.0-beta.1", "@google-cloud/precise-date": "^4.0.0", "@jsonhero/path": "^1.0.21", "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/exporter-logs-otlp-http": "0.52.1", "@opentelemetry/exporter-trace-otlp-http": "0.52.1", "@opentelemetry/instrumentation": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-node": "0.52.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", "dequal": "^2.0.3", "eventsource": "^3.0.5", "eventsource-parser": "^3.0.0", "execa": "^8.0.1", "humanize-duration": "^3.27.3", "jose": "^5.4.0", "nanoid": "^3.3.4", "socket.io-client": "4.7.5", "superjson": "^2.2.1", "zod": "3.23.8", "zod-error": "1.5.0", "zod-validation-error": "^1.5.0" } }, "sha512-KjnRxCuHq4R+MnE0zPvIQ7EIz4QSpJL+1Yn74n2cCGjyHYgQ/g8rcARn0Nxf2s8jzE38CnyRufjUrwG8k+DJrw=="], + + "@trigger.dev/sdk": ["@trigger.dev/sdk@3.3.17", "", { "dependencies": { "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", "@trigger.dev/core": "3.3.17", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", "evt": "^2.4.13", "slug": "^6.0.0", "terminal-link": "^3.0.0", "ulid": "^2.3.0", "uncrypto": "^0.1.3", "uuid": "^9.0.0", "ws": "^8.11.0" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-wjIjlQWKybYWw/J7LxFIOO1pXzxXoj9lxbFMvjb51JtfebxnQnh6aExN47nOGhVhV38wHYstfBI/8ClWwBnFYw=="], + "@trivago/prettier-plugin-sort-imports": ["@trivago/prettier-plugin-sort-imports@5.2.2", "", { "dependencies": { "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "javascript-natural-sort": "^0.7.1", "lodash": "^4.17.21" }, "peerDependencies": { "@vue/compiler-sfc": "3.x", "prettier": "2.x - 3.x", "prettier-plugin-svelte": "3.x", "svelte": "4.x || 5.x" }, "optionalPeers": ["@vue/compiler-sfc", "prettier-plugin-svelte", "svelte"] }, "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA=="], "@tuturuuu/ai": ["@tuturuuu/ai@workspace:packages/ai"], @@ -1818,6 +1908,8 @@ "@tuturuuu/transactional": ["@tuturuuu/transactional@workspace:packages/transactional"], + "@tuturuuu/trigger": ["@tuturuuu/trigger@workspace:packages/trigger"], + "@tuturuuu/types": ["@tuturuuu/types@workspace:packages/types"], "@tuturuuu/typescript-config": ["@tuturuuu/typescript-config@workspace:packages/typescript-config"], @@ -1972,6 +2064,8 @@ "@types/react-syntax-highlighter": ["@types/react-syntax-highlighter@15.5.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA=="], + "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -2070,6 +2164,8 @@ "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], @@ -2082,6 +2178,8 @@ "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + "ansi-escapes": ["ansi-escapes@5.0.0", "", { "dependencies": { "type-fest": "^1.0.2" } }, "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -2224,6 +2322,8 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], @@ -2234,6 +2334,8 @@ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], @@ -2258,7 +2360,9 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "confbox": ["confbox@0.2.1", "", {}, "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg=="], + "concurrently": ["concurrently@9.1.2", "", { "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ=="], + + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], @@ -2266,6 +2370,8 @@ "cookies-next": ["cookies-next@6.0.0", "", { "dependencies": { "cookie": "^1.0.1" }, "peerDependencies": { "next": ">=15.0.0", "react": ">= 16.8.0" } }, "sha512-Xq87TPIe7faqluf7gr3mobzO2JRe65oX+pnv4nrnDE/ak49Ic6QhNZSLCk+E5xOKtpVm1EoEazu0iBNyr5TXTA=="], + "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], + "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], "core-js": ["core-js@3.42.0", "", {}, "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g=="], @@ -2484,6 +2590,8 @@ "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], + "engine.io-client": ["engine.io-client@6.5.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.0.0" } }, "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ=="], + "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], @@ -2566,6 +2674,14 @@ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.2", "", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], + + "evt": ["evt@2.5.9", "", { "dependencies": { "minimal-polyfills": "^2.2.3", "run-exclusive": "^2.2.19", "tsafe": "^1.8.5" } }, "sha512-GpjX476FSlttEGWHT8BdVMoI8wGXQGbEOtKcP4E+kggg+yJzXBZN2n4x7TS/zPBJ1DZqWI+rguZZApjjzQ0HpA=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], @@ -2648,6 +2764,8 @@ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "get-east-asian-width": ["get-east-asian-width@1.3.0", "", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -2656,6 +2774,8 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], @@ -2760,6 +2880,10 @@ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "humanize-duration": ["humanize-duration@3.33.0", "", {}, "sha512-vYJX7BSzn7EQ4SaP2lPYVy+icHDppB6k7myNeI3wrSRfwMS5+BHyGgzpHR0ptqJ2AQ6UuIKrclSg5ve6Ci4IAQ=="], + "hyphen": ["hyphen@1.10.6", "", {}, "sha512-fXHXcGFTXOvZTSkPJuGOQf5Lv5T/R2itiiCVPg9LxAje5D00O0pP83yJShFq5V89Ly//Gt6acj7z8pbBr34stw=="], "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], @@ -2774,6 +2898,8 @@ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "import-in-the-middle": ["import-in-the-middle@1.14.2", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], @@ -2874,6 +3000,8 @@ "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -2996,6 +3124,8 @@ "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + "lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="], "lodash.isequal": ["lodash.isequal@4.5.0", "", {}, "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="], @@ -3014,6 +3144,8 @@ "loglevel-colored-level-prefix": ["loglevel-colored-level-prefix@1.0.0", "", { "dependencies": { "chalk": "^1.1.3", "loglevel": "^1.4.1" } }, "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA=="], + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -3092,6 +3224,8 @@ "merge-refs": ["merge-refs@1.3.0", "", { "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "mermaid": ["mermaid@11.6.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", "@mermaid-js/parser": "^0.4.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", "dompurify": "^3.2.4", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^15.0.7", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg=="], @@ -3162,10 +3296,14 @@ "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "minimal-polyfills": ["minimal-polyfills@2.2.3", "", {}, "sha512-oxdmJ9cL+xV72h0xYxp4tP2d5/fTBpP45H8DIOn9pASuF8a3IYTf+25fMGDYGiWW+MFsuog6KD6nfmhZJQ+uUw=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -3180,6 +3318,8 @@ "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + "moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="], "motion-dom": ["motion-dom@12.16.0", "", { "dependencies": { "motion-utils": "^12.12.1" } }, "sha512-Z2nGwWrrdH4egLEtgYMCEN4V2qQt1qxlKy/uV7w691ztyA41Q5Rbn0KNGbsNVDZr9E8PD2IOQ3hSccRnB6xWzw=="], @@ -3232,6 +3372,8 @@ "npm-normalize-package-bin": ["npm-normalize-package-bin@4.0.0", "", {}, "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w=="], + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], "nwsapi": ["nwsapi@2.2.19", "", {}, "sha512-94bcyI3RsqiZufXjkr3ltkI86iEl+I7uiHVDtcq9wJUTwYQJ5odHDeSzkkrRzi80jJ8MaeZgqKjH1bAWAFw9bA=="], @@ -3256,7 +3398,7 @@ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], "opener": ["opener@1.5.2", "", { "bin": { "opener": "bin/opener-bin.js" } }, "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="], @@ -3324,7 +3466,7 @@ "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], - "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], "playwright": ["playwright@1.52.0", "", { "dependencies": { "playwright-core": "1.52.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw=="], @@ -3406,6 +3548,8 @@ "prosemirror-view": ["prosemirror-view@1.39.3", "", { "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-bY/7kg0LzRE7ytR0zRdSMWX3sknEjw68l836ffLPMh0OG3OYnNuBDUSF3v0vjvnzgYjgY9ZH/RypbARURlcMFA=="], + "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], @@ -3514,8 +3658,12 @@ "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], + "require-relative": ["require-relative@0.8.7", "", {}, "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg=="], "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], @@ -3548,10 +3696,14 @@ "rtl-css-js": ["rtl-css-js@1.16.1", "", { "dependencies": { "@babel/runtime": "^7.1.2" } }, "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg=="], + "run-exclusive": ["run-exclusive@2.2.19", "", { "dependencies": { "minimal-polyfills": "^2.2.3" } }, "sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], @@ -3588,6 +3740,10 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], @@ -3614,10 +3770,14 @@ "slick": ["slick@1.12.2", "", {}, "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A=="], + "slug": ["slug@6.1.0", "", {}, "sha512-x6vLHCMasg4DR2LPiyFGI0gJJhywY6DTiGhCrOMzb3SOk/0JVLIaL4UhyFSHu04SD3uAavrKY/K3zZ3i6iRcgA=="], + "socket.io": ["socket.io@4.8.1", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg=="], "socket.io-adapter": ["socket.io-adapter@2.5.5", "", { "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg=="], + "socket.io-client": ["socket.io-client@4.7.5", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ=="], + "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], "sonner": ["sonner@2.0.5", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ=="], @@ -3646,7 +3806,7 @@ "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -3672,6 +3832,8 @@ "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], @@ -3688,7 +3850,11 @@ "supabase": ["supabase@2.24.3", "", { "dependencies": { "bin-links": "^5.0.0", "https-proxy-agent": "^7.0.2", "node-fetch": "^3.3.2", "tar": "7.4.3" }, "bin": { "supabase": "bin/supabase" } }, "sha512-mh9pi4C5pM159GyYE+Rv9qL8kg1kqzimQ4FBr6UH/WhzB/VcDaA+vpn/VeRC3CGVKr+d89Ra5MjDWg+/UoPpXg=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="], + + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "supports-hyperlinks": ["supports-hyperlinks@2.3.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -3714,6 +3880,8 @@ "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + "terminal-link": ["terminal-link@3.0.0", "", { "dependencies": { "ansi-escapes": "^5.0.0", "supports-hyperlinks": "^2.2.0" } }, "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg=="], + "test-exclude": ["test-exclude@7.0.1", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^9.0.4" } }, "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg=="], "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], @@ -3736,7 +3904,7 @@ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], "tinypool": ["tinypool@1.1.0", "", {}, "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ=="], @@ -3764,6 +3932,8 @@ "tr46": ["tr46@5.1.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw=="], + "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], @@ -3774,6 +3944,10 @@ "ts-easing": ["ts-easing@0.2.0", "", {}, "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="], + "tsafe": ["tsafe@1.8.5", "", {}, "sha512-LFWTWQrW6rwSY+IBNFl2ridGfUzVsPwrZ26T4KUJww/py8rzaQ/SY+MIz6YROozpUCaRcuISqagmlwub9YT9kw=="], + + "tsconfck": ["tsconfck@3.1.3", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ=="], + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -3816,8 +3990,12 @@ "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="], + "ulid": ["ulid@2.4.0", "", { "bin": { "ulid": "bin/cli.js" } }, "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + "undici": ["undici@6.21.2", "", {}, "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g=="], "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], @@ -3950,7 +4128,7 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -3958,7 +4136,7 @@ "write-file-atomic": ["write-file-atomic@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ=="], - "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], "xlsx": ["xlsx@vendor/xlsx-0.20.3.tgz", { "bin": { "xlsx": "./bin/xlsx.njs" } }], @@ -3966,12 +4144,20 @@ "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], + "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.0.0", "", {}, "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="], + "xtend": ["xtend@2.1.2", "", { "dependencies": { "object-keys": "~0.4.0" } }, "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], @@ -3980,8 +4166,12 @@ "zod": ["zod@3.25.57", "", {}, "sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA=="], + "zod-error": ["zod-error@1.5.0", "", { "dependencies": { "zod": "^3.20.2" } }, "sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], + "zod-validation-error": ["zod-validation-error@1.5.0", "", { "peerDependencies": { "zod": "^3.18.0" } }, "sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw=="], + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "@ai-sdk/deepgram/@ai-sdk/provider": ["@ai-sdk/provider@1.1.2", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-ITdgNilJZwLKR7X5TnUr1BsQW6UTX5yFp0h66Nfx8XjBYkWD9W3yugr50GOz3CnE9m/U/Cd5OyEbTMI0rgi6ZQ=="], @@ -4016,8 +4206,6 @@ "@deepgram/sdk/@types/node": ["@types/node@18.19.83", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-D69JeR5SfFS5H6FLbUaS0vE4r1dGhmMBbG4Ed6BNS4wkDK8GZjsdCShT5LCN59vOHEUHnFCY9J4aclXlIphMkA=="], - "@deepgram/sdk/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], - "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], "@emotion/babel-plugin/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], @@ -4034,6 +4222,8 @@ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], "@octokit/app/@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@13.0.0", "", { "dependencies": { "@octokit/types": "^14.0.0" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-nPXM3wgil9ONnAINcm8cN+nwso4QhNB13PtnlRFkYFHCUIogcH9DHak/StQYcwkkjuc7pUluLG1AWZNscgvH7Q=="], @@ -4052,8 +4242,6 @@ "@supabase/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "@supabase/realtime-js/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], - "@tailwindcss/node/lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], @@ -4080,9 +4268,13 @@ "@tldraw/editor/@tiptap/react": ["@tiptap/react@2.12.0", "", { "dependencies": { "@tiptap/extension-bubble-menu": "^2.12.0", "@tiptap/extension-floating-menu": "^2.12.0", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", "use-sync-external-store": "^1" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-D+PR+4kJO9h8AB/7XyQ/Anw8tqeS2ecv5QemBOCHi9JlMAjytauUrj6IfFBO9RbsCowlBjW5GnSpFhzpk2Gghg=="], - "@tldraw/sync/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "@trigger.dev/core/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + + "@trigger.dev/sdk/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - "@tldraw/sync-core/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "@trigger.dev/sdk/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "@trigger.dev/sdk/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@types/cors/@types/node": ["@types/node@22.13.13", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ=="], @@ -4116,8 +4308,12 @@ "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + "ansi-escapes/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "cmdk/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], "cmdk/@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="], @@ -4152,6 +4348,10 @@ "engine.io/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + "engine.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + + "engine.io-client/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "eslint-config-next/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.33.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/type-utils": "8.33.1", "@typescript-eslint/utils": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.33.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A=="], @@ -4176,6 +4376,8 @@ "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "gaxios/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -4208,6 +4410,10 @@ "is-bun-module/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jsdom/ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], + "jsondiffpatch/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], @@ -4216,6 +4422,8 @@ "linebreak/base64-js": ["base64-js@0.0.8", "", {}, "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="], + "local-pkg/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "loglevel-colored-level-prefix/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -4232,18 +4440,20 @@ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "next-intl/@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.5.10", "", { "dependencies": { "tslib": "2" } }, "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q=="], "node-abi/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + "ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + "ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "ora/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "path-scurry/lru-cache": ["lru-cache@11.1.0", "", {}, "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="], @@ -4282,6 +4492,10 @@ "refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="], + "require-in-the-middle/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "rimraf/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "rollup/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], @@ -4296,18 +4510,20 @@ "socket.io-adapter/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], + "socket.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "socket.io-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], "stacktrace-gps/source-map": ["source-map@0.5.6", "", {}, "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA=="], - "string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], - - "string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "stringify-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "swr/use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], @@ -4338,14 +4554,14 @@ "vite/postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + "vite/tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "vite-compatible-readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "vite-node/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "vitest/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "vitest/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], - "vue-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], @@ -4364,14 +4580,6 @@ "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - - "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], - - "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "xtend/object-keys": ["object-keys@0.4.0", "", {}, "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="], "@aws-crypto/crc32/@aws-sdk/types/@smithy/types": ["@smithy/types@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg=="], @@ -4390,6 +4598,8 @@ "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "@supabase/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "@supabase/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], @@ -4536,6 +4746,8 @@ "hastscript/property-information/xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "local-pkg/pkg-types/confbox": ["confbox@0.2.1", "", {}, "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg=="], + "loglevel-colored-level-prefix/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], "loglevel-colored-level-prefix/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], @@ -4556,10 +4768,10 @@ "mdast-util-mdx-jsx/parse-entities/is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - "ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], + "ora/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], + "ora/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "prettier-eslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], @@ -4618,8 +4830,6 @@ "rimraf/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - "tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "test-exclude/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], @@ -4698,10 +4908,6 @@ "web-resource-inliner/htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], diff --git a/package.json b/package.json index 226276c125..da41c83431 100644 --- a/package.json +++ b/package.json @@ -54,16 +54,19 @@ "update-all": "(cd apps && for dir in */; do echo \"Updating apps/$dir...\" && cd \"$dir\" && bun update && cd ..; done) && (cd packages && for dir in */; do echo \"Updating packages/$dir...\" && cd \"$dir\" && bun update && cd ..; done)" }, "dependencies": { + "@trigger.dev/sdk": "^3.3.17", "cookies-next": "^6.0.0", "react-scan": "^0.3.4" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.28.0", + "@trigger.dev/build": "^3.3.17", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@tuturuuu/eslint-config": "workspace:*", "@tuturuuu/typescript-config": "workspace:*", "@vitest/coverage-v8": "^3.2.3", + "concurrently": "^9.1.2", "eslint": "^9.28.0", "prettier": "^3.5.3", "prettier-eslint": "^16.4.2", diff --git a/packages/trigger/example.ts b/packages/trigger/example.ts new file mode 100644 index 0000000000..9ef3d529f3 --- /dev/null +++ b/packages/trigger/example.ts @@ -0,0 +1,16 @@ +import { logger, task, wait } from "@trigger.dev/sdk/v3"; + +export const helloWorldTask = task({ + id: "hello-world", + // Set an optional maxDuration to prevent tasks from running indefinitely + maxDuration: 300, // Stop executing after 300 secs (5 mins) of compute + run: async (payload: any, { ctx }) => { + logger.log("Hello, world!", { payload, ctx }); + + await wait.for({ seconds: 5 }); + + return { + message: "Hello, world!", + } + }, +}); \ No newline at end of file diff --git a/packages/trigger/package.json b/packages/trigger/package.json new file mode 100644 index 0000000000..68d336c5ab --- /dev/null +++ b/packages/trigger/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tuturuuu/trigger", + "version": "0.1.0", + "private": true, + "type": "module", + "main": "./example.ts", + "types": "./example.ts", + "exports": { + ".": { + "types": "./example.ts", + "import": "./example.ts" + }, + "./example": { + "types": "./example.ts", + "import": "./example.ts" + } + }, + "dependencies": { + "@trigger.dev/sdk": "^3.0.0" + } +} diff --git a/packages/types/src/supabase.ts b/packages/types/src/supabase.ts index e3bd3228a4..43d446ed39 100644 --- a/packages/types/src/supabase.ts +++ b/packages/types/src/supabase.ts @@ -7333,32 +7333,32 @@ export type Database = { }; count_search_users: { Args: + | { search_query: string } | { - enabled_filter?: boolean; - role_filter?: string; search_query: string; - } - | { search_query: string }; + role_filter?: string; + enabled_filter?: boolean; + }; Returns: number; }; create_ai_chat: { - Args: { model: string; message: string; title: string }; + Args: { title: string; message: string; model: string }; Returns: string; }; generate_cross_app_token: { Args: | { - p_expiry_seconds?: number; p_user_id: string; p_origin_app: string; - p_session_data?: Json; p_target_app: string; + p_expiry_seconds?: number; } | { p_user_id: string; - p_expiry_seconds?: number; - p_target_app: string; p_origin_app: string; + p_target_app: string; + p_expiry_seconds?: number; + p_session_data?: Json; }; Returns: string; }; @@ -7370,19 +7370,19 @@ export type Database = { }[]; }; get_daily_income_expense: { - Args: { past_days?: number; _ws_id: string }; + Args: { _ws_id: string; past_days?: number }; Returns: { - total_income: number; day: string; + total_income: number; total_expense: number; }[]; }; get_daily_prompt_completion_tokens: { Args: { past_days?: number }; Returns: { - total_completion_tokens: number; - total_prompt_tokens: number; day: string; + total_prompt_tokens: number; + total_completion_tokens: number; }[]; }; get_finance_invoices_count: { @@ -7408,9 +7408,9 @@ export type Database = { get_hourly_prompt_completion_tokens: { Args: { past_hours?: number }; Returns: { - total_completion_tokens: number; - total_prompt_tokens: number; hour: string; + total_prompt_tokens: number; + total_completion_tokens: number; }[]; }; get_inventory_batches_count: { @@ -7429,16 +7429,16 @@ export type Database = { _has_unit?: boolean; }; Returns: { - name: string; id: string; - created_at: string; - ws_id: string; - amount: number; - price: number; - category: string; - unit_id: string; - unit: string; + name: string; manufacturer: string; + unit: string; + unit_id: string; + category: string; + price: number; + amount: number; + ws_id: string; + created_at: string; }[]; }; get_inventory_products_count: { @@ -7460,17 +7460,17 @@ export type Database = { get_monthly_income_expense: { Args: { _ws_id: string; past_months?: number }; Returns: { - total_expense: number; month: string; total_income: number; + total_expense: number; }[]; }; get_monthly_prompt_completion_tokens: { Args: { past_months?: number }; Returns: { - total_completion_tokens: number; - total_prompt_tokens: number; month: string; + total_prompt_tokens: number; + total_completion_tokens: number; }[]; }; get_pending_event_participants: { @@ -7478,12 +7478,12 @@ export type Database = { Returns: number; }; get_possible_excluded_groups: { - Args: { included_groups: string[]; _ws_id: string }; + Args: { _ws_id: string; included_groups: string[] }; Returns: { id: string; - amount: number; - ws_id: string; name: string; + ws_id: string; + amount: number; }[]; }; get_possible_excluded_tags: { @@ -7498,54 +7498,54 @@ export type Database = { get_session_statistics: { Args: Record; Returns: { + total_count: number; + unique_users_count: number; active_count: number; completed_count: number; latest_session_date: string; - unique_users_count: number; - total_count: number; }[]; }; get_session_templates: { Args: { - limit_count?: number; workspace_id: string; user_id_param: string; + limit_count?: number; }; Returns: { - usage_count: number; - task_name: string; - category_color: string; - category_name: string; - category_id: string; - description: string; title: string; + description: string; + category_id: string; + task_id: string; tags: string[]; + category_name: string; + category_color: string; + task_name: string; + usage_count: number; avg_duration: number; last_used: string; - task_id: string; }[]; }; get_submission_statistics: { Args: Record; Returns: { - unique_users_count: number; total_count: number; latest_submission_date: string; + unique_users_count: number; }[]; }; get_transaction_categories_with_amount: { Args: Record; Returns: { id: string; - amount: number; - created_at: string; - ws_id: string; - is_expense: boolean; name: string; + is_expense: boolean; + ws_id: string; + created_at: string; + amount: number; }[]; }; get_user_role: { - Args: { ws_id: string; user_id: string }; + Args: { user_id: string; ws_id: string }; Returns: string; }; get_user_session_stats: { @@ -7559,21 +7559,21 @@ export type Database = { get_user_sessions: { Args: { user_id: string }; Returns: { - ip: string; - user_agent: string; - updated_at: string; - created_at: string; session_id: string; + created_at: string; + updated_at: string; + user_agent: string; + ip: string; is_current: boolean; }[]; }; get_user_tasks: { Args: { _board_id: string }; Returns: { - priority: number; id: string; name: string; description: string; + priority: number; completed: boolean; start_date: string; end_date: string; @@ -7599,10 +7599,10 @@ export type Database = { }; get_workspace_user_groups: { Args: { - search_query: string; - excluded_tags: string[]; - included_tags: string[]; _ws_id: string; + included_tags: string[]; + excluded_tags: string[]; + search_query: string; }; Returns: { id: string; @@ -7620,12 +7620,17 @@ export type Database = { }; get_workspace_users: { Args: { - included_groups: string[]; _ws_id: string; - search_query: string; + included_groups: string[]; excluded_groups: string[]; + search_query: string; }; Returns: { + id: string; + avatar_url: string; + full_name: string; + display_name: string; + email: string; phone: string; gender: string; birthday: string; @@ -7634,18 +7639,13 @@ export type Database = { address: string; national_id: string; note: string; + balance: number; ws_id: string; - display_name: string; - email: string; - created_at: string; - linked_users: Json; - group_count: number; groups: string[]; - balance: number; + group_count: number; + linked_users: Json; + created_at: string; updated_at: string; - full_name: string; - avatar_url: string; - id: string; }[]; }; get_workspace_users_count: { @@ -7657,15 +7657,15 @@ export type Database = { Returns: number; }; get_workspace_wallets_expense: { - Args: { start_date?: string; ws_id: string; end_date?: string }; + Args: { ws_id: string; start_date?: string; end_date?: string }; Returns: number; }; get_workspace_wallets_income: { - Args: { end_date?: string; ws_id: string; start_date?: string }; + Args: { ws_id: string; start_date?: string; end_date?: string }; Returns: number; }; has_other_owner: { - Args: { _user_id: string; _ws_id: string }; + Args: { _ws_id: string; _user_id: string }; Returns: boolean; }; insert_ai_chat_message: { @@ -7689,15 +7689,15 @@ export type Database = { Returns: boolean; }; is_nova_user_email_in_team: { - Args: { _team_id: string; _user_email: string }; + Args: { _user_email: string; _team_id: string }; Returns: boolean; }; is_nova_user_id_in_team: { - Args: { _team_id: string; _user_id: string }; + Args: { _user_id: string; _team_id: string }; Returns: boolean; }; is_org_member: { - Args: { _org_id: string; _user_id: string }; + Args: { _user_id: string; _org_id: string }; Returns: boolean; }; is_project_member: { @@ -7709,7 +7709,7 @@ export type Database = { Returns: boolean; }; is_task_board_member: { - Args: { _board_id: string; _user_id: string }; + Args: { _user_id: string; _board_id: string }; Returns: boolean; }; is_user_task_in_board: { @@ -7721,7 +7721,7 @@ export type Database = { Returns: Json; }; nova_get_challenge_with_user_stats: { - Args: { user_id: string; challenge_id: string }; + Args: { challenge_id: string; user_id: string }; Returns: Json; }; nova_get_user_daily_sessions: { @@ -7729,7 +7729,7 @@ export type Database = { Returns: number; }; nova_get_user_total_sessions: { - Args: { user_id: string; challenge_id: string }; + Args: { challenge_id: string; user_id: string }; Returns: number; }; revoke_all_cross_app_tokens: { @@ -7746,20 +7746,20 @@ export type Database = { }; search_users: { Args: + | { search_query: string; page_number: number; page_size: number } | { - role_filter?: string; - enabled_filter?: boolean; search_query: string; page_number: number; page_size: number; - } - | { search_query: string; page_number: number; page_size: number }; + role_filter?: string; + enabled_filter?: boolean; + }; Returns: { - handle: string; id: string; display_name: string; deleted: boolean; avatar_url: string; + handle: string; bio: string; created_at: string; user_id: string; @@ -7775,16 +7775,16 @@ export type Database = { }; search_users_by_name: { Args: { - result_limit?: number; search_query: string; + result_limit?: number; min_similarity?: number; }; Returns: { + id: string; + handle: string; + display_name: string; avatar_url: string; relevance: number; - display_name: string; - handle: string; - id: string; }[]; }; sum_quiz_scores: { @@ -7798,7 +7798,7 @@ export type Database = { Returns: boolean; }; transactions_have_same_amount: { - Args: { transaction_id_2: string; transaction_id_1: string }; + Args: { transaction_id_1: string; transaction_id_2: string }; Returns: boolean; }; update_expired_sessions: { @@ -7806,7 +7806,7 @@ export type Database = { Returns: undefined; }; update_session_total_score: { - Args: { user_id_param: string; challenge_id_param: string }; + Args: { challenge_id_param: string; user_id_param: string }; Returns: undefined; }; validate_cross_app_token: { @@ -7814,10 +7814,10 @@ export type Database = { Returns: string; }; validate_cross_app_token_with_session: { - Args: { p_target_app: string; p_token: string }; + Args: { p_token: string; p_target_app: string }; Returns: { - session_data: Json; user_id: string; + session_data: Json; }[]; }; }; diff --git a/trigger.config.ts b/trigger.config.ts new file mode 100644 index 0000000000..0366f9036d --- /dev/null +++ b/trigger.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "proj_uoblreqcnhwrarddxrds", + runtime: "node", + logLevel: "log", + // The max compute seconds a task is allowed to run. If the task run exceeds this duration, it will be stopped. + // You can override this on an individual task. + // See https://trigger.dev/docs/runs/max-duration + maxDuration: 3600, + retries: { + enabledInDev: true, + default: { + maxAttempts: 3, + minTimeoutInMs: 1000, + maxTimeoutInMs: 10000, + factor: 2, + randomize: true, + }, + }, + dirs: ["apps/web/trigger"], +}); diff --git a/turbo.json b/turbo.json index 11373c34bb..e03c4d8a9d 100644 --- a/turbo.json +++ b/turbo.json @@ -32,7 +32,8 @@ "BASE_URL", "API_URL", "ANALYZE", - "NODE_ENV" + "NODE_ENV", + "TRIGGER_SECRET_KEY" ], "tasks": { "build": { From cb0172030d55b666506569654c26a3c20fd39fac Mon Sep 17 00:00:00 2001 From: DennieDan <110723295+DennieDan@users.noreply.github.com> Date: Sat, 14 Jun 2025 02:45:47 +0000 Subject: [PATCH 02/18] style: apply prettier formatting --- packages/trigger/example.ts | 12 ++++++------ trigger.config.ts | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/trigger/example.ts b/packages/trigger/example.ts index 9ef3d529f3..f3ea92ae10 100644 --- a/packages/trigger/example.ts +++ b/packages/trigger/example.ts @@ -1,16 +1,16 @@ -import { logger, task, wait } from "@trigger.dev/sdk/v3"; +import { logger, task, wait } from '@trigger.dev/sdk/v3'; export const helloWorldTask = task({ - id: "hello-world", + id: 'hello-world', // Set an optional maxDuration to prevent tasks from running indefinitely maxDuration: 300, // Stop executing after 300 secs (5 mins) of compute run: async (payload: any, { ctx }) => { - logger.log("Hello, world!", { payload, ctx }); + logger.log('Hello, world!', { payload, ctx }); await wait.for({ seconds: 5 }); return { - message: "Hello, world!", - } + message: 'Hello, world!', + }; }, -}); \ No newline at end of file +}); diff --git a/trigger.config.ts b/trigger.config.ts index 0366f9036d..b39bcb4896 100644 --- a/trigger.config.ts +++ b/trigger.config.ts @@ -1,9 +1,9 @@ -import { defineConfig } from "@trigger.dev/sdk/v3"; +import { defineConfig } from '@trigger.dev/sdk/v3'; export default defineConfig({ - project: "proj_uoblreqcnhwrarddxrds", - runtime: "node", - logLevel: "log", + project: 'proj_uoblreqcnhwrarddxrds', + runtime: 'node', + logLevel: 'log', // The max compute seconds a task is allowed to run. If the task run exceeds this duration, it will be stopped. // You can override this on an individual task. // See https://trigger.dev/docs/runs/max-duration @@ -18,5 +18,5 @@ export default defineConfig({ randomize: true, }, }, - dirs: ["apps/web/trigger"], + dirs: ['apps/web/trigger'], }); From 64b3b5e8a28576038a4c3128fc9b074d41f306a4 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Sun, 15 Jun 2025 16:22:52 +0800 Subject: [PATCH 03/18] fix: remove unused code --- .../app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx b/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx index 794e4b8edc..2852324bca 100644 --- a/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx +++ b/apps/web/src/app/[locale]/(dashboard)/[wsId]/calendar/active-sync.tsx @@ -1,7 +1,5 @@ 'use client'; -import { tasks } from '@trigger.dev/sdk/v3'; -import { helloWorldTask } from '@tuturuuu/trigger'; import { Button } from '@tuturuuu/ui/button'; import { useCalendarSync } from '@tuturuuu/ui/hooks/use-calendar-sync'; import { Progress } from '@tuturuuu/ui/progress'; From 5ebbe464097d84f0391ceb3fac1609fef5e796aa Mon Sep 17 00:00:00 2001 From: DennieDan Date: Sun, 15 Jun 2025 21:16:07 +0800 Subject: [PATCH 04/18] fix: connect local dev to server for running queued tasks --- trigger.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trigger.config.ts b/trigger.config.ts index b39bcb4896..a2619fe943 100644 --- a/trigger.config.ts +++ b/trigger.config.ts @@ -18,5 +18,5 @@ export default defineConfig({ randomize: true, }, }, - dirs: ['apps/web/trigger'], + dirs: ['packages/trigger'], }); From 639f12971c8238b51c902bce54c4f44b1a608e32 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Sun, 15 Jun 2025 22:08:28 +0800 Subject: [PATCH 05/18] feat: create scheduled background task --- packages/trigger/first-scheduled-task.ts | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 packages/trigger/first-scheduled-task.ts diff --git a/packages/trigger/first-scheduled-task.ts b/packages/trigger/first-scheduled-task.ts new file mode 100644 index 0000000000..f3464ad345 --- /dev/null +++ b/packages/trigger/first-scheduled-task.ts @@ -0,0 +1,35 @@ +import { schedules } from '@trigger.dev/sdk/v3'; + +export const firstScheduledTask = schedules.task({ + id: 'first-scheduled-task', + cron: { + // every 1 minute + pattern: '*/1 * * * *', + }, + run: async (payload) => { + //when the task was scheduled to run + //note this will be slightly different from new Date() because it takes a few ms to run the task + console.log(payload.timestamp); //is a Date object + + //when the task was last run + //this can be undefined if it's never been run + console.log(payload.lastTimestamp); //is a Date object or undefined + + //the timezone the schedule was registered with, defaults to "UTC" + //this is in IANA format, e.g. "America/New_York" + //See the full list here: https://cloud.trigger.dev/timezones + console.log(payload.timezone); //is a string + + //the schedule id (you can have many schedules for the same task) + //using this you can remove the schedule, update it, etc + console.log(payload.scheduleId); //is a string + + //you can optionally provide an external id when creating the schedule + //usually you would set this to a userId or some other unique identifier + //this can be undefined if you didn't provide one + console.log(payload.externalId); //is a string or undefined + + //the next 5 dates this task is scheduled to run + console.log(payload.upcoming); //is an array of Date objects + }, +}); From f9f37551e5b77844a50d81dfbd9d8d1053a1afe2 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Mon, 16 Jun 2025 09:45:27 +0800 Subject: [PATCH 06/18] feat: define google fetching function --- .../google-calendar-background-sync.ts | 148 ++++++++++++++++++ turbo.json | 5 +- 2 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 packages/trigger/google-calendar-background-sync.ts diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts new file mode 100644 index 0000000000..fba2f5358a --- /dev/null +++ b/packages/trigger/google-calendar-background-sync.ts @@ -0,0 +1,148 @@ +import { schedules } from '@trigger.dev/sdk/v3'; +import { createClient } from '@tuturuuu/supabase/next/client'; +import { OAuth2Client } from 'google-auth-library'; +import { google } from 'googleapis'; + +// Initialize Supabase client +const supabase = createClient(); + +export const googleCalendarBackgroundSync = schedules.task({ + id: 'google-calendar-background-sync', + cron: { + // every 10 minutes + pattern: '*/10 * * * *', + }, + run: async () => { + const events = await fetchGoogleCalendarEvents(); + console.log('Fetched events from all linked Google accounts:', events); + }, +}); + +const fetchGoogleCalendarEvents = async () => { + try { + // Fetch all Google Calendar auth tokens from the database + const { data: authTokens, error: tokensError } = await supabase + .from('calendar_auth_tokens') + .select('*'); + + if (tokensError) { + console.error('Error fetching auth tokens:', tokensError); + return []; + } + + if (!authTokens || authTokens.length === 0) { + console.log('No Google Calendar auth tokens found in database'); + return []; + } + + const allEvents: any[] = []; + + // Fetch events from each linked Google account + for (const token of authTokens) { + try { + const events = await fetchEventsFromGoogleAccount(token); + allEvents.push(...events); + } catch (error) { + console.error( + `Error fetching events for user ${token.user_id}:`, + error + ); + // Continue with other accounts even if one fails + } + } + + return allEvents; + } catch (error) { + console.error('Error in fetchGoogleCalendarEvents:', error); + return []; + } +}; + +const fetchEventsFromGoogleAccount = async (authToken: { + user_id: string; + ws_id: string; + access_token: string; + refresh_token: string; +}) => { + try { + // Create Google OAuth2 client + const oauth2Client = new OAuth2Client({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + redirectUri: process.env.GOOGLE_REDIRECT_URI, + }); + + oauth2Client.setCredentials({ + access_token: authToken.access_token, + refresh_token: authToken.refresh_token, + }); + + // Create Google Calendar client + const calendar = google.calendar({ version: 'v3', auth: oauth2Client }); + + // Set time range for fetching events (e.g., next 30 days) + const timeMin = new Date(); + const timeMax = new Date(); + timeMax.setDate(timeMax.getDate() + 30); + + // Fetch events from Google Calendar + const response = await calendar.events.list({ + calendarId: 'primary', + timeMin: timeMin.toISOString(), + timeMax: timeMax.toISOString(), + singleEvents: true, + orderBy: 'startTime', + maxResults: 100, + }); + + const events = response.data.items || []; + + // Format events and add metadata about the source account + return events.map((event) => ({ + google_event_id: event.id, + title: event.summary || 'Untitled Event', + description: event.description || '', + start_at: event.start?.dateTime || event.start?.date || '', + end_at: event.end?.dateTime || event.end?.date || '', + location: event.location || '', + color: getColorFromGoogleColorId(event.colorId ?? undefined), + ws_id: authToken.ws_id, + user_id: authToken.user_id, + locked: false, + source: 'google_calendar', + })); + } catch (error: any) { + console.error( + `Error fetching events for user ${authToken.user_id}:`, + error + ); + + // If token is invalid, you might want to handle token refresh here + if (error.response?.data?.error === 'invalid_grant') { + console.log( + `Token expired for user ${authToken.user_id}, needs re-authentication` + ); + } + + throw error; + } +}; + +const getColorFromGoogleColorId = (colorId?: string): string => { + // Google Calendar color mapping + const colorMap: { [key: string]: string } = { + '1': '#7986cb', // Lavender + '2': '#33b679', // Sage + '3': '#8f24aa', // Grape + '4': '#e67c73', // Flamingo + '5': '#f6c026', // Banana + '6': '#f4511e', // Tangerine + '7': '#039be5', // Peacock + '8': '#616161', // Graphite + '9': '#3f51b5', // Blueberry + '10': '#0b8043', // Basil + '11': '#d60000', // Tomato + }; + + return colorMap[colorId || ''] || '#039be5'; // Default to peacock blue +}; diff --git a/turbo.json b/turbo.json index e03c4d8a9d..8ea44892c3 100644 --- a/turbo.json +++ b/turbo.json @@ -33,7 +33,10 @@ "API_URL", "ANALYZE", "NODE_ENV", - "TRIGGER_SECRET_KEY" + "TRIGGER_SECRET_KEY", + "GOOGLE_CLIENT_ID", + "GOOGLE_CLIENT_SECRET", + "GOOGLE_REDIRECT_URI" ], "tasks": { "build": { From 42bca59743167be0f64e55bf0acff97b4d5a85b0 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Mon, 16 Jun 2025 14:36:15 +0800 Subject: [PATCH 07/18] feat: add background sync from google to tuturuuu --- .../google-calendar-background-sync.ts | 240 +++++++++--------- 1 file changed, 121 insertions(+), 119 deletions(-) diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts index fba2f5358a..1afa21e48e 100644 --- a/packages/trigger/google-calendar-background-sync.ts +++ b/packages/trigger/google-calendar-background-sync.ts @@ -1,148 +1,150 @@ +import { createClient } from '@supabase/supabase-js'; import { schedules } from '@trigger.dev/sdk/v3'; -import { createClient } from '@tuturuuu/supabase/next/client'; import { OAuth2Client } from 'google-auth-library'; import { google } from 'googleapis'; -// Initialize Supabase client -const supabase = createClient(); - export const googleCalendarBackgroundSync = schedules.task({ id: 'google-calendar-background-sync', cron: { - // every 10 minutes - pattern: '*/10 * * * *', + // every 2 minutes + pattern: '*/2 * * * *', }, run: async () => { - const events = await fetchGoogleCalendarEvents(); - console.log('Fetched events from all linked Google accounts:', events); + console.log( + 'process.env.NEXT_PUBLIC_SUPABASE_URL', + process.env.NEXT_PUBLIC_SUPABASE_URL + ); + // Initialize Supabase client inside the task function + const supabase = createClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.SUPABASE_SERVICE_KEY! + ); + + await syncGoogleCalendarEvents(supabase); + console.log('Synced events from all linked Google accounts'); }, }); -const fetchGoogleCalendarEvents = async () => { +const getGoogleAuthClient = (tokens: { + access_token: string; + refresh_token?: string; +}) => { + const oauth2Client = new OAuth2Client({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + redirectUri: process.env.GOOGLE_REDIRECT_URI, + }); + + oauth2Client.setCredentials(tokens); + return oauth2Client; +}; + +const getColorFromGoogleColorId = (colorId?: string): string => { + const colorMap: Record = { + '1': 'RED', + '2': 'GREEN', + '3': 'GRAY', + '4': 'PINK', + '5': 'YELLOW', + '6': 'ORANGE', + '8': 'CYAN', + '9': 'PURPLE', + '10': 'INDIGO', + '11': 'BLUE', + }; + return colorId && colorMap[colorId] ? colorMap[colorId] : 'BLUE'; +}; + +const syncGoogleCalendarEvents = async (supabase: any) => { try { - // Fetch all Google Calendar auth tokens from the database - const { data: authTokens, error: tokensError } = await supabase + // Fetch all wsId with auth tokens not null + const result = await supabase .from('calendar_auth_tokens') - .select('*'); + .select('ws_id, access_token, refresh_token'); - if (tokensError) { - console.error('Error fetching auth tokens:', tokensError); - return []; - } + const data = result.data; + const error = result.error; - if (!authTokens || authTokens.length === 0) { - console.log('No Google Calendar auth tokens found in database'); + if (error) { + console.error('Error fetching auth tokens:', error); return []; } - const allEvents: any[] = []; + const googleTokens = data.map((item: any) => ({ + ws_id: item.ws_id, + access_token: item.access_token, + refresh_token: item.refresh_token, + })); + // Type assertion for the tokens + const tokens = googleTokens as + | { + ws_id: string; + access_token: string; + refresh_token: string; + }[] + | null; + + for (const token of tokens || []) { + const { ws_id, access_token, refresh_token } = token; + if (!access_token) { + console.error('No Google access token found for wsIds:', { + ws_id, + hasAccessToken: !!access_token, + hasRefreshToken: !!refresh_token, + }); + } - // Fetch events from each linked Google account - for (const token of authTokens) { try { - const events = await fetchEventsFromGoogleAccount(token); - allEvents.push(...events); + const auth = getGoogleAuthClient(token); + const calendar = google.calendar({ version: 'v3', auth }); + + const timeMin = new Date(); + const timeMax = new Date(); + timeMax.setDate(timeMax.getDate() + 28); + + const response = await calendar.events.list({ + calendarId: 'primary', + timeMin: timeMin.toISOString(), // from now + timeMax: timeMax.toISOString(), // to the next 4 weeks + singleEvents: true, // separate recurring events + orderBy: 'startTime', + maxResults: 1000, + }); + + const events = response.data.items || []; + + // format the events to match the expected structure + const formattedEvents = events.map((event) => ({ + google_event_id: event.id, + title: event.summary || 'Untitled Event', + description: event.description || '', + start_at: event.start?.dateTime || event.start?.date || '', + end_at: event.end?.dateTime || event.end?.date || '', + location: event.location || '', + color: getColorFromGoogleColorId(event.colorId ?? undefined), + ws_id: ws_id, + locked: false, + })); + console.log('ws_id', ws_id); + console.log('access_token', access_token); + console.log('refresh_token', refresh_token); + console.log('formattedEvents', formattedEvents); + + // upsert the events in the database for this wsId + const { error } = await supabase + .from('workspace_calendar_events') + .upsert(formattedEvents, { + onConflict: 'google_event_id', + }); + if (error) { + console.error('Error upserting events:', error); + } } catch (error) { - console.error( - `Error fetching events for user ${token.user_id}:`, - error - ); - // Continue with other accounts even if one fails + console.error('Error fetching Google Calendar events:', error); } } - - return allEvents; } catch (error) { console.error('Error in fetchGoogleCalendarEvents:', error); return []; } }; - -const fetchEventsFromGoogleAccount = async (authToken: { - user_id: string; - ws_id: string; - access_token: string; - refresh_token: string; -}) => { - try { - // Create Google OAuth2 client - const oauth2Client = new OAuth2Client({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - redirectUri: process.env.GOOGLE_REDIRECT_URI, - }); - - oauth2Client.setCredentials({ - access_token: authToken.access_token, - refresh_token: authToken.refresh_token, - }); - - // Create Google Calendar client - const calendar = google.calendar({ version: 'v3', auth: oauth2Client }); - - // Set time range for fetching events (e.g., next 30 days) - const timeMin = new Date(); - const timeMax = new Date(); - timeMax.setDate(timeMax.getDate() + 30); - - // Fetch events from Google Calendar - const response = await calendar.events.list({ - calendarId: 'primary', - timeMin: timeMin.toISOString(), - timeMax: timeMax.toISOString(), - singleEvents: true, - orderBy: 'startTime', - maxResults: 100, - }); - - const events = response.data.items || []; - - // Format events and add metadata about the source account - return events.map((event) => ({ - google_event_id: event.id, - title: event.summary || 'Untitled Event', - description: event.description || '', - start_at: event.start?.dateTime || event.start?.date || '', - end_at: event.end?.dateTime || event.end?.date || '', - location: event.location || '', - color: getColorFromGoogleColorId(event.colorId ?? undefined), - ws_id: authToken.ws_id, - user_id: authToken.user_id, - locked: false, - source: 'google_calendar', - })); - } catch (error: any) { - console.error( - `Error fetching events for user ${authToken.user_id}:`, - error - ); - - // If token is invalid, you might want to handle token refresh here - if (error.response?.data?.error === 'invalid_grant') { - console.log( - `Token expired for user ${authToken.user_id}, needs re-authentication` - ); - } - - throw error; - } -}; - -const getColorFromGoogleColorId = (colorId?: string): string => { - // Google Calendar color mapping - const colorMap: { [key: string]: string } = { - '1': '#7986cb', // Lavender - '2': '#33b679', // Sage - '3': '#8f24aa', // Grape - '4': '#e67c73', // Flamingo - '5': '#f6c026', // Banana - '6': '#f4511e', // Tangerine - '7': '#039be5', // Peacock - '8': '#616161', // Graphite - '9': '#3f51b5', // Blueberry - '10': '#0b8043', // Basil - '11': '#d60000', // Tomato - }; - - return colorMap[colorId || ''] || '#039be5'; // Default to peacock blue -}; From 4584f75d93d38a79f6004fedf204cec975eea5ae Mon Sep 17 00:00:00 2001 From: DennieDan Date: Mon, 16 Jun 2025 14:50:57 +0800 Subject: [PATCH 08/18] feat: setup trigger for Google Calendar sync --- .gitignore | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 2ca3823be8..793b769740 100644 --- a/.gitignore +++ b/.gitignore @@ -25,9 +25,9 @@ dist # debug npm-debug.log* yarn-debug.log* -yarn-error.log* # local env files +.env .env.local .env.development.local .env.test.local @@ -39,4 +39,6 @@ yarn-error.log* # Typescript *.tsbuildinfo next-env.d.ts -.trigger \ No newline at end of file +.trigger.env +.env.local +.env.*.local From 4d4de39d331d0302349e741006f1834c58282c93 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Mon, 16 Jun 2025 15:35:33 +0800 Subject: [PATCH 09/18] chore: add .env.example in root directory --- .env.example | 43 +++++++++++++++++++++++++++++++++++++++++++ .gitignore | 3 +++ 2 files changed, 46 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000..7d3ec05ddd --- /dev/null +++ b/.env.example @@ -0,0 +1,43 @@ +# Required environment variables +# for both development and production +NEXT_PUBLIC_SUPABASE_URL=YOUR_SUPABASE_URL +NEXT_PUBLIC_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY +SUPABASE_SERVICE_KEY=YOUR_SUPABASE_SERVICE_KEY + +# Optional API keys +OPENAI_API_KEY=YOUR_OPENAI_API_KEY +ANTHROPIC_API_KEY=YOUR_ANTHROPIC_API_KEY +GOOGLE_GENERATIVE_AI_API_KEY=YOUR_GOOGLE_GENERATIVE_AI_API_KEY + +# Google Vertex AI credentials +GOOGLE_VERTEX_PROJECT=YOUR_GOOGLE_VERTEX_PROJECT +GOOGLE_VERTEX_LOCATION=YOUR_GOOGLE_VERTEX_LOCATION +GOOGLE_APPLICATION_CREDENTIALS=YOUR_GOOGLE_APPLICATION_CREDENTIALS + +# Google Calendar API credentials +GOOGLE_CLIENT_ID=YOUR_GOOGLE_CLIENT_ID +GOOGLE_CLIENT_SECRET=YOUR_GOOGLE_CLIENT_SECRET +GOOGLE_REDIRECT_URI=YOUR_GOOGLE_REDIRECT_URI + +# AWS Credentials +AWS_REGION=YOUR_AWS_REGION +AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID +AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET +SOURCE_NAME=YOUR_SOURCE_NAME +SOURCE_EMAIL=YOUR_SOURCE_EMAIL + +DEEPGRAM_ENV=YOUR_DEEPGRAM_ENV +DEEPGRAM_API_KEY=YOUR_DEEPGRAM_API_KEY + +MODAL_TOKEN_ID=YOUR_MODAL_TOKEN_ID +MODAL_TOKEN_SECRET=YOUR_MODAL_TOKEN_SECRET + +CF_ACCOUNT_ID=YOUR_CF_ACCOUNT_ID +CF_API_TOKEN=YOUR_CF_API_TOKEN + +# Infrastructure Credentials +SCRAPER_URL=YOUR_SCRAPER_URL +AURORA_EXTERNAL_URL=YOUR_AURORA_EXTERNAL_URL +AURORA_EXTERNAL_WSID=YOUR_AURORA_EXTERNAL_WSID +PROXY_API_KEY=YOUR_PROXY_API_KEY +NEXT_PUBLIC_PROXY_API_KEY=YOUR_NEXT_PUBLIC_PROXY_API_KEY \ No newline at end of file diff --git a/.gitignore b/.gitignore index 793b769740..9a8f7d4284 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,6 @@ next-env.d.ts .trigger.env .env.local .env.*.local + +# Trigger.dev +.trigger/ From 2f3b2af0b809bfb9ff6032027db51a8b2b495a4a Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 21:15:13 +0800 Subject: [PATCH 10/18] chore: move .env.local to packages/trigger/ --- bun.lock | 29 +++++++++++++------ package.json | 2 -- .../google-calendar-background-sync.ts | 1 + packages/trigger/package.json | 19 +++++++----- .../trigger/trigger.config.ts | 2 +- 5 files changed, 33 insertions(+), 20 deletions(-) rename trigger.config.ts => packages/trigger/trigger.config.ts (95%) diff --git a/bun.lock b/bun.lock index 87c59017aa..06a32dc725 100644 --- a/bun.lock +++ b/bun.lock @@ -4,14 +4,12 @@ "": { "name": "tutur3u", "dependencies": { - "@trigger.dev/sdk": "^3.3.17", "cookies-next": "^6.0.0", "react-scan": "^0.3.4", }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.28.0", - "@trigger.dev/build": "^3.3.17", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@tuturuuu/eslint-config": "workspace:*", "@tuturuuu/typescript-config": "workspace:*", @@ -649,7 +647,10 @@ "name": "@tuturuuu/trigger", "version": "0.1.0", "dependencies": { - "@trigger.dev/sdk": "^3.0.0", + "@trigger.dev/sdk": "^3.3.17", + }, + "devDependencies": { + "@trigger.dev/build": "^3.3.17", }, }, "packages/types": { @@ -3904,7 +3905,7 @@ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], "tinypool": ["tinypool@1.1.0", "", {}, "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ=="], @@ -4136,7 +4137,7 @@ "write-file-atomic": ["write-file-atomic@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ=="], - "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], "xlsx": ["xlsx@vendor/xlsx-0.20.3.tgz", { "bin": { "xlsx": "./bin/xlsx.njs" } }], @@ -4206,6 +4207,8 @@ "@deepgram/sdk/@types/node": ["@types/node@18.19.83", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-D69JeR5SfFS5H6FLbUaS0vE4r1dGhmMBbG4Ed6BNS4wkDK8GZjsdCShT5LCN59vOHEUHnFCY9J4aclXlIphMkA=="], + "@deepgram/sdk/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], "@emotion/babel-plugin/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], @@ -4242,6 +4245,8 @@ "@supabase/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "@supabase/realtime-js/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "@tailwindcss/node/lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], @@ -4268,6 +4273,12 @@ "@tldraw/editor/@tiptap/react": ["@tiptap/react@2.12.0", "", { "dependencies": { "@tiptap/extension-bubble-menu": "^2.12.0", "@tiptap/extension-floating-menu": "^2.12.0", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", "use-sync-external-store": "^1" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-D+PR+4kJO9h8AB/7XyQ/Anw8tqeS2ecv5QemBOCHi9JlMAjytauUrj6IfFBO9RbsCowlBjW5GnSpFhzpk2Gghg=="], + "@tldraw/sync/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + + "@tldraw/sync-core/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + + "@trigger.dev/build/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + "@trigger.dev/core/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], "@trigger.dev/sdk/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -4276,6 +4287,8 @@ "@trigger.dev/sdk/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + "@trigger.dev/sdk/ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "@types/cors/@types/node": ["@types/node@22.13.13", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ=="], "@types/papaparse/@types/node": ["@types/node@22.15.14", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g=="], @@ -4412,8 +4425,6 @@ "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jsdom/ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], - "jsondiffpatch/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], @@ -4554,14 +4565,14 @@ "vite/postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], - "vite/tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], - "vite-compatible-readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "vite-node/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "vitest/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "vitest/tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + "vue-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], "vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], diff --git a/package.json b/package.json index da41c83431..7e6dbe1d60 100644 --- a/package.json +++ b/package.json @@ -54,14 +54,12 @@ "update-all": "(cd apps && for dir in */; do echo \"Updating apps/$dir...\" && cd \"$dir\" && bun update && cd ..; done) && (cd packages && for dir in */; do echo \"Updating packages/$dir...\" && cd \"$dir\" && bun update && cd ..; done)" }, "dependencies": { - "@trigger.dev/sdk": "^3.3.17", "cookies-next": "^6.0.0", "react-scan": "^0.3.4" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.28.0", - "@trigger.dev/build": "^3.3.17", "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@tuturuuu/eslint-config": "workspace:*", "@tuturuuu/typescript-config": "workspace:*", diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts index 1afa21e48e..064bf7e67f 100644 --- a/packages/trigger/google-calendar-background-sync.ts +++ b/packages/trigger/google-calendar-background-sync.ts @@ -1,5 +1,6 @@ import { createClient } from '@supabase/supabase-js'; import { schedules } from '@trigger.dev/sdk/v3'; +import 'dotenv/config'; import { OAuth2Client } from 'google-auth-library'; import { google } from 'googleapis'; diff --git a/packages/trigger/package.json b/packages/trigger/package.json index 68d336c5ab..dd3465606d 100644 --- a/packages/trigger/package.json +++ b/packages/trigger/package.json @@ -3,19 +3,22 @@ "version": "0.1.0", "private": true, "type": "module", - "main": "./example.ts", - "types": "./example.ts", + "main": "./google-calendar-background-sync.ts", + "types": "./google-calendar-background-sync.ts", "exports": { ".": { - "types": "./example.ts", - "import": "./example.ts" + "types": "./google-calendar-background-sync.ts", + "import": "./google-calendar-background-sync.ts" }, - "./example": { - "types": "./example.ts", - "import": "./example.ts" + "./google-calendar-background-sync": { + "types": "./google-calendar-background-sync.ts", + "import": "./google-calendar-background-sync.ts" } }, "dependencies": { - "@trigger.dev/sdk": "^3.0.0" + "@trigger.dev/sdk": "^3.3.17" + }, + "devDependencies": { + "@trigger.dev/build": "^3.3.17" } } diff --git a/trigger.config.ts b/packages/trigger/trigger.config.ts similarity index 95% rename from trigger.config.ts rename to packages/trigger/trigger.config.ts index a2619fe943..1f0fa9eefd 100644 --- a/trigger.config.ts +++ b/packages/trigger/trigger.config.ts @@ -18,5 +18,5 @@ export default defineConfig({ randomize: true, }, }, - dirs: ['packages/trigger'], + dirs: ['.'], }); From 49978b861192be1f3d96595fa55e4d11d04825ad Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 21:31:37 +0800 Subject: [PATCH 11/18] feat: add changes using cursor --- ...1000000_add_calendar_sync_coordination.sql | 53 +++++ .../google-calendar-background-sync.ts | 19 +- packages/ui/src/hooks/use-calendar-sync.tsx | 35 +++ .../utils/src/calendar-sync-coordination.md | 197 ++++++++++++++++ .../src/calendar-sync-coordination.test.ts | 212 ++++++++++++++++++ .../utils/src/calendar-sync-coordination.ts | 126 +++++++++++ 6 files changed, 641 insertions(+), 1 deletion(-) create mode 100644 apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql create mode 100644 packages/utils/src/calendar-sync-coordination.md create mode 100644 packages/utils/src/calendar-sync-coordination.test.ts create mode 100644 packages/utils/src/calendar-sync-coordination.ts diff --git a/apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql b/apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql new file mode 100644 index 0000000000..1e4512852f --- /dev/null +++ b/apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql @@ -0,0 +1,53 @@ +-- Create table to coordinate calendar sync operations +create table "public"."workspace_calendar_sync_coordination" ( + "ws_id" uuid not null, + "last_upsert" timestamp with time zone not null default now(), + "created_at" timestamp with time zone default now(), + "updated_at" timestamp with time zone default now() +); + +-- Add primary key +alter table "public"."workspace_calendar_sync_coordination" +add constraint "workspace_calendar_sync_coordination_pkey" PRIMARY KEY (ws_id); + +-- Add foreign key to workspaces +alter table "public"."workspace_calendar_sync_coordination" +add constraint "workspace_calendar_sync_coordination_ws_id_fkey" +FOREIGN KEY (ws_id) REFERENCES workspaces(id) ON DELETE CASCADE; + +-- Enable RLS +alter table "public"."workspace_calendar_sync_coordination" enable row level security; + +-- Create policy for workspace members +create policy "Enable access for workspace members" on "public"."workspace_calendar_sync_coordination" +as permissive for all to authenticated using ( + EXISTS ( + SELECT 1 FROM workspace_members + WHERE workspace_members.ws_id = workspace_calendar_sync_coordination.ws_id + AND workspace_members.user_id = auth.uid() + ) +) with check ( + EXISTS ( + SELECT 1 FROM workspace_members + WHERE workspace_members.ws_id = workspace_calendar_sync_coordination.ws_id + AND workspace_members.user_id = auth.uid() + ) +); + +-- Create function to update the updated_at timestamp +CREATE OR REPLACE FUNCTION update_workspace_calendar_sync_coordination_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create trigger to automatically update updated_at +CREATE TRIGGER update_workspace_calendar_sync_coordination_updated_at + BEFORE UPDATE ON workspace_calendar_sync_coordination + FOR EACH ROW + EXECUTE FUNCTION update_workspace_calendar_sync_coordination_updated_at(); + +-- Enable audit tracking +select audit.enable_tracking('public.workspace_calendar_sync_coordination'::regclass); \ No newline at end of file diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts index 064bf7e67f..e42626b98c 100644 --- a/packages/trigger/google-calendar-background-sync.ts +++ b/packages/trigger/google-calendar-background-sync.ts @@ -1,5 +1,10 @@ import { createClient } from '@supabase/supabase-js'; import { schedules } from '@trigger.dev/sdk/v3'; +import { + FOUR_WEEKS_FROM_CURRENT_WEEK, + canProceedWithSync, + updateLastUpsert, +} from '@tuturuuu/utils/calendar-sync-coordination'; import 'dotenv/config'; import { OAuth2Client } from 'google-auth-library'; import { google } from 'googleapis'; @@ -96,12 +101,21 @@ const syncGoogleCalendarEvents = async (supabase: any) => { } try { + // Check if we can proceed with sync for this workspace + const canProceed = await canProceedWithSync(ws_id, supabase); + if (!canProceed) { + console.log( + `Skipping background sync for wsId ${ws_id} due to 30-second cooldown` + ); + continue; + } + const auth = getGoogleAuthClient(token); const calendar = google.calendar({ version: 'v3', auth }); const timeMin = new Date(); const timeMax = new Date(); - timeMax.setDate(timeMax.getDate() + 28); + timeMax.setDate(timeMax.getDate() + FOUR_WEEKS_FROM_CURRENT_WEEK); const response = await calendar.events.list({ calendarId: 'primary', @@ -139,6 +153,9 @@ const syncGoogleCalendarEvents = async (supabase: any) => { }); if (error) { console.error('Error upserting events:', error); + } else { + // Update lastUpsert timestamp after successful upsert + await updateLastUpsert(ws_id, supabase); } } catch (error) { console.error('Error fetching Google Calendar events:', error); diff --git a/packages/ui/src/hooks/use-calendar-sync.tsx b/packages/ui/src/hooks/use-calendar-sync.tsx index 83998a6373..b0e6bda871 100644 --- a/packages/ui/src/hooks/use-calendar-sync.tsx +++ b/packages/ui/src/hooks/use-calendar-sync.tsx @@ -7,6 +7,11 @@ import type { WorkspaceCalendarGoogleToken, } from '@tuturuuu/types/db'; import { CalendarEvent } from '@tuturuuu/types/primitives/calendar-event'; +import { + canProceedWithSync, + isWithin4WeeksFromCurrentWeek, + updateLastUpsert, +} from '@tuturuuu/utils/calendar-sync-coordination'; import dayjs from 'dayjs'; import { createContext, @@ -335,6 +340,33 @@ export const CalendarSyncProvider = ({ ) => { setIsSyncing(true); try { + // Check if current view is within 4 weeks from current week + if (dates.length > 0) { + const startDate = dates[0]; + const endDate = dates[dates.length - 1]; + + if (startDate && endDate) { + const isWithinRange = isWithin4WeeksFromCurrentWeek( + startDate, + endDate + ); + + if (!isWithinRange) { + console.log( + 'Sync blocked: Current view is outside 4 weeks from current week' + ); + return; + } + } + } + + // Check if we can proceed with sync + const canProceed = await canProceedWithSync(wsId); + if (!canProceed) { + console.log('Sync blocked due to 30-second cooldown'); + return; + } + const supabase = createClient(); // Use the exact range from dates array @@ -559,6 +591,9 @@ export const CalendarSyncProvider = ({ } else { setError(null); console.log('Upsert status: Finished'); + + // Update lastUpsert timestamp after successful upsert + await updateLastUpsert(wsId); } // Refresh the cache to trigger queryClient to refetch the data from database diff --git a/packages/utils/src/calendar-sync-coordination.md b/packages/utils/src/calendar-sync-coordination.md new file mode 100644 index 0000000000..5a5f4c1260 --- /dev/null +++ b/packages/utils/src/calendar-sync-coordination.md @@ -0,0 +1,197 @@ +# Calendar Sync Coordination + +This module provides utilities to coordinate calendar sync operations between active sync (user-initiated) and background sync (automated) to prevent conflicts and ensure data consistency. + +## Overview + +The calendar sync coordination system uses a `lastUpsert` timestamp to enforce a 30-second cooldown period between sync operations for each workspace. Additionally, it includes a 4-week range check to ensure syncs only operate within a reasonable time window from the current week. This prevents: + +- Race conditions between active and background syncs +- Excessive API calls to Google Calendar +- Data inconsistencies from concurrent updates +- Syncs on date ranges too far in the past or future + +## Database Schema + +The system uses a `workspace_calendar_sync_coordination` table: + +```sql +CREATE TABLE workspace_calendar_sync_coordination ( + ws_id UUID PRIMARY KEY REFERENCES workspaces(id) ON DELETE CASCADE, + last_upsert TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); +``` + +## Functions + +### `canProceedWithSync(wsId: string, supabase?: any): Promise` + +Checks if a sync operation can proceed for the given workspace. + +**Parameters:** + +- `wsId`: The workspace ID +- `supabase`: Optional Supabase client (will create one if not provided) + +**Returns:** + +- `true` if sync can proceed (30+ seconds since last upsert) +- `false` if sync is blocked (less than 30 seconds since last upsert) + +**Behavior:** + +- Creates a coordination record if one doesn't exist for the workspace +- Allows sync for new workspaces (no existing record) +- Gracefully handles errors by allowing sync to proceed + +### `isWithin4WeeksFromCurrentWeek(startDate: Date, endDate: Date): boolean` + +Checks if a date range is within 4 weeks from the current week. + +**Parameters:** + +- `startDate`: Start date to check +- `endDate`: End date to check + +**Returns:** + +- `true` if the date range overlaps with 4 weeks from current week +- `false` if the date range is outside the 4-week window + +**Behavior:** + +- Uses the current week as the reference point (not the current view) +- Checks if the date range overlaps with the 4-week period +- Useful for preventing syncs on distant past or future dates + +### `updateLastUpsert(wsId: string, supabase?: any): Promise` + +Updates the `last_upsert` timestamp for a workspace after a successful sync operation. + +**Parameters:** + +- `wsId`: The workspace ID +- `supabase`: Optional Supabase client (will create one if not provided) + +**Behavior:** + +- Upserts the timestamp using the workspace ID as the conflict target +- Logs success or error messages +- Gracefully handles errors + +### `FOUR_WEEKS_FROM_CURRENT_WEEK` + +Constant representing 4 weeks (28 days) from the current week. + +## Usage + +### Active Sync (use-calendar-sync.tsx) + +```typescript +import { + canProceedWithSync, + isWithin4WeeksFromCurrentWeek, + updateLastUpsert, +} from '@tuturuuu/utils/calendar-sync-coordination'; + +const syncToTuturuuu = async () => { + // Check if current view is within 4 weeks from current week + if (dates.length > 0) { + const startDate = dates[0]; + const endDate = dates[dates.length - 1]; + + if (startDate && endDate) { + const isWithinRange = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + if (!isWithinRange) { + console.log( + 'Sync blocked: Current view is outside 4 weeks from current week' + ); + return; + } + } + } + + // Check if we can proceed with sync + const canProceed = await canProceedWithSync(wsId); + if (!canProceed) { + console.log('Sync blocked due to 30-second cooldown'); + return; + } + + // Perform sync operations... + + // Update timestamp after successful upsert + await updateLastUpsert(wsId); +}; +``` + +### Background Sync (google-calendar-background-sync.ts) + +```typescript +import { + FOUR_WEEKS_FROM_CURRENT_WEEK, + canProceedWithSync, + updateLastUpsert, +} from '@tuturuuu/utils/calendar-sync-coordination'; + +const syncGoogleCalendarEvents = async (supabase: any) => { + for (const token of tokens) { + // Check if we can proceed with sync for this workspace + const canProceed = await canProceedWithSync(token.ws_id, supabase); + if (!canProceed) { + console.log( + `Skipping background sync for wsId ${token.ws_id} due to 30-second cooldown` + ); + continue; + } + + // Perform sync operations with 4-week range + const timeMin = new Date(); + const timeMax = new Date(); + timeMax.setDate(timeMax.getDate() + FOUR_WEEKS_FROM_CURRENT_WEEK); + + // ... sync logic ... + + // Update timestamp after successful upsert + await updateLastUpsert(token.ws_id, supabase); + } +}; +``` + +## Error Handling + +All functions are designed to be fault-tolerant: + +- If the coordination table doesn't exist, sync operations are allowed to proceed +- If database operations fail, sync operations are allowed to proceed +- All errors are logged but don't block sync operations +- This ensures the system degrades gracefully if the coordination mechanism fails + +## Migration + +To set up the coordination table, run the migration: + +```sql +-- Create table to coordinate calendar sync operations +CREATE TABLE workspace_calendar_sync_coordination ( + ws_id UUID PRIMARY KEY REFERENCES workspaces(id) ON DELETE CASCADE, + last_upsert TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() +); + +-- Add RLS policies and triggers as needed +``` + +## Benefits + +1. **Prevents Conflicts**: Ensures only one sync operation per workspace every 30 seconds +2. **Reduces API Load**: Prevents excessive calls to Google Calendar API +3. **Maintains Consistency**: Avoids race conditions that could corrupt data +4. **Graceful Degradation**: System continues to work even if coordination fails +5. **Workspace Isolation**: Each workspace has its own coordination record +6. **Reasonable Time Window**: Prevents syncs on distant past or future dates +7. **Current Week Reference**: Uses current week as reference point for 4-week window diff --git a/packages/utils/src/calendar-sync-coordination.test.ts b/packages/utils/src/calendar-sync-coordination.test.ts new file mode 100644 index 0000000000..8dc6574f19 --- /dev/null +++ b/packages/utils/src/calendar-sync-coordination.test.ts @@ -0,0 +1,212 @@ +import { + canProceedWithSync, + isWithin4WeeksFromCurrentWeek, + updateLastUpsert, +} from './calendar-sync-coordination'; +import dayjs from 'dayjs'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +describe('Calendar Sync Coordination', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('canProceedWithSync', () => { + it('should allow sync for new workspace (no existing record)', async () => { + // Mock Supabase client for new workspace scenario + const mockSupabase = { + from: vi.fn(() => ({ + select: vi.fn(() => ({ + eq: vi.fn(() => ({ + single: vi.fn().mockResolvedValue({ + data: null, + error: { code: 'PGRST116' }, + }), + })), + })), + insert: vi.fn().mockResolvedValue({ error: null }), + })), + }; + + const result = await canProceedWithSync( + 'test-ws-id', + mockSupabase as any + ); + + expect(result).toBe(true); + expect(mockSupabase.from).toHaveBeenCalledWith( + 'workspace_calendar_sync_coordination' + ); + }); + + it('should block sync if less than 30 seconds have passed', async () => { + const thirtySecondsAgo = new Date(Date.now() - 15 * 1000); // 15 seconds ago + + const mockSupabase = { + from: vi.fn(() => ({ + select: vi.fn(() => ({ + eq: vi.fn(() => ({ + single: vi.fn().mockResolvedValue({ + data: { last_upsert: thirtySecondsAgo.toISOString() }, + error: null, + }), + })), + })), + })), + }; + + const result = await canProceedWithSync( + 'test-ws-id', + mockSupabase as any + ); + + expect(result).toBe(false); + }); + + it('should allow sync if more than 30 seconds have passed', async () => { + const fortySecondsAgo = new Date(Date.now() - 40 * 1000); // 40 seconds ago + + const mockSupabase = { + from: vi.fn(() => ({ + select: vi.fn(() => ({ + eq: vi.fn(() => ({ + single: vi.fn().mockResolvedValue({ + data: { last_upsert: fortySecondsAgo.toISOString() }, + error: null, + }), + })), + })), + })), + }; + + const result = await canProceedWithSync( + 'test-ws-id', + mockSupabase as any + ); + + expect(result).toBe(true); + }); + + it('should allow sync on database error (graceful degradation)', async () => { + const mockSupabase = { + from: vi.fn(() => ({ + select: vi.fn(() => ({ + eq: vi.fn(() => ({ + single: vi.fn().mockResolvedValue({ + data: null, + error: { code: 'OTHER_ERROR' }, + }), + })), + })), + })), + }; + + const result = await canProceedWithSync( + 'test-ws-id', + mockSupabase as any + ); + + expect(result).toBe(true); + }); + }); + + describe('isWithin4WeeksFromCurrentWeek', () => { + it('should return true for date range within current week', () => { + const now = dayjs(); + const startDate = now.startOf('week').toDate(); + const endDate = now.endOf('week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(true); + }); + + it('should return true for date range within 4 weeks from current week', () => { + const now = dayjs(); + const startDate = now.startOf('week').toDate(); + const endDate = now.startOf('week').add(3, 'week').endOf('week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(true); + }); + + it('should return true for date range overlapping with 4-week window', () => { + const now = dayjs(); + const startDate = now.subtract(1, 'week').toDate(); + const endDate = now.add(2, 'week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(true); + }); + + it('should return false for date range too far in the past', () => { + const now = dayjs(); + const startDate = now.subtract(6, 'week').toDate(); + const endDate = now.subtract(5, 'week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(false); + }); + + it('should return false for date range too far in the future', () => { + const now = dayjs(); + const startDate = now.add(5, 'week').toDate(); + const endDate = now.add(6, 'week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(false); + }); + + it('should return false for date range completely outside 4-week window', () => { + const now = dayjs(); + const startDate = now.subtract(10, 'week').toDate(); + const endDate = now.subtract(9, 'week').toDate(); + + const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); + + expect(result).toBe(false); + }); + }); + + describe('updateLastUpsert', () => { + it('should update lastUpsert timestamp successfully', async () => { + const mockSupabase = { + from: vi.fn(() => ({ + upsert: vi.fn().mockResolvedValue({ error: null }), + })), + }; + + await updateLastUpsert('test-ws-id', mockSupabase as any); + + expect(mockSupabase.from).toHaveBeenCalledWith( + 'workspace_calendar_sync_coordination' + ); + expect(mockSupabase.from().upsert).toHaveBeenCalledWith( + expect.objectContaining({ + ws_id: 'test-ws-id', + last_upsert: expect.any(String), + }), + { onConflict: 'ws_id' } + ); + }); + + it('should handle upsert errors gracefully', async () => { + const mockSupabase = { + from: vi.fn(() => ({ + upsert: vi.fn().mockResolvedValue({ + error: { message: 'Database error' }, + }), + })), + }; + + // Should not throw + await expect( + updateLastUpsert('test-ws-id', mockSupabase as any) + ).resolves.not.toThrow(); + }); + }); +}); diff --git a/packages/utils/src/calendar-sync-coordination.ts b/packages/utils/src/calendar-sync-coordination.ts new file mode 100644 index 0000000000..a23ede1f63 --- /dev/null +++ b/packages/utils/src/calendar-sync-coordination.ts @@ -0,0 +1,126 @@ +import { createClient } from '@tuturuuu/supabase/next/client'; +import dayjs from 'dayjs'; + +// Const of 4 weeks from the current week, this can be used for startDate and endDate in google calendar background sync +// and check if the current view is within this range +export const FOUR_WEEKS_FROM_CURRENT_WEEK = 4 * 7; + +/** + * Check if we can proceed with sync (30-second cooldown) + * @param wsId - Workspace ID + * @param supabase - Supabase client (optional, will create one if not provided) + * @returns Promise - true if sync can proceed, false if blocked + */ +export const canProceedWithSync = async ( + wsId: string, + supabase?: any +): Promise => { + try { + const client = supabase || createClient(); + + // Get or create sync coordination record + const { data: syncRecord, error: fetchError } = await client + .from('workspace_calendar_sync_coordination') + .select('last_upsert') + .eq('ws_id', wsId) + .single(); + + if (fetchError && fetchError.code !== 'PGRST116') { + // PGRST116 is "not found" + console.error('Error fetching sync coordination:', fetchError); + return true; // Allow sync if we can't check + } + + if (!syncRecord) { + // Create record if it doesn't exist + const { error: insertError } = await client + .from('workspace_calendar_sync_coordination') + .insert({ ws_id: wsId, last_upsert: new Date().toISOString() }); + + if (insertError) { + console.error('Error creating sync coordination record:', insertError); + } + return true; // Allow sync for new workspaces + } + + const lastUpsert = new Date(syncRecord.last_upsert); + const now = new Date(); + const timeSinceLastUpsert = now.getTime() - lastUpsert.getTime(); + const thirtySeconds = 30 * 1000; + + if (timeSinceLastUpsert < thirtySeconds) { + const remainingSeconds = Math.round( + (thirtySeconds - timeSinceLastUpsert) / 1000 + ); + console.log( + `Sync blocked for wsId ${wsId}: ${remainingSeconds}s remaining` + ); + return false; + } + + return true; + } catch (error) { + console.error('Error checking sync coordination:', error); + return true; // Allow sync if we can't check + } +}; + +/** + * Check if a date range is within 4 weeks from the current week + * @param startDate - Start date to check + * @param endDate - End date to check + * @returns boolean - true if within 4 weeks from current week, false otherwise + */ +export const isWithin4WeeksFromCurrentWeek = ( + startDate: Date, + endDate: Date +): boolean => { + const now = dayjs(); + const startOfCurrentWeek = now.startOf('week'); + const endOf4WeeksFromCurrentWeek = startOfCurrentWeek.add( + FOUR_WEEKS_FROM_CURRENT_WEEK, + 'day' + ); + + const start = dayjs(startDate); + const end = dayjs(endDate); + + // Check if the date range overlaps with the 4-week period from current week + const isWithinRange = + start.isBefore(endOf4WeeksFromCurrentWeek) && + end.isAfter(startOfCurrentWeek); + + return isWithinRange; +}; + +/** + * Update lastUpsert timestamp after successful sync + * @param wsId - Workspace ID + * @param supabase - Supabase client (optional, will create one if not provided) + */ +export const updateLastUpsert = async ( + wsId: string, + supabase?: any +): Promise => { + try { + const client = supabase || createClient(); + + const { error } = await client + .from('workspace_calendar_sync_coordination') + .upsert( + { + ws_id: wsId, + last_upsert: new Date().toISOString(), + }, + { onConflict: 'ws_id' } + ); + + if (error) { + console.error('Error updating lastUpsert:', error); + } else { + console.log('Updated lastUpsert timestamp for wsId:', wsId); + } + } catch (error) { + console.error('Error updating lastUpsert:', error); + } +}; From 2d4a1e99b6d45753123bf4a81e15596945e96925 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 21:32:56 +0800 Subject: [PATCH 12/18] fix: export example.ts task --- packages/trigger/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/trigger/package.json b/packages/trigger/package.json index dd3465606d..e4326ba0f5 100644 --- a/packages/trigger/package.json +++ b/packages/trigger/package.json @@ -7,8 +7,8 @@ "types": "./google-calendar-background-sync.ts", "exports": { ".": { - "types": "./google-calendar-background-sync.ts", - "import": "./google-calendar-background-sync.ts" + "types": "./example.ts", + "import": "./example.ts" }, "./google-calendar-background-sync": { "types": "./google-calendar-background-sync.ts", From a002eaa9840d5d745cf500af924d62790810d1af Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 21:41:43 +0800 Subject: [PATCH 13/18] feat: add current view within background sync range check --- .../google-calendar-background-sync.ts | 4 +- packages/ui/src/hooks/use-calendar-sync.tsx | 22 +- .../src/calendar-sync-coordination.test.ts | 212 ------------------ .../utils/src/calendar-sync-coordination.ts | 29 ++- 4 files changed, 24 insertions(+), 243 deletions(-) delete mode 100644 packages/utils/src/calendar-sync-coordination.test.ts diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts index e42626b98c..f90dde03a8 100644 --- a/packages/trigger/google-calendar-background-sync.ts +++ b/packages/trigger/google-calendar-background-sync.ts @@ -1,7 +1,7 @@ import { createClient } from '@supabase/supabase-js'; import { schedules } from '@trigger.dev/sdk/v3'; import { - FOUR_WEEKS_FROM_CURRENT_WEEK, + BACKGROUND_SYNC_RANGE, canProceedWithSync, updateLastUpsert, } from '@tuturuuu/utils/calendar-sync-coordination'; @@ -115,7 +115,7 @@ const syncGoogleCalendarEvents = async (supabase: any) => { const timeMin = new Date(); const timeMax = new Date(); - timeMax.setDate(timeMax.getDate() + FOUR_WEEKS_FROM_CURRENT_WEEK); + timeMax.setDate(timeMax.getDate() + BACKGROUND_SYNC_RANGE); const response = await calendar.events.list({ calendarId: 'primary', diff --git a/packages/ui/src/hooks/use-calendar-sync.tsx b/packages/ui/src/hooks/use-calendar-sync.tsx index b0e6bda871..64324ee6b2 100644 --- a/packages/ui/src/hooks/use-calendar-sync.tsx +++ b/packages/ui/src/hooks/use-calendar-sync.tsx @@ -9,7 +9,7 @@ import type { import { CalendarEvent } from '@tuturuuu/types/primitives/calendar-event'; import { canProceedWithSync, - isWithin4WeeksFromCurrentWeek, + isWithinBackgroundSyncRange, updateLastUpsert, } from '@tuturuuu/utils/calendar-sync-coordination'; import dayjs from 'dayjs'; @@ -340,26 +340,6 @@ export const CalendarSyncProvider = ({ ) => { setIsSyncing(true); try { - // Check if current view is within 4 weeks from current week - if (dates.length > 0) { - const startDate = dates[0]; - const endDate = dates[dates.length - 1]; - - if (startDate && endDate) { - const isWithinRange = isWithin4WeeksFromCurrentWeek( - startDate, - endDate - ); - - if (!isWithinRange) { - console.log( - 'Sync blocked: Current view is outside 4 weeks from current week' - ); - return; - } - } - } - // Check if we can proceed with sync const canProceed = await canProceedWithSync(wsId); if (!canProceed) { diff --git a/packages/utils/src/calendar-sync-coordination.test.ts b/packages/utils/src/calendar-sync-coordination.test.ts deleted file mode 100644 index 8dc6574f19..0000000000 --- a/packages/utils/src/calendar-sync-coordination.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { - canProceedWithSync, - isWithin4WeeksFromCurrentWeek, - updateLastUpsert, -} from './calendar-sync-coordination'; -import dayjs from 'dayjs'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -describe('Calendar Sync Coordination', () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - describe('canProceedWithSync', () => { - it('should allow sync for new workspace (no existing record)', async () => { - // Mock Supabase client for new workspace scenario - const mockSupabase = { - from: vi.fn(() => ({ - select: vi.fn(() => ({ - eq: vi.fn(() => ({ - single: vi.fn().mockResolvedValue({ - data: null, - error: { code: 'PGRST116' }, - }), - })), - })), - insert: vi.fn().mockResolvedValue({ error: null }), - })), - }; - - const result = await canProceedWithSync( - 'test-ws-id', - mockSupabase as any - ); - - expect(result).toBe(true); - expect(mockSupabase.from).toHaveBeenCalledWith( - 'workspace_calendar_sync_coordination' - ); - }); - - it('should block sync if less than 30 seconds have passed', async () => { - const thirtySecondsAgo = new Date(Date.now() - 15 * 1000); // 15 seconds ago - - const mockSupabase = { - from: vi.fn(() => ({ - select: vi.fn(() => ({ - eq: vi.fn(() => ({ - single: vi.fn().mockResolvedValue({ - data: { last_upsert: thirtySecondsAgo.toISOString() }, - error: null, - }), - })), - })), - })), - }; - - const result = await canProceedWithSync( - 'test-ws-id', - mockSupabase as any - ); - - expect(result).toBe(false); - }); - - it('should allow sync if more than 30 seconds have passed', async () => { - const fortySecondsAgo = new Date(Date.now() - 40 * 1000); // 40 seconds ago - - const mockSupabase = { - from: vi.fn(() => ({ - select: vi.fn(() => ({ - eq: vi.fn(() => ({ - single: vi.fn().mockResolvedValue({ - data: { last_upsert: fortySecondsAgo.toISOString() }, - error: null, - }), - })), - })), - })), - }; - - const result = await canProceedWithSync( - 'test-ws-id', - mockSupabase as any - ); - - expect(result).toBe(true); - }); - - it('should allow sync on database error (graceful degradation)', async () => { - const mockSupabase = { - from: vi.fn(() => ({ - select: vi.fn(() => ({ - eq: vi.fn(() => ({ - single: vi.fn().mockResolvedValue({ - data: null, - error: { code: 'OTHER_ERROR' }, - }), - })), - })), - })), - }; - - const result = await canProceedWithSync( - 'test-ws-id', - mockSupabase as any - ); - - expect(result).toBe(true); - }); - }); - - describe('isWithin4WeeksFromCurrentWeek', () => { - it('should return true for date range within current week', () => { - const now = dayjs(); - const startDate = now.startOf('week').toDate(); - const endDate = now.endOf('week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(true); - }); - - it('should return true for date range within 4 weeks from current week', () => { - const now = dayjs(); - const startDate = now.startOf('week').toDate(); - const endDate = now.startOf('week').add(3, 'week').endOf('week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(true); - }); - - it('should return true for date range overlapping with 4-week window', () => { - const now = dayjs(); - const startDate = now.subtract(1, 'week').toDate(); - const endDate = now.add(2, 'week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(true); - }); - - it('should return false for date range too far in the past', () => { - const now = dayjs(); - const startDate = now.subtract(6, 'week').toDate(); - const endDate = now.subtract(5, 'week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(false); - }); - - it('should return false for date range too far in the future', () => { - const now = dayjs(); - const startDate = now.add(5, 'week').toDate(); - const endDate = now.add(6, 'week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(false); - }); - - it('should return false for date range completely outside 4-week window', () => { - const now = dayjs(); - const startDate = now.subtract(10, 'week').toDate(); - const endDate = now.subtract(9, 'week').toDate(); - - const result = isWithin4WeeksFromCurrentWeek(startDate, endDate); - - expect(result).toBe(false); - }); - }); - - describe('updateLastUpsert', () => { - it('should update lastUpsert timestamp successfully', async () => { - const mockSupabase = { - from: vi.fn(() => ({ - upsert: vi.fn().mockResolvedValue({ error: null }), - })), - }; - - await updateLastUpsert('test-ws-id', mockSupabase as any); - - expect(mockSupabase.from).toHaveBeenCalledWith( - 'workspace_calendar_sync_coordination' - ); - expect(mockSupabase.from().upsert).toHaveBeenCalledWith( - expect.objectContaining({ - ws_id: 'test-ws-id', - last_upsert: expect.any(String), - }), - { onConflict: 'ws_id' } - ); - }); - - it('should handle upsert errors gracefully', async () => { - const mockSupabase = { - from: vi.fn(() => ({ - upsert: vi.fn().mockResolvedValue({ - error: { message: 'Database error' }, - }), - })), - }; - - // Should not throw - await expect( - updateLastUpsert('test-ws-id', mockSupabase as any) - ).resolves.not.toThrow(); - }); - }); -}); diff --git a/packages/utils/src/calendar-sync-coordination.ts b/packages/utils/src/calendar-sync-coordination.ts index a23ede1f63..6d63b6028c 100644 --- a/packages/utils/src/calendar-sync-coordination.ts +++ b/packages/utils/src/calendar-sync-coordination.ts @@ -1,9 +1,10 @@ import { createClient } from '@tuturuuu/supabase/next/client'; +import { useCalendarSync } from '@tuturuuu/ui/hooks/use-calendar-sync'; import dayjs from 'dayjs'; // Const of 4 weeks from the current week, this can be used for startDate and endDate in google calendar background sync // and check if the current view is within this range -export const FOUR_WEEKS_FROM_CURRENT_WEEK = 4 * 7; +export const BACKGROUND_SYNC_RANGE = 4 * 7; /** * Check if we can proceed with sync (30-second cooldown) @@ -16,6 +17,19 @@ export const canProceedWithSync = async ( supabase?: any ): Promise => { try { + // Check if the current view is within the background sync range + const { dates } = useCalendarSync(); + + const startDate = dayjs(dates[0]); + const endDate = dayjs(dates[dates.length - 1]); + + const isWithinRange = isWithinBackgroundSyncRange(startDate, endDate); + + if (!isWithinRange) { + console.log('Out of background sync range: Can proceed with active sync'); + return true; + } + const client = supabase || createClient(); // Get or create sync coordination record @@ -71,14 +85,14 @@ export const canProceedWithSync = async ( * @param endDate - End date to check * @returns boolean - true if within 4 weeks from current week, false otherwise */ -export const isWithin4WeeksFromCurrentWeek = ( - startDate: Date, - endDate: Date +export const isWithinBackgroundSyncRange = ( + startDate: dayjs.Dayjs, + endDate: dayjs.Dayjs ): boolean => { const now = dayjs(); const startOfCurrentWeek = now.startOf('week'); - const endOf4WeeksFromCurrentWeek = startOfCurrentWeek.add( - FOUR_WEEKS_FROM_CURRENT_WEEK, + const endOfBackgroundSyncRange = startOfCurrentWeek.add( + BACKGROUND_SYNC_RANGE, 'day' ); @@ -87,8 +101,7 @@ export const isWithin4WeeksFromCurrentWeek = ( // Check if the date range overlaps with the 4-week period from current week const isWithinRange = - start.isBefore(endOf4WeeksFromCurrentWeek) && - end.isAfter(startOfCurrentWeek); + start.isBefore(endOfBackgroundSyncRange) && end.isAfter(startOfCurrentWeek); return isWithinRange; }; From 70e3e99fe6df79d85b9d1509308ce6961772bf00 Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 21:44:30 +0800 Subject: [PATCH 14/18] fix: export example.ts instead of google.ts --- packages/trigger/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/trigger/package.json b/packages/trigger/package.json index e4326ba0f5..08d9023652 100644 --- a/packages/trigger/package.json +++ b/packages/trigger/package.json @@ -3,16 +3,16 @@ "version": "0.1.0", "private": true, "type": "module", - "main": "./google-calendar-background-sync.ts", - "types": "./google-calendar-background-sync.ts", + "main": "./example.ts", + "types": "./example.ts", "exports": { ".": { "types": "./example.ts", "import": "./example.ts" }, - "./google-calendar-background-sync": { - "types": "./google-calendar-background-sync.ts", - "import": "./google-calendar-background-sync.ts" + "./example": { + "types": "./example.ts", + "import": "./example.ts" } }, "dependencies": { From ef6cbfa1609e7d906c302e5a629cdc85f92bde0c Mon Sep 17 00:00:00 2001 From: DennieDan Date: Tue, 17 Jun 2025 22:09:33 +0800 Subject: [PATCH 15/18] fix: fix to 4 weeks start from current week not from now --- .../google-calendar-background-sync.ts | 19 ++++++------------- packages/trigger/package.json | 10 +++++----- packages/ui/src/hooks/use-calendar-sync.tsx | 1 - .../utils/src/calendar-sync-coordination.ts | 9 ++++++--- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/packages/trigger/google-calendar-background-sync.ts b/packages/trigger/google-calendar-background-sync.ts index f90dde03a8..8828317bd9 100644 --- a/packages/trigger/google-calendar-background-sync.ts +++ b/packages/trigger/google-calendar-background-sync.ts @@ -2,9 +2,9 @@ import { createClient } from '@supabase/supabase-js'; import { schedules } from '@trigger.dev/sdk/v3'; import { BACKGROUND_SYNC_RANGE, - canProceedWithSync, updateLastUpsert, } from '@tuturuuu/utils/calendar-sync-coordination'; +import dayjs from 'dayjs'; import 'dotenv/config'; import { OAuth2Client } from 'google-auth-library'; import { google } from 'googleapis'; @@ -101,21 +101,14 @@ const syncGoogleCalendarEvents = async (supabase: any) => { } try { - // Check if we can proceed with sync for this workspace - const canProceed = await canProceedWithSync(ws_id, supabase); - if (!canProceed) { - console.log( - `Skipping background sync for wsId ${ws_id} due to 30-second cooldown` - ); - continue; - } - const auth = getGoogleAuthClient(token); const calendar = google.calendar({ version: 'v3', auth }); - const timeMin = new Date(); - const timeMax = new Date(); - timeMax.setDate(timeMax.getDate() + BACKGROUND_SYNC_RANGE); + const startOfCurrentWeek = dayjs().startOf('week'); + const timeMin = startOfCurrentWeek.toDate(); + const timeMax = startOfCurrentWeek + .add(BACKGROUND_SYNC_RANGE, 'day') + .toDate(); const response = await calendar.events.list({ calendarId: 'primary', diff --git a/packages/trigger/package.json b/packages/trigger/package.json index dd3465606d..f02a329f01 100644 --- a/packages/trigger/package.json +++ b/packages/trigger/package.json @@ -7,12 +7,12 @@ "types": "./google-calendar-background-sync.ts", "exports": { ".": { - "types": "./google-calendar-background-sync.ts", - "import": "./google-calendar-background-sync.ts" + "types": "./example.ts", + "import": "./example.ts" }, - "./google-calendar-background-sync": { - "types": "./google-calendar-background-sync.ts", - "import": "./google-calendar-background-sync.ts" + "./example": { + "types": "./example.ts", + "import": "./example.ts" } }, "dependencies": { diff --git a/packages/ui/src/hooks/use-calendar-sync.tsx b/packages/ui/src/hooks/use-calendar-sync.tsx index 64324ee6b2..b5c7ea84a8 100644 --- a/packages/ui/src/hooks/use-calendar-sync.tsx +++ b/packages/ui/src/hooks/use-calendar-sync.tsx @@ -9,7 +9,6 @@ import type { import { CalendarEvent } from '@tuturuuu/types/primitives/calendar-event'; import { canProceedWithSync, - isWithinBackgroundSyncRange, updateLastUpsert, } from '@tuturuuu/utils/calendar-sync-coordination'; import dayjs from 'dayjs'; diff --git a/packages/utils/src/calendar-sync-coordination.ts b/packages/utils/src/calendar-sync-coordination.ts index 6d63b6028c..3e4da6f5ac 100644 --- a/packages/utils/src/calendar-sync-coordination.ts +++ b/packages/utils/src/calendar-sync-coordination.ts @@ -1,5 +1,4 @@ import { createClient } from '@tuturuuu/supabase/next/client'; -import { useCalendarSync } from '@tuturuuu/ui/hooks/use-calendar-sync'; import dayjs from 'dayjs'; // Const of 4 weeks from the current week, this can be used for startDate and endDate in google calendar background sync @@ -14,11 +13,15 @@ export const BACKGROUND_SYNC_RANGE = 4 * 7; */ export const canProceedWithSync = async ( wsId: string, - supabase?: any + supabase?: any, + dates?: Date[] ): Promise => { try { // Check if the current view is within the background sync range - const { dates } = useCalendarSync(); + if (!dates) { + console.log('No dates provided: Can proceed with active sync'); + return true; + } const startDate = dayjs(dates[0]); const endDate = dayjs(dates[dates.length - 1]); From 8747e54edb03a1a5da5a650c339bf4fcc4e438da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=B5=20Ho=C3=A0ng=20Ph=C3=BAc?= Date: Tue, 17 Jun 2025 21:37:11 +0700 Subject: [PATCH 16/18] chore(trigger): move .env.example to the trigger package --- .env.example => packages/trigger/.env.example | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .env.example => packages/trigger/.env.example (100%) diff --git a/.env.example b/packages/trigger/.env.example similarity index 100% rename from .env.example rename to packages/trigger/.env.example From d419d5cd7f555422ef73da448889822cdb9448b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=B5=20Ho=C3=A0ng=20Ph=C3=BAc?= Date: Tue, 17 Jun 2025 21:40:17 +0700 Subject: [PATCH 17/18] chore(db): consolidate database schema --- ...tion.sql => 20250616000000_add_calendar_sync_coordination.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/db/supabase/migrations/{20250101000000_add_calendar_sync_coordination.sql => 20250616000000_add_calendar_sync_coordination.sql} (100%) diff --git a/apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql b/apps/db/supabase/migrations/20250616000000_add_calendar_sync_coordination.sql similarity index 100% rename from apps/db/supabase/migrations/20250101000000_add_calendar_sync_coordination.sql rename to apps/db/supabase/migrations/20250616000000_add_calendar_sync_coordination.sql From ae47ade30600792d56b0e36dd0ef39fd11a340ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=B5=20Ho=C3=A0ng=20Ph=C3=BAc?= Date: Tue, 17 Jun 2025 21:46:12 +0700 Subject: [PATCH 18/18] chore(db): update database schema with new types and argument order adjustments --- bun.lock | 20 ++-- packages/types/src/supabase.ts | 204 ++++++++++++++++++--------------- 2 files changed, 121 insertions(+), 103 deletions(-) diff --git a/bun.lock b/bun.lock index b602180c35..8ffa159e99 100644 --- a/bun.lock +++ b/bun.lock @@ -15,7 +15,7 @@ "@tuturuuu/typescript-config": "workspace:*", "@vitest/coverage-v8": "^3.2.3", "concurrently": "^9.1.2", - "eslint": "^9.28.0", + "eslint": "^9.29.0", "prettier": "^3.5.3", "prettier-eslint": "^16.4.2", "prettier-plugin-tailwindcss": "^0.6.12", @@ -633,7 +633,7 @@ "name": "@tuturuuu/transactional", "version": "1.0.0", "dependencies": { - "@react-email/components": "^0.0.41", + "@react-email/components": "^0.1.0", "@react-email/tailwind": "^1.0.5", "react": "^19.1.0", "react-email": "^4.0.16", @@ -1235,7 +1235,7 @@ "@jsonhero/path": ["@jsonhero/path@1.0.21", "", {}, "sha512-gVUDj/92acpVoJwsVJ/RuWOaHyG4oFzn898WNGQItLCTQ+hOaVlEaImhwE1WqOTf+l3dGOUkbSiVKlb3q1hd1Q=="], - "@mantine/hooks": ["@mantine/hooks@8.1.0", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-Ycg8g11zRFfG0ZOp3lIogZh8O1Y5+Jiteu1Ja0BeIeTPVLLXufUhhgyorNr7F4QTD18xKzB1nX8wZzKFD6czPQ=="], + "@mantine/hooks": ["@mantine/hooks@8.1.1", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-C+p9pPDPl/IMcVCN44XMa9MbuUOEJS3PG9Wklw9Z+ooJqkBnc7aXs3xTAjIsaUCinR9hMqT19cwiYb+W88leVg=="], "@mermaid-js/parser": ["@mermaid-js/parser@0.4.0", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA=="], @@ -1523,15 +1523,15 @@ "@react-email/body": ["@react-email/body@0.0.11", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg=="], - "@react-email/button": ["@react-email/button@0.0.19", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A=="], + "@react-email/button": ["@react-email/button@0.1.0", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-fg4LtgTu5zXxaRSly9cuv6sHVF/hi1lElbRaIA8EPx5coWOBhCto6rCPfawcXpaN2oER7rNHUrcNBkI+lz5F9A=="], - "@react-email/code-block": ["@react-email/code-block@0.0.13", "", { "dependencies": { "prismjs": "^1.30.0" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-4DE4yPSgKEOnZMzcrDvRuD6mxsNxOex0hCYEG9F9q23geYgb2WCCeGBvIUXVzK69l703Dg4Vzrd5qUjl+JfcwA=="], + "@react-email/code-block": ["@react-email/code-block@0.1.0", "", { "dependencies": { "prismjs": "^1.30.0" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jSpHFsgqnQXxDIssE4gvmdtFncaFQz5D6e22BnVjcCPk/udK+0A9jRwGFEG8JD2si9ZXBmU4WsuqQEczuZn4ww=="], "@react-email/code-inline": ["@react-email/code-inline@0.0.5", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA=="], "@react-email/column": ["@react-email/column@0.0.13", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ=="], - "@react-email/components": ["@react-email/components@0.0.41", "", { "dependencies": { "@react-email/body": "0.0.11", "@react-email/button": "0.0.19", "@react-email/code-block": "0.0.13", "@react-email/code-inline": "0.0.5", "@react-email/column": "0.0.13", "@react-email/container": "0.0.15", "@react-email/font": "0.0.9", "@react-email/head": "0.0.12", "@react-email/heading": "0.0.15", "@react-email/hr": "0.0.11", "@react-email/html": "0.0.11", "@react-email/img": "0.0.11", "@react-email/link": "0.0.12", "@react-email/markdown": "0.0.15", "@react-email/preview": "0.0.13", "@react-email/render": "1.1.2", "@react-email/row": "0.0.12", "@react-email/section": "0.0.16", "@react-email/tailwind": "1.0.5", "@react-email/text": "0.1.4" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-WUI3wHwra3QS0pwrovSU6b0I0f3TvY33ph0y44LuhSYDSQlMRyeOzgoT6HRDY5FXMDF57cHYq9WoKwpwP0yd7Q=="], + "@react-email/components": ["@react-email/components@0.1.0", "", { "dependencies": { "@react-email/body": "0.0.11", "@react-email/button": "0.1.0", "@react-email/code-block": "0.1.0", "@react-email/code-inline": "0.0.5", "@react-email/column": "0.0.13", "@react-email/container": "0.0.15", "@react-email/font": "0.0.9", "@react-email/head": "0.0.12", "@react-email/heading": "0.0.15", "@react-email/hr": "0.0.11", "@react-email/html": "0.0.11", "@react-email/img": "0.0.11", "@react-email/link": "0.0.12", "@react-email/markdown": "0.0.15", "@react-email/preview": "0.0.13", "@react-email/render": "1.1.2", "@react-email/row": "0.0.12", "@react-email/section": "0.0.16", "@react-email/tailwind": "1.0.5", "@react-email/text": "0.1.5" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Rx0eZk0XuzLKXC5NoMm8xuH72ALVsPYNb/BvcdCJx4EZAoVpQISb4sCqpo9blVYVIazNr4MqWroqFb3ZNrCLMQ=="], "@react-email/container": ["@react-email/container@0.0.15", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg=="], @@ -1561,7 +1561,7 @@ "@react-email/tailwind": ["@react-email/tailwind@1.0.5", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg=="], - "@react-email/text": ["@react-email/text@0.1.4", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-cMNE02y8172DocpNGh97uV5HSTawaS4CKG/zOku8Pu+m6ehBKbAjgtQZDIxhgstw8+TWraFB8ltS1DPjfG8nLA=="], + "@react-email/text": ["@react-email/text@0.1.5", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg=="], "@react-pdf/fns": ["@react-pdf/fns@3.1.2", "", {}, "sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g=="], @@ -5069,8 +5069,6 @@ "web-resource-inliner/htmlparser2/domutils/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], - "@ai-sdk/google-vertex/google-auth-library/gaxios/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "@tanstack/eslint-plugin-query/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], "@tanstack/eslint-plugin-query/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], @@ -5107,10 +5105,6 @@ "prettier-eslint/eslint/file-entry-cache/flat-cache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "@ai-sdk/google-vertex/google-auth-library/gaxios/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - - "@ai-sdk/google-vertex/google-auth-library/gaxios/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - "eslint-config-next/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "eslint-config-next/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], diff --git a/packages/types/src/supabase.ts b/packages/types/src/supabase.ts index ca96c107ef..bb70e7373a 100644 --- a/packages/types/src/supabase.ts +++ b/packages/types/src/supabase.ts @@ -4963,6 +4963,35 @@ export type Database = { }, ]; }; + workspace_calendar_sync_coordination: { + Row: { + created_at: string | null; + last_upsert: string; + updated_at: string | null; + ws_id: string; + }; + Insert: { + created_at?: string | null; + last_upsert?: string; + updated_at?: string | null; + ws_id: string; + }; + Update: { + created_at?: string | null; + last_upsert?: string; + updated_at?: string | null; + ws_id?: string; + }; + Relationships: [ + { + foreignKeyName: 'workspace_calendar_sync_coordination_ws_id_fkey'; + columns: ['ws_id']; + isOneToOne: true; + referencedRelation: 'workspaces'; + referencedColumns: ['id']; + }, + ]; + }; workspace_configs: { Row: { created_at: string; @@ -7320,7 +7349,7 @@ export type Database = { }; Functions: { calculate_productivity_score: { - Args: { category_color: string; duration_seconds: number }; + Args: { duration_seconds: number; category_color: string }; Returns: number; }; cleanup_expired_cross_app_tokens: { @@ -7348,32 +7377,30 @@ export type Database = { generate_cross_app_token: { Args: | { - p_user_id: string; - p_origin_app: string; - p_target_app: string; p_expiry_seconds?: number; + p_target_app: string; + p_origin_app: string; + p_user_id: string; } | { - p_user_id: string; p_origin_app: string; - p_target_app: string; - p_expiry_seconds?: number; p_session_data?: Json; + p_expiry_seconds?: number; + p_target_app: string; + p_user_id: string; }; Returns: string; }; get_challenge_stats: { - Args: { user_id_param: string; challenge_id_param: string }; + Args: { challenge_id_param: string; user_id_param: string }; Returns: { - problems_attempted: number; total_score: number; + problems_attempted: number; }[]; }; get_daily_income_expense: { Args: { _ws_id: string; past_days?: number }; Returns: { - day: string; - total_income: number; total_expense: number; day: string; total_income: number; @@ -7410,9 +7437,9 @@ export type Database = { get_hourly_prompt_completion_tokens: { Args: { past_hours?: number }; Returns: { - hour: string; total_prompt_tokens: number; total_completion_tokens: number; + hour: string; }[]; }; get_inventory_batches_count: { @@ -7431,16 +7458,16 @@ export type Database = { _category_ids?: string[]; }; Returns: { - id: string; - name: string; - manufacturer: string; - unit: string; - unit_id: string; - category: string; - price: number; - amount: number; ws_id: string; created_at: string; + amount: number; + price: number; + category: string; + unit_id: string; + unit: string; + manufacturer: string; + name: string; + id: string; }[]; }; get_inventory_products_count: { @@ -7460,18 +7487,18 @@ export type Database = { Returns: number; }; get_monthly_income_expense: { - Args: { past_months?: number; _ws_id: string }; + Args: { _ws_id: string; past_months?: number }; Returns: { + total_expense: number; month: string; total_income: number; - total_expense: number; }[]; }; get_monthly_prompt_completion_tokens: { Args: { past_months?: number }; Returns: { - month: string; total_prompt_tokens: number; + month: string; total_completion_tokens: number; }[]; }; @@ -7480,31 +7507,31 @@ export type Database = { Returns: number; }; get_possible_excluded_groups: { - Args: { _ws_id: string; included_groups: string[] }; + Args: { included_groups: string[]; _ws_id: string }; Returns: { + amount: number; id: string; name: string; ws_id: string; - amount: number; }[]; }; get_possible_excluded_tags: { - Args: { included_tags: string[]; _ws_id: string }; + Args: { _ws_id: string; included_tags: string[] }; Returns: { + name: string; id: string; amount: number; ws_id: string; - name: string; }[]; }; get_session_statistics: { Args: Record; Returns: { total_count: number; - unique_users_count: number; - active_count: number; - completed_count: number; latest_session_date: string; + completed_count: number; + active_count: number; + unique_users_count: number; }[]; }; get_session_templates: { @@ -7514,12 +7541,12 @@ export type Database = { limit_count?: number; }; Returns: { + category_name: string; title: string; description: string; category_id: string; task_id: string; tags: string[]; - category_name: string; category_color: string; task_name: string; usage_count: number; @@ -7530,20 +7557,20 @@ export type Database = { get_submission_statistics: { Args: Record; Returns: { + unique_users_count: number; total_count: number; latest_submission_date: string; - unique_users_count: number; }[]; }; get_transaction_categories_with_amount: { Args: Record; Returns: { - id: string; name: string; - is_expense: boolean; - ws_id: string; - created_at: string; amount: number; + created_at: string; + ws_id: string; + is_expense: boolean; + id: string; }[]; }; get_user_role: { @@ -7554,8 +7581,8 @@ export type Database = { Args: { user_id: string }; Returns: { active_sessions: number; - current_session_age: unknown; total_sessions: number; + current_session_age: unknown; }[]; }; get_user_sessions: { @@ -7567,23 +7594,20 @@ export type Database = { user_agent: string; ip: string; is_current: boolean; - ip: string; - user_agent: string; - updated_at: string; }[]; }; get_user_tasks: { Args: { _board_id: string }; Returns: { id: string; - list_id: string; - board_id: string; - start_date: string; end_date: string; - name: string; - description: string; - priority: number; + start_date: string; completed: boolean; + priority: number; + description: string; + name: string; + board_id: string; + list_id: string; }[]; }; get_workspace_drive_size: { @@ -7599,24 +7623,24 @@ export type Database = { Returns: number; }; get_workspace_transactions_count: { - Args: { start_date?: string; ws_id: string; end_date?: string }; + Args: { ws_id: string; end_date?: string; start_date?: string }; Returns: number; }; get_workspace_user_groups: { Args: { + search_query: string; _ws_id: string; included_tags: string[]; excluded_tags: string[]; - search_query: string; }; Returns: { + id: string; + name: string; + notes: string; + ws_id: string; + tags: string[]; created_at: string; tag_count: number; - tags: string[]; - ws_id: string; - notes: string; - name: string; - id: string; }[]; }; get_workspace_user_groups_count: { @@ -7625,33 +7649,32 @@ export type Database = { }; get_workspace_users: { Args: { - _ws_id: string; - included_groups: string[]; - excluded_groups: string[]; search_query: string; + excluded_groups: string[]; + included_groups: string[]; + _ws_id: string; }; Returns: { id: string; - avatar_url: string; - full_name: string; - display_name: string; - email: string; - phone: string; - gender: string; - birthday: string; - ethnicity: string; - guardian: string; + updated_at: string; created_at: string; - address: string; - national_id: string; - note: string; - balance: number; - ws_id: string; - groups: string[]; - group_count: number; linked_users: Json; - created_at: string; - updated_at: string; + group_count: number; + groups: string[]; + ws_id: string; + balance: number; + note: string; + national_id: string; + address: string; + guardian: string; + ethnicity: string; + birthday: string; + gender: string; + phone: string; + email: string; + display_name: string; + full_name: string; + avatar_url: string; }[]; }; get_workspace_users_count: { @@ -7663,19 +7686,19 @@ export type Database = { Returns: number; }; get_workspace_wallets_expense: { - Args: { ws_id: string; start_date?: string; end_date?: string }; + Args: { ws_id: string; end_date?: string; start_date?: string }; Returns: number; }; get_workspace_wallets_income: { - Args: { ws_id: string; start_date?: string; end_date?: string }; + Args: { start_date?: string; ws_id: string; end_date?: string }; Returns: number; }; has_other_owner: { - Args: { _ws_id: string; _user_id: string }; + Args: { _user_id: string; _ws_id: string }; Returns: boolean; }; insert_ai_chat_message: { - Args: { source: string; chat_id: string; message: string }; + Args: { chat_id: string; message: string; source: string }; Returns: undefined; }; is_list_accessible: { @@ -7683,7 +7706,7 @@ export type Database = { Returns: boolean; }; is_member_invited: { - Args: { _org_id: string; _user_id: string }; + Args: { _user_id: string; _org_id: string }; Returns: boolean; }; is_nova_challenge_manager: { @@ -7695,7 +7718,7 @@ export type Database = { Returns: boolean; }; is_nova_user_email_in_team: { - Args: { _user_email: string; _team_id: string }; + Args: { _team_id: string; _user_email: string }; Returns: boolean; }; is_nova_user_id_in_team: { @@ -7715,7 +7738,7 @@ export type Database = { Returns: boolean; }; is_task_board_member: { - Args: { _user_id: string; _board_id: string }; + Args: { _board_id: string; _user_id: string }; Returns: boolean; }; is_user_task_in_board: { @@ -7727,11 +7750,11 @@ export type Database = { Returns: Json; }; nova_get_challenge_with_user_stats: { - Args: { challenge_id: string; user_id: string }; + Args: { user_id: string; challenge_id: string }; Returns: Json; }; nova_get_user_daily_sessions: { - Args: { challenge_id: string; user_id: string }; + Args: { user_id: string; challenge_id: string }; Returns: number; }; nova_get_user_total_sessions: { @@ -7752,14 +7775,14 @@ export type Database = { }; search_users: { Args: - | { search_query: string; page_number: number; page_size: number } | { + enabled_filter?: boolean; search_query: string; page_number: number; page_size: number; role_filter?: string; - enabled_filter?: boolean; - }; + } + | { search_query: string; page_number: number; page_size: number }; Returns: { id: string; display_name: string; @@ -7767,6 +7790,7 @@ export type Database = { avatar_url: string; handle: string; bio: string; + created_at: string; user_id: string; enabled: boolean; allow_challenge_management: boolean; @@ -7785,11 +7809,11 @@ export type Database = { min_similarity?: number; }; Returns: { - id: string; handle: string; + relevance: number; + id: string; display_name: string; avatar_url: string; - relevance: number; }[]; }; sum_quiz_scores: { @@ -7811,7 +7835,7 @@ export type Database = { Returns: undefined; }; update_session_total_score: { - Args: { challenge_id_param: string; user_id_param: string }; + Args: { user_id_param: string; challenge_id_param: string }; Returns: undefined; }; validate_cross_app_token: { @@ -7819,7 +7843,7 @@ export type Database = { Returns: string; }; validate_cross_app_token_with_session: { - Args: { p_token: string; p_target_app: string }; + Args: { p_target_app: string; p_token: string }; Returns: { user_id: string; session_data: Json;