diff --git a/.changeset/honest-files-decide.md b/.changeset/honest-files-decide.md new file mode 100644 index 0000000000..6bc65f34cc --- /dev/null +++ b/.changeset/honest-files-decide.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/sdk": patch +--- + +Deprecate toolTask and replace with `ai.tool(mySchemaTask)` diff --git a/.vscode/launch.json b/.vscode/launch.json index e044183922..e8bb90b562 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -149,6 +149,14 @@ "command": "pnpm run test ./src/run-queue/index.test.ts", "cwd": "${workspaceFolder}/internal-packages/run-engine", "sourceMaps": true + }, + { + "type": "node-terminal", + "request": "launch", + "name": "Debug d3-demo", + "command": "pnpm exec trigger dev", + "cwd": "${workspaceFolder}/references/d3-demo", + "sourceMaps": true } ] } diff --git a/apps/webapp/app/components/runs/v3/RunIcon.tsx b/apps/webapp/app/components/runs/v3/RunIcon.tsx index d1e917f4c4..903276a539 100644 --- a/apps/webapp/app/components/runs/v3/RunIcon.tsx +++ b/apps/webapp/app/components/runs/v3/RunIcon.tsx @@ -73,7 +73,7 @@ export function RunIcon({ name, className, spanName }: TaskIconProps) { case "trigger": return ; case "python": - return ; + return ; //log levels case "debug": case "log": diff --git a/apps/webapp/app/v3/otlpExporter.server.ts b/apps/webapp/app/v3/otlpExporter.server.ts index b3487968d2..bcfefdabb4 100644 --- a/apps/webapp/app/v3/otlpExporter.server.ts +++ b/apps/webapp/app/v3/otlpExporter.server.ts @@ -57,7 +57,7 @@ class OTLPExporter { const enrichedEvents = enrichCreatableEvents(events); - this.#logEventsVerbose(enrichedEvents); + this.#logEventsVerbose(enrichedEvents, "exportTraces"); span.setAttribute("event_count", enrichedEvents.length); @@ -84,7 +84,7 @@ class OTLPExporter { const enrichedEvents = enrichCreatableEvents(events); - this.#logEventsVerbose(enrichedEvents); + this.#logEventsVerbose(enrichedEvents, "exportLogs"); span.setAttribute("event_count", enrichedEvents.length); @@ -98,11 +98,11 @@ class OTLPExporter { }); } - #logEventsVerbose(events: CreatableEvent[]) { + #logEventsVerbose(events: CreatableEvent[], prefix: string) { if (!this._verbose) return; events.forEach((event) => { - logger.debug("Exporting event", { event }); + logger.debug(`Exporting ${prefix} event`, { event }); }); } diff --git a/apps/webapp/app/v3/utils/enrichCreatableEvents.server.ts b/apps/webapp/app/v3/utils/enrichCreatableEvents.server.ts index 39b2002dd9..70cf1e3749 100644 --- a/apps/webapp/app/v3/utils/enrichCreatableEvents.server.ts +++ b/apps/webapp/app/v3/utils/enrichCreatableEvents.server.ts @@ -23,7 +23,7 @@ function enrichStyle(event: CreatableEvent) { // GenAI System check const system = props["gen_ai.system"]; if (typeof system === "string") { - return { ...baseStyle, icon: `tabler-brand-${system}` }; + return { ...baseStyle, icon: `tabler-brand-${system.split(".")[0]}` }; } // Agent workflow check @@ -32,6 +32,16 @@ function enrichStyle(event: CreatableEvent) { return { ...baseStyle, icon: "tabler-brain" }; } + const message = event.message; + + if (typeof message === "string" && message === "ai.toolCall") { + return { ...baseStyle, icon: "tabler-tool" }; + } + + if (typeof message === "string" && message.startsWith("ai.")) { + return { ...baseStyle, icon: "tabler-sparkles" }; + } + return baseStyle; } diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 1a0d040206..b3c7386a6d 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -258,4 +258,4 @@ "engines": { "node": ">=16.0.0" } -} +} \ No newline at end of file diff --git a/packages/cli-v3/src/entryPoints/dev-run-worker.ts b/packages/cli-v3/src/entryPoints/dev-run-worker.ts index 0ebabb42e7..add6077614 100644 --- a/packages/cli-v3/src/entryPoints/dev-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/dev-run-worker.ts @@ -433,6 +433,8 @@ const zodIpc = new ZodIpcConnection({ error: { type: "INTERNAL_ERROR", code: TaskRunErrorCodes.CONFIGURED_INCORRECTLY, + message: err instanceof Error ? err.message : String(err), + stackTrace: err instanceof Error ? err.stack : undefined, }, usage: { durationMs: 0, diff --git a/packages/core/src/v3/index.ts b/packages/core/src/v3/index.ts index 7706842c14..1f1f4d3076 100644 --- a/packages/core/src/v3/index.ts +++ b/packages/core/src/v3/index.ts @@ -70,7 +70,14 @@ export * from "./utils/imageRef.js"; export * from "./utils/heartbeat.js"; export * from "./config.js"; -export { getSchemaParseFn, type AnySchemaParseFn, type SchemaParseFn } from "./types/schemas.js"; +export { + getSchemaParseFn, + type AnySchemaParseFn, + type SchemaParseFn, + isSchemaZodEsque, + isSchemaValibotEsque, + isSchemaArkTypeEsque, +} from "./types/schemas.js"; import { VERSION } from "../version.js"; diff --git a/packages/core/src/v3/otel/tracingSDK.ts b/packages/core/src/v3/otel/tracingSDK.ts index be7ab34012..171ccc440d 100644 --- a/packages/core/src/v3/otel/tracingSDK.ts +++ b/packages/core/src/v3/otel/tracingSDK.ts @@ -142,6 +142,7 @@ export class TracingSDK { traceProvider.addSpanProcessor( new TaskContextSpanProcessor( + traceProvider.getTracer("trigger-dev-worker", VERSION), getEnvVar("OTEL_BATCH_PROCESSING_ENABLED") === "1" ? new BatchSpanProcessor(spanExporter, { maxExportBatchSize: parseInt(getEnvVar("OTEL_SPAN_MAX_EXPORT_BATCH_SIZE") ?? "64"), diff --git a/packages/core/src/v3/taskContext/otelProcessors.ts b/packages/core/src/v3/taskContext/otelProcessors.ts index 90c5ea274f..123de426fd 100644 --- a/packages/core/src/v3/taskContext/otelProcessors.ts +++ b/packages/core/src/v3/taskContext/otelProcessors.ts @@ -4,11 +4,14 @@ import { SemanticInternalAttributes } from "../semanticInternalAttributes.js"; import { Context } from "@opentelemetry/api"; import { flattenAttributes } from "../utils/flattenAttributes.js"; import { taskContext } from "../task-context-api.js"; +import { Tracer } from "@opentelemetry/api"; export class TaskContextSpanProcessor implements SpanProcessor { private _innerProcessor: SpanProcessor; + private _tracer: Tracer; - constructor(innerProcessor: SpanProcessor) { + constructor(tracer: Tracer, innerProcessor: SpanProcessor) { + this._tracer = tracer; this._innerProcessor = innerProcessor; } @@ -26,7 +29,15 @@ export class TaskContextSpanProcessor implements SpanProcessor { ); } - this._innerProcessor.onStart(span, parentContext); + if (!isPartialSpan(span)) { + const partialSpan = createPartialSpan(this._tracer, span, parentContext); + + this._innerProcessor.onStart(span, parentContext); + + partialSpan.end(); + } else { + this._innerProcessor.onStart(span, parentContext); + } } // Delegate the rest of the methods to the wrapped processor @@ -44,6 +55,44 @@ export class TaskContextSpanProcessor implements SpanProcessor { } } +function isPartialSpan(span: Span) { + return span.attributes[SemanticInternalAttributes.SPAN_PARTIAL] === true; +} + +function createPartialSpan(tracer: Tracer, span: Span, parentContext: Context) { + const partialSpan = tracer.startSpan( + span.name, + { + attributes: { + [SemanticInternalAttributes.SPAN_PARTIAL]: true, + [SemanticInternalAttributes.SPAN_ID]: span.spanContext().spanId, + ...span.attributes, + }, + }, + parentContext + ); + + if (taskContext.ctx) { + partialSpan.setAttributes( + flattenAttributes( + { + [SemanticInternalAttributes.ATTEMPT_ID]: taskContext.ctx.attempt.id, + [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContext.ctx.attempt.number, + }, + SemanticInternalAttributes.METADATA + ) + ); + } + + if (span.events) { + for (const event of span.events) { + partialSpan.addEvent(event.name, event.attributes, event.time); + } + } + + return partialSpan; +} + export class TaskContextLogProcessor implements LogRecordProcessor { private _innerProcessor: LogRecordProcessor; diff --git a/packages/core/src/v3/tracer.ts b/packages/core/src/v3/tracer.ts index 2077e3772f..d7f5d70f12 100644 --- a/packages/core/src/v3/tracer.ts +++ b/packages/core/src/v3/tracer.ts @@ -1,7 +1,6 @@ import { Attributes, Context, - HrTime, SpanOptions, SpanStatusCode, TimeInput, @@ -12,12 +11,12 @@ import { type Tracer, } from "@opentelemetry/api"; import { Logger, logs } from "@opentelemetry/api-logs"; -import { SemanticInternalAttributes } from "./semanticInternalAttributes.js"; import { clock } from "./clock-api.js"; -import { usage } from "./usage-api.js"; -import { taskContext } from "./task-context-api.js"; -import { recordSpanException } from "./otel/utils.js"; import { isCompleteTaskWithOutput } from "./errors.js"; +import { recordSpanException } from "./otel/utils.js"; +import { SemanticInternalAttributes } from "./semanticInternalAttributes.js"; +import { taskContext } from "./task-context-api.js"; +import { usage } from "./usage-api.js"; export type TriggerTracerConfig = | { @@ -98,29 +97,6 @@ export class TriggerTracer { } }); - if (taskContext.ctx) { - const partialSpan = this.tracer.startSpan( - name, - { - ...options, - attributes: { - ...attributes, - [SemanticInternalAttributes.SPAN_PARTIAL]: true, - [SemanticInternalAttributes.SPAN_ID]: span.spanContext().spanId, - }, - }, - parentContext - ); - - if (options?.events) { - for (const event of options.events) { - partialSpan.addEvent(event.name, event.attributes, event.startTime); - } - } - - partialSpan.end(); - } - if (options?.events) { for (const event of options.events) { span.addEvent(event.name, event.attributes, event.startTime); @@ -179,21 +155,6 @@ export class TriggerTracer { const span = this.tracer.startSpan(name, options, parentContext); - this.tracer - .startSpan( - name, - { - ...options, - attributes: { - ...attributes, - [SemanticInternalAttributes.SPAN_PARTIAL]: true, - [SemanticInternalAttributes.SPAN_ID]: span.spanContext().spanId, - }, - }, - parentContext - ) - .end(); - return span; } } diff --git a/packages/core/src/v3/types/schemas.ts b/packages/core/src/v3/types/schemas.ts index f1b368330a..e5ae9c3d88 100644 --- a/packages/core/src/v3/types/schemas.ts +++ b/packages/core/src/v3/types/schemas.ts @@ -3,6 +3,18 @@ export type SchemaZodEsque = { _output: TParsedInput; }; +export function isSchemaZodEsque( + schema: Schema +): schema is SchemaZodEsque { + return ( + typeof schema === "object" && + "_def" in schema && + "parse" in schema && + "parseAsync" in schema && + "safeParse" in schema + ); +} + export type SchemaValibotEsque = { schema: { _types?: { @@ -12,11 +24,23 @@ export type SchemaValibotEsque = { }; }; +export function isSchemaValibotEsque( + schema: Schema +): schema is SchemaValibotEsque { + return typeof schema === "object" && "_types" in schema; +} + export type SchemaArkTypeEsque = { inferIn: TInput; infer: TParsedInput; }; +export function isSchemaArkTypeEsque( + schema: Schema +): schema is SchemaArkTypeEsque { + return typeof schema === "object" && "_inferIn" in schema && "_infer" in schema; +} + export type SchemaMyZodEsque = { parse: (input: any) => TInput; }; diff --git a/packages/core/src/v3/workers/taskExecutor.ts b/packages/core/src/v3/workers/taskExecutor.ts index 6887ec3f48..6ecef7f842 100644 --- a/packages/core/src/v3/workers/taskExecutor.ts +++ b/packages/core/src/v3/workers/taskExecutor.ts @@ -972,7 +972,7 @@ export class TaskExecutor { }, { attributes: { - [SemanticInternalAttributes.STYLE_ICON]: "clock", + [SemanticInternalAttributes.STYLE_ICON]: "tabler-clock", [SemanticInternalAttributes.COLLAPSED]: true, }, } diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 3bf40177e2..d41077c958 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -23,7 +23,8 @@ "exports": { "./package.json": "./package.json", ".": "./src/v3/index.ts", - "./v3": "./src/v3/index.ts" + "./v3": "./src/v3/index.ts", + "./ai": "./src/v3/ai.ts" }, "sourceDialects": [ "@triggerdotdev/source" @@ -33,6 +34,9 @@ "*": { "v3": [ "dist/commonjs/v3/index.d.ts" + ], + "ai": [ + "dist/commonjs/v3/ai.d.ts" ] } }, @@ -66,7 +70,7 @@ "@types/slug": "^5.0.3", "@types/uuid": "^9.0.0", "@types/ws": "^8.5.3", - "ai": "^4.0.1", + "ai": "^4.2.0", "encoding": "^0.1.13", "rimraf": "^3.0.2", "tshy": "^3.0.2", @@ -75,7 +79,13 @@ "zod": "3.23.8" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.0.0", + "ai": "^4.2.0" + }, + "peerDependenciesMeta": { + "ai": { + "optional": true + } }, "engines": { "node": ">=18.20.0" @@ -103,6 +113,17 @@ "types": "./dist/commonjs/v3/index.d.ts", "default": "./dist/commonjs/v3/index.js" } + }, + "./ai": { + "import": { + "@triggerdotdev/source": "./src/v3/ai.ts", + "types": "./dist/esm/v3/ai.d.ts", + "default": "./dist/esm/v3/ai.js" + }, + "require": { + "types": "./dist/commonjs/v3/ai.d.ts", + "default": "./dist/commonjs/v3/ai.js" + } } }, "main": "./dist/commonjs/v3/index.js", diff --git a/packages/trigger-sdk/src/v3/ai.ts b/packages/trigger-sdk/src/v3/ai.ts new file mode 100644 index 0000000000..de4f9794f5 --- /dev/null +++ b/packages/trigger-sdk/src/v3/ai.ts @@ -0,0 +1,88 @@ +import { + isSchemaZodEsque, + type inferSchemaIn, + type TaskSchema, + type TaskWithSchema, +} from "@trigger.dev/core/v3"; +import { jsonSchema, Schema, tool, ToolExecutionOptions, zodSchema } from "ai"; +import { metadata } from "./metadata.js"; + +const METADATA_KEY = "tool.execute.options"; + +export type ToolCallExecutionOptions = Omit; + +type ToolResultContent = Array< + | { + type: "text"; + text: string; + } + | { + type: "image"; + data: string; + mimeType?: string; + } +>; + +export type ToolOptions = { + experimental_toToolResultContent?: (result: TResult) => ToolResultContent; +}; + +function toolFromTask< + TIdentifier extends string, + TTaskSchema extends TaskSchema | undefined = undefined, + TOutput = unknown, +>(task: TaskWithSchema, options?: ToolOptions) { + if (!task.schema) { + throw new Error( + "Cannot convert schemaTask to a tool because the task has no schema. Make sure the schema used in the task is either zod, arktype, or another supported schema." + ); + } + + return tool({ + description: task.description, + parameters: convertTaskSchemaToToolParameters(task.schema), + execute: async (args, options) => { + const serializedOptions = options ? JSON.parse(JSON.stringify(options)) : undefined; + + return await task + .triggerAndWait(args, { + metadata: { + [METADATA_KEY]: serializedOptions, + }, + }) + .unwrap(); + }, + ...options, + }); +} + +function getToolOptionsFromMetadata(): ToolCallExecutionOptions | undefined { + const tool = metadata.get(METADATA_KEY); + if (!tool) { + return undefined; + } + return tool as ToolCallExecutionOptions; +} + +function convertTaskSchemaToToolParameters( + schema: TTaskSchema +): Schema> { + // If TaskSchema is ZodEsque, use ai.zodSchema to convert it to a Schema + if (isSchemaZodEsque(schema)) { + return zodSchema(schema as any); + } + + // If TaskSchema is ArkTypeEsque, use ai.jsonSchema to convert it to a Schema + if ("toJsonSchema" in schema && typeof schema.toJsonSchema === "function") { + return jsonSchema((schema as any).toJsonSchema()); + } + + throw new Error( + "Cannot convert schemaTask to a tool. Make sure the schema used in the task is either zod, arktype, or another supported schema." + ); +} + +export const ai = { + tool: toolFromTask, + currentToolOptions: getToolOptionsFromMetadata, +}; diff --git a/packages/trigger-sdk/src/v3/shared.ts b/packages/trigger-sdk/src/v3/shared.ts index e21cc2f219..d92a891905 100644 --- a/packages/trigger-sdk/src/v3/shared.ts +++ b/packages/trigger-sdk/src/v3/shared.ts @@ -224,6 +224,9 @@ export function createTask< return task; } +/** + * @deprecated use ai.tool() instead + */ export function createToolTask< TIdentifier extends string, TParameters extends ToolTaskParameters, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29f8450fc0..e4d5b2d974 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,10 +52,10 @@ importers: version: 20.14.14 autoprefixer: specifier: ^10.4.12 - version: 10.4.13(postcss@8.4.44) + version: 10.4.13(postcss@8.5.3) eslint-plugin-turbo: specifier: ^2.0.4 - version: 2.0.5(eslint@8.45.0) + version: 2.0.5(eslint@8.49.0) lefthook: specifier: ^1.11.3 version: 1.11.3 @@ -383,7 +383,7 @@ importers: version: 2.2.6(@splinetool/runtime@1.9.42)(react-dom@18.2.0)(react@18.2.0) '@tabler/icons-react': specifier: ^2.39.0 - version: 2.40.0(react@18.2.0) + version: 2.47.0(react@18.2.0) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@3.4.1) @@ -777,7 +777,7 @@ importers: version: 5.59.6(eslint@8.31.0)(typescript@5.5.4) autoprefixer: specifier: ^10.4.13 - version: 10.4.13(postcss@8.4.44) + version: 10.4.13(postcss@8.5.3) babel-loader: specifier: ^9.1.3 version: 9.1.3(@babel/core@7.26.8)(webpack@5.88.2) @@ -816,10 +816,10 @@ importers: version: 4.1.5 postcss-import: specifier: ^16.0.1 - version: 16.0.1(postcss@8.4.44) + version: 16.0.1(postcss@8.5.3) postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.4.44)(typescript@5.5.4)(webpack@5.88.2) + version: 8.1.1(postcss@8.5.3)(typescript@5.5.4)(webpack@5.88.2) prettier: specifier: ^2.8.8 version: 2.8.8 @@ -891,7 +891,7 @@ importers: version: 18.3.1 react-email: specifier: ^2.1.1 - version: 2.1.2(eslint@8.45.0) + version: 2.1.2(eslint@8.49.0) resend: specifier: ^3.2.0 version: 3.2.0 @@ -1268,7 +1268,7 @@ importers: version: 0.2.10 ws: specifier: ^8.18.0 - version: 8.18.0 + version: 8.18.0(bufferutil@4.0.9) xdg-app-paths: specifier: ^8.3.0 version: 8.3.0 @@ -1588,7 +1588,7 @@ importers: version: 6.0.1 tsup: specifier: ^8.4.0 - version: 8.4.0(postcss@8.4.44)(tsx@4.17.0)(typescript@5.5.4) + version: 8.4.0(postcss@8.5.3)(tsx@4.17.0)(typescript@5.5.4) tsx: specifier: 4.17.0 version: 4.17.0 @@ -1697,8 +1697,8 @@ importers: specifier: ^8.5.3 version: 8.5.4 ai: - specifier: ^4.0.1 - version: 4.0.2(react@18.3.1)(zod@3.23.8) + specifier: ^4.2.0 + version: 4.2.5(react@18.3.1)(zod@3.23.8) encoding: specifier: ^0.1.13 version: 0.1.13 @@ -1731,11 +1731,114 @@ importers: specifier: workspace:* version: link:../../packages/cli-v3 - references/d3-demo: + references/d3-chat: + dependencies: + '@ai-sdk/anthropic': + specifier: ^1.2.4 + version: 1.2.4(zod@3.23.8) + '@ai-sdk/openai': + specifier: 1.3.3 + version: 1.3.3(zod@3.23.8) + '@e2b/code-interpreter': + specifier: ^1.1.0 + version: 1.1.0 + '@radix-ui/react-avatar': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.0.4)(@types/react@19.0.12)(react-dom@19.0.0)(react@19.0.0) + '@slack/web-api': + specifier: ^6.8.1 + version: 6.8.1 + '@trigger.dev/python': + specifier: workspace:* + version: link:../../packages/python + '@trigger.dev/react-hooks': + specifier: workspace:* + version: link:../../packages/react-hooks + '@trigger.dev/sdk': + specifier: workspace:* + version: link:../../packages/trigger-sdk + '@vercel/postgres': + specifier: ^0.10.0 + version: 0.10.0 + ai: + specifier: 4.2.5 + version: 4.2.5(react@19.0.0)(zod@3.23.8) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.486.0 + version: 0.486.0(react@19.0.0) + marked: + specifier: ^4.0.18 + version: 4.2.5 + nanoid: + specifier: ^5.1.5 + version: 5.1.5 + next: + specifier: 15.2.4 + version: 15.2.4(@playwright/test@1.37.0)(react-dom@19.0.0)(react@19.0.0) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.0.12)(react@19.0.0) + tailwind-merge: + specifier: ^3.1.0 + version: 3.1.0 + tw-animate-css: + specifier: ^1.2.4 + version: 1.2.4 + zod: + specifier: 3.23.8 + version: 3.23.8 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4 + version: 4.0.17 + '@tailwindcss/typography': + specifier: ^0.5.9 + version: 0.5.9(tailwindcss@4.0.17) + '@trigger.dev/build': + specifier: workspace:* + version: link:../../packages/build + '@types/marked': + specifier: ^4.0.3 + version: 4.0.8 + '@types/node': + specifier: ^20 + version: 20.14.14 + '@types/react': + specifier: ^19 + version: 19.0.12 + '@types/react-dom': + specifier: ^19 + version: 19.0.4(@types/react@19.0.12) + tailwindcss: + specifier: ^4.0.17 + version: 4.0.17 + trigger.dev: + specifier: workspace:* + version: link:../../packages/cli-v3 + typescript: + specifier: ^5 + version: 5.5.4 + + references/d3-openai-agents: dependencies: '@ai-sdk/openai': specifier: 1.3.3 version: 1.3.3(zod@3.23.8) + '@slack/web-api': + specifier: ^6.8.1 + version: 6.8.1 '@trigger.dev/python': specifier: workspace:* version: link:../../packages/python @@ -1745,6 +1848,9 @@ importers: '@trigger.dev/sdk': specifier: workspace:* version: link:../../packages/trigger-sdk + '@vercel/postgres': + specifier: ^0.10.0 + version: 0.10.0 ai: specifier: 4.2.5 version: 4.2.5(react@19.0.0)(zod@3.23.8) @@ -1757,6 +1863,9 @@ importers: lucide-react: specifier: ^0.484.0 version: 0.484.0(react@19.0.0) + nanoid: + specifier: ^5.1.5 + version: 5.1.5 next: specifier: 15.2.4 version: 15.2.4(@playwright/test@1.37.0)(react-dom@19.0.0)(react@19.0.0) @@ -1794,12 +1903,18 @@ importers: '@types/react-dom': specifier: ^19 version: 19.0.4(@types/react@19.0.12) + dotenv: + specifier: 16.4.7 + version: 16.4.7 tailwindcss: specifier: ^4.0.17 version: 4.0.17 trigger.dev: specifier: workspace:* version: link:../../packages/cli-v3 + tsx: + specifier: 4.19.3 + version: 4.19.3 typescript: specifier: ^5 version: 5.5.4 @@ -1927,7 +2042,7 @@ importers: version: 8.4.44 tailwindcss: specifier: ^3.4.1 - version: 3.4.1(ts-node@10.9.1) + version: 3.4.1 trigger.dev: specifier: workspace:^3 version: link:../../packages/cli-v3 @@ -2179,6 +2294,17 @@ packages: resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} dev: false + /@ai-sdk/anthropic@1.2.4(zod@3.23.8): + resolution: {integrity: sha512-dAN6MXvLffeFVAr2gz3RGvOTgX1KL/Yn5q1l4/Dt0TUeDjQgCt4AbbYxZZB2qIAYzQvoyAFPhlw0sB3nNizG/g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + dependencies: + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.3(zod@3.23.8) + zod: 3.23.8 + dev: false + /@ai-sdk/openai@1.0.1(zod@3.23.8): resolution: {integrity: sha512-snZge8457afWlosVNUn+BG60MrxAPOOm3zmIMxJZih8tneNSiRbTVCbSzAtq/9vsnOHDe5RR83PRl85juOYEnA==} engines: {node: '>=18'} @@ -2228,7 +2354,7 @@ packages: dependencies: '@ai-sdk/provider': 0.0.26 eventsource-parser: 1.1.2 - nanoid: 3.3.7 + nanoid: 3.3.11 secure-json-parse: 2.7.0 zod: 3.23.8 dev: true @@ -2244,29 +2370,24 @@ packages: dependencies: '@ai-sdk/provider': 1.0.0 eventsource-parser: 3.0.0 - nanoid: 5.1.2 + nanoid: 5.1.5 secure-json-parse: 2.7.0 zod: 3.23.8 dev: false - /@ai-sdk/provider-utils@2.0.1(zod@3.23.8): - resolution: {integrity: sha512-TNg7rPhRtETB2Z9F0JpOvpGii9Fs8EWM8nYy1jEkvSXkrPJ6b/9zVnDdaJsmLFDyrMbOsPJlkblYtmYEQou36w==} + /@ai-sdk/provider-utils@2.2.1(zod@3.23.8): + resolution: {integrity: sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true + zod: ^3.23.8 dependencies: - '@ai-sdk/provider': 1.0.0 - eventsource-parser: 3.0.0 + '@ai-sdk/provider': 1.1.0 nanoid: 3.3.11 secure-json-parse: 2.7.0 zod: 3.23.8 - dev: true - /@ai-sdk/provider-utils@2.2.1(zod@3.23.8): - resolution: {integrity: sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg==} + /@ai-sdk/provider-utils@2.2.3(zod@3.23.8): + resolution: {integrity: sha512-o3fWTzkxzI5Af7U7y794MZkYNEsxbjLam2nxyoUZSScqkacb7vZ3EYHLh21+xCcSSzEC161C7pZAGHtC0hTUMw==} engines: {node: '>=18'} peerDependencies: zod: ^3.23.8 @@ -2296,13 +2417,13 @@ packages: engines: {node: '>=18'} dependencies: json-schema: 0.4.0 + dev: false /@ai-sdk/provider@1.1.0: resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} engines: {node: '>=18'} dependencies: json-schema: 0.4.0 - dev: false /@ai-sdk/react@0.0.53(react@19.0.0-rc.0)(zod@3.23.8): resolution: {integrity: sha512-sIsmTFoR/QHvUUkltmHwP4bPjwy2vko6j/Nj8ayxLhEHs04Ug+dwXQyfA7MwgimEE3BcDQpWL8ikVj0m3ZILWQ==} @@ -2363,20 +2484,18 @@ packages: zod: 3.23.8 dev: false - /@ai-sdk/react@1.0.1(react@18.3.1)(zod@3.23.8): - resolution: {integrity: sha512-vonKc5bcUQDkzWhqP/bBagT1Cam81gHuCAWPy52PHv1372OUrLmO2s9ZJPvfORE9ns8H84zT78MWaCf5pb/yiQ==} + /@ai-sdk/react@1.2.2(react@18.3.1)(zod@3.23.8): + resolution: {integrity: sha512-rxyNTFjUd3IilVOJFuUJV5ytZBYAIyRi50kFS2gNmSEiG4NHMBBm31ddrxI/i86VpY8gzZVp1/igtljnWBihUA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 + zod: ^3.23.8 peerDependenciesMeta: - react: - optional: true zod: optional: true dependencies: - '@ai-sdk/provider-utils': 2.0.1(zod@3.23.8) - '@ai-sdk/ui-utils': 1.0.1(zod@3.23.8) + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.1(zod@3.23.8) react: 18.3.1 swr: 2.2.5(react@18.3.1) throttleit: 2.1.0 @@ -2496,7 +2615,7 @@ packages: json-schema: 0.4.0 secure-json-parse: 2.7.0 zod: 3.23.8 - zod-to-json-schema: 3.24.3(zod@3.23.8) + zod-to-json-schema: 3.24.5(zod@3.23.8) dev: true /@ai-sdk/ui-utils@1.0.0(zod@3.23.8): @@ -2511,24 +2630,9 @@ packages: '@ai-sdk/provider': 1.0.0 '@ai-sdk/provider-utils': 2.0.0(zod@3.23.8) zod: 3.23.8 - zod-to-json-schema: 3.24.3(zod@3.23.8) + zod-to-json-schema: 3.24.5(zod@3.23.8) dev: false - /@ai-sdk/ui-utils@1.0.1(zod@3.23.8): - resolution: {integrity: sha512-zK7yNixtCve8ng/8+9jUFyLvI+1dPzSHuyIM56p3EeXwJECRt6e8xyk9AZJNskhmDN6jP+qucP2rWlkX3ZQ2gA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true - dependencies: - '@ai-sdk/provider': 1.0.0 - '@ai-sdk/provider-utils': 2.0.1(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.24.3(zod@3.23.8) - dev: true - /@ai-sdk/ui-utils@1.2.1(zod@3.23.8): resolution: {integrity: sha512-BzvMbYm7LHBlbWuLlcG1jQh4eu14MGpz7L+wrGO1+F4oQ+O0fAjgUSNwPWGlZpKmg4NrcVq/QLmxiVJrx2R4Ew==} engines: {node: '>=18'} @@ -2539,7 +2643,6 @@ packages: '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.24.5(zod@3.23.8) - dev: false /@ai-sdk/vue@0.0.45(vue@3.4.38)(zod@3.23.8): resolution: {integrity: sha512-bqeoWZqk88TQmfoPgnFUKkrvhOIcOcSH5LMPgzZ8XwDqz5tHHrMHzpPfHCj7XyYn4ROTFK/2kKdC/ta6Ko0fMw==} @@ -3789,7 +3892,7 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/helper-validator-option': 7.22.15 - browserslist: 4.23.3 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -3799,7 +3902,7 @@ packages: dependencies: '@babel/compat-data': 7.25.4 '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 dev: false @@ -5281,7 +5384,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - dev: false /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} @@ -5417,6 +5519,10 @@ packages: resolution: {integrity: sha512-QDdVFLoN93Zjg36NoQPZfsVH9tZew7wKDKyV5qRdj8ntT4wQCOradQjRaTdwMhWUYsgKsvCINKKm87FdEk96Ag==} dev: false + /@bufbuild/protobuf@2.2.5: + resolution: {integrity: sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ==} + dev: false + /@bugsnag/cuid@3.1.1: resolution: {integrity: sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==} dev: false @@ -5443,7 +5549,7 @@ packages: /@changesets/apply-release-plan@6.1.4: resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/config': 2.3.1 '@changesets/get-version-range-type': 0.3.2 '@changesets/git': 2.0.0 @@ -5461,7 +5567,7 @@ packages: /@changesets/assemble-release-plan@5.2.4(patch_hash=3wuhjtl4hjck4itk3w32z4cd5u): resolution: {integrity: sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/errors': 0.1.4 '@changesets/get-dependents-graph': 1.3.6 '@changesets/types': 5.2.1 @@ -5524,7 +5630,7 @@ packages: '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 dev: false /@changesets/errors@0.1.4: @@ -5555,7 +5661,7 @@ packages: /@changesets/get-release-plan@3.0.17: resolution: {integrity: sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/assemble-release-plan': 5.2.4(patch_hash=3wuhjtl4hjck4itk3w32z4cd5u) '@changesets/config': 2.3.1 '@changesets/pre': 1.0.14 @@ -5571,12 +5677,12 @@ packages: /@changesets/git@2.0.0: resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 + micromatch: 4.0.8 spawndamnit: 2.0.0 dev: false @@ -5596,7 +5702,7 @@ packages: /@changesets/pre@1.0.14: resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/errors': 0.1.4 '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 @@ -5606,7 +5712,7 @@ packages: /@changesets/read@0.5.9: resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/git': 2.0.0 '@changesets/logger': 0.0.5 '@changesets/parse': 0.3.16 @@ -5626,7 +5732,7 @@ packages: /@changesets/write@0.2.3: resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 @@ -5858,6 +5964,16 @@ packages: undici: 5.28.4 dev: false + /@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.5)(@connectrpc/connect@2.0.0-rc.3): + resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} + peerDependencies: + '@bufbuild/protobuf': ^2.2.0 + '@connectrpc/connect': 2.0.0-rc.3 + dependencies: + '@bufbuild/protobuf': 2.2.5 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.5) + dev: false + /@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.10.0): resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==} peerDependencies: @@ -5866,6 +5982,14 @@ packages: '@bufbuild/protobuf': 1.10.0 dev: false + /@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.5): + resolution: {integrity: sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==} + peerDependencies: + '@bufbuild/protobuf': ^2.2.0 + dependencies: + '@bufbuild/protobuf': 2.2.5 + dev: false + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -5983,6 +6107,13 @@ packages: engines: {node: '>=10.0.0'} dev: true + /@e2b/code-interpreter@1.1.0: + resolution: {integrity: sha512-T54U7WS56ou11ytoxlYllBRBM+MYBpOvVZQa1p1qE4KDZBKJd9m1kAA0PqHjy5T6f/tSv4w5wlq4oyExl4QLLA==} + engines: {node: '>=18'} + dependencies: + e2b: 1.2.1 + dev: false + /@effect/platform@0.63.2(@effect/schema@0.72.2)(effect@3.7.2): resolution: {integrity: sha512-b39pVFw0NGo/tXjGShW7Yg0M+kG7bRrFR6+dQ3aIu99ePTkTp6bGb/kDB7n+dXsFFdIqHsQGYESeYcOQngxdFQ==} peerDependencies: @@ -6073,7 +6204,7 @@ packages: '@open-draft/deferred-promise': 2.2.0 '@types/ws': 8.5.12 hono: 4.5.11 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7746,18 +7877,23 @@ packages: eslint-visitor-keys: 3.4.2 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.45.0 + eslint: 8.49.0 eslint-visitor-keys: 3.4.2 + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@eslint-community/regexpp@4.5.1: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} @@ -7776,13 +7912,13 @@ packages: - supports-color dev: true - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.4.0 - espree: 9.6.0 + espree: 9.6.1 globals: 13.19.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -7792,8 +7928,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.49.0: + resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@fal-ai/serverless-client@0.15.0: @@ -8039,18 +8175,18 @@ packages: '@hono/node-server': ^1.11.1 dependencies: '@hono/node-server': 1.12.2(hono@4.5.11) - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) transitivePeerDependencies: - bufferutil - utf-8-validate dev: true - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: @@ -8073,6 +8209,11 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead /@img/sharp-darwin-arm64@0.33.5: resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -8625,7 +8766,7 @@ packages: tar: 7.4.3 tmp-promise: 3.0.3 tslib: 2.6.2 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) transitivePeerDependencies: - bufferutil - encoding @@ -8686,7 +8827,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -8694,7 +8835,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -8767,6 +8908,12 @@ packages: strict-event-emitter: 0.5.1 dev: false + /@neondatabase/serverless@0.9.5: + resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==} + dependencies: + '@types/pg': 8.11.6 + dev: false + /@next/bundle-analyzer@15.0.2: resolution: {integrity: sha512-bV566k+rDsaqXSUgHBof0iMIDx5DWtLx/98jvYtqb9x85e+WJzv+8cpDvbjtxQMf7nFC/LUkPmpruj1cOKfz4A==} dependencies: @@ -9138,7 +9285,7 @@ packages: agent-base: 7.1.1 http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 - lru-cache: 10.0.1 + lru-cache: 10.4.3 socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color @@ -10487,13 +10634,13 @@ packages: /@radix-ui/number@1.0.0: resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@radix-ui/number@1.1.0: @@ -10503,13 +10650,13 @@ packages: /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@radix-ui/primitive@1.1.0: @@ -10548,7 +10695,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10567,7 +10714,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 @@ -10575,6 +10722,29 @@ packages: react-dom: 18.2.0(react@18.3.1) dev: false + /@radix-ui/react-avatar@1.1.3(@types/react-dom@19.0.4)(@types/react@19.0.12)(react-dom@19.0.0)(react@19.0.0): + resolution: {integrity: sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@19.0.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4)(@types/react@19.0.12)(react-dom@19.0.0)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + '@types/react-dom': 19.0.4(@types/react@19.0.12) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + dev: false + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: @@ -10588,7 +10758,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -10609,7 +10779,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-context': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) @@ -10624,7 +10794,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-context': 1.0.0(react@18.3.1) '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.3.1) @@ -10646,7 +10816,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) @@ -10670,7 +10840,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) @@ -10686,7 +10856,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -10695,7 +10865,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.3.1 dev: false @@ -10708,7 +10878,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -10722,7 +10892,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.3.1 dev: false @@ -10736,7 +10906,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -10780,12 +10950,25 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.0.12 + react: 19.0.0 + dev: false + /@radix-ui/react-context@1.0.0(react@18.2.0): resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -10794,7 +10977,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.3.1 dev: false @@ -10807,7 +10990,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -10821,7 +11004,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -10839,6 +11022,19 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-context@1.1.1(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.0.12 + react: 19.0.0 + dev: false + /@radix-ui/react-dialog@1.0.3(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-owNhq36kNPqC2/a+zJRioPg6HHnTn5B/sh/NjTY8r4W9g1L5VJlrzZIVcBr7R9Mg8iLjVmh6MGgMlfoVf/WO/A==} peerDependencies: @@ -10939,7 +11135,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -10948,7 +11144,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.3.1 dev: false @@ -10961,7 +11157,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -10975,7 +11171,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -10999,7 +11195,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) @@ -11022,7 +11218,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) @@ -11047,7 +11243,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) @@ -11072,7 +11268,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) @@ -11089,7 +11285,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -11102,7 +11298,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -11116,7 +11312,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -11127,7 +11323,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) @@ -11148,7 +11344,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0) @@ -11171,7 +11367,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11194,7 +11390,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11217,7 +11413,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -11227,7 +11423,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -11241,7 +11437,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 react: 18.2.0 @@ -11256,7 +11452,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 react: 18.3.1 @@ -11315,7 +11511,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11331,7 +11527,7 @@ packages: '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 - aria-hidden: 1.2.3 + aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.2.0(react@18.3.1) react-remove-scroll: 2.5.5(@types/react@18.3.1)(react@18.3.1) @@ -11343,7 +11539,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@floating-ui/react-dom': 0.7.2(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.2(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) @@ -11373,7 +11569,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@floating-ui/react-dom': 2.0.9(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11403,7 +11599,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@floating-ui/react-dom': 2.0.9(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11426,7 +11622,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11445,7 +11641,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.69 '@types/react-dom': 18.2.7 @@ -11466,7 +11662,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 @@ -11487,7 +11683,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 @@ -11501,7 +11697,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 @@ -11514,7 +11710,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 @@ -11534,7 +11730,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 @@ -11556,7 +11752,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 @@ -11592,7 +11788,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-slot': 1.0.1(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -11604,7 +11800,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-slot': 1.0.1(react@18.3.1) react: 18.3.1 react-dom: 18.2.0(react@18.3.1) @@ -11623,7 +11819,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 '@types/react-dom': 18.2.7 @@ -11644,7 +11840,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 @@ -11692,6 +11888,26 @@ packages: react-dom: 18.2.0(react@18.3.1) dev: false + /@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4)(@types/react@19.0.12)(react-dom@19.0.0)(react@19.0.0): + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + '@types/react-dom': 19.0.4(@types/react@19.0.12) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + dev: false + /@radix-ui/react-progress@1.1.1(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-6diOawA84f/eMxFHcWut0aE1C2kyE9dOyCTQOMRR2C/qPiXz/X0SaiA/RLbapQaXUCmy0/hLMf9meSccD1N0pA==} peerDependencies: @@ -11749,7 +11965,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) @@ -11769,7 +11985,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) @@ -11796,7 +12012,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) @@ -11825,7 +12041,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -11939,7 +12155,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -11949,7 +12165,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -11963,7 +12179,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 react: 18.2.0 @@ -11978,7 +12194,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.69)(react@18.3.1) '@types/react': 18.2.69 react: 18.3.1 @@ -11993,7 +12209,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 react: 18.3.1 @@ -12027,6 +12243,20 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-slot@1.1.2(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.12)(react@19.0.0) + '@types/react': 19.0.12 + react: 19.0.0 + dev: false + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.69)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: @@ -12105,7 +12335,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -12132,7 +12362,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -12180,7 +12410,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -12204,7 +12434,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -12213,7 +12443,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.3.1 dev: false @@ -12226,7 +12456,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -12240,7 +12470,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -12258,12 +12488,25 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.0.12 + react: 19.0.0 + dev: false + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -12273,7 +12516,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 dev: false @@ -12287,7 +12530,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 react: 18.2.0 @@ -12302,7 +12545,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 react: 18.3.1 @@ -12313,7 +12556,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -12327,7 +12570,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 react: 18.2.0 @@ -12342,7 +12585,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 react: 18.3.1 @@ -12353,7 +12596,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -12362,7 +12605,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.3.1 dev: false @@ -12375,7 +12618,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -12389,7 +12632,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.3.1 react: 18.3.1 dev: false @@ -12407,12 +12650,25 @@ packages: react: 18.3.1 dev: false + /@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 19.0.12 + react: 19.0.0 + dev: false + /@radix-ui/react-use-previous@1.0.0(react@18.2.0): resolution: {integrity: sha512-RG2K8z/K7InnOKpq6YLDmT49HGjNmrK+fr82UCVKT2sW0GYfVnYp4wZWBooT/EYfQ5faA9uIjvsuMMhH61rheg==} peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 react: 18.2.0 dev: false @@ -12425,7 +12681,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/react': 18.2.69 react: 18.2.0 dev: false @@ -12435,7 +12691,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/rect': 1.0.0 react: 18.2.0 dev: false @@ -12449,7 +12705,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/rect': 1.0.1 '@types/react': 18.3.1 react: 18.3.1 @@ -12460,7 +12716,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -12474,7 +12730,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.69)(react@18.2.0) '@types/react': 18.2.69 react: 18.2.0 @@ -12489,7 +12745,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@types/react': 18.3.1 react: 18.3.1 @@ -12501,7 +12757,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -12520,7 +12776,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.3.1)(react-dom@18.2.0)(react@18.3.1) '@types/react': 18.3.1 '@types/react-dom': 18.2.7 @@ -12531,13 +12787,13 @@ packages: /@radix-ui/rect@1.0.0: resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /@react-aria/breadcrumbs@3.5.16(react@18.2.0): @@ -12564,7 +12820,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/breadcrumbs': 3.7.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -12579,7 +12835,7 @@ packages: '@react-stately/toggle': 3.7.0(react@18.2.0) '@react-types/button': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -12633,7 +12889,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/calendar': 3.4.3(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -12652,7 +12908,7 @@ packages: '@react-stately/toggle': 3.7.0(react@18.2.0) '@react-types/checkbox': 3.6.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -12720,7 +12976,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/combobox': 3.10.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -12792,7 +13048,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/dialog': 3.5.7(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -12828,7 +13084,7 @@ packages: '@react-stately/dnd': 3.2.7(react@18.2.0) '@react-types/button': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -12966,7 +13222,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-stately/list': 3.10.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13080,7 +13336,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/link': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13112,7 +13368,7 @@ packages: '@react-stately/list': 3.10.2(react@18.2.0) '@react-types/listbox': 3.4.6(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13166,7 +13422,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/menu': 3.9.6(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13214,7 +13470,7 @@ packages: '@react-aria/progress': 3.4.9(react@18.2.0) '@react-types/meter': 3.3.6(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13234,7 +13490,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/numberfield': 3.7.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13276,7 +13532,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/overlays': 3.8.4(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13326,7 +13582,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/progress': 3.5.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13344,7 +13600,7 @@ packages: '@react-stately/radio': 3.10.1(react@18.2.0) '@react-types/radio': 3.7.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13378,7 +13634,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/searchfield': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13417,7 +13673,7 @@ packages: '@react-types/button': 3.9.1(react@18.2.0) '@react-types/select': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13458,7 +13714,7 @@ packages: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-stately/selection': 3.14.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13487,7 +13743,7 @@ packages: dependencies: '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13532,7 +13788,7 @@ packages: '@react-stately/slider': 3.5.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/slider': 3.7.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13574,7 +13830,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13596,7 +13852,7 @@ packages: '@react-aria/toggle': 3.10.0(react@18.2.0) '@react-stately/toggle': 3.7.0(react@18.2.0) '@react-types/switch': 3.5.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13634,7 +13890,7 @@ packages: '@react-types/grid': 3.2.3(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/table': 3.9.2(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13677,7 +13933,7 @@ packages: '@react-stately/tabs': 3.6.3(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/tabs': 3.3.4(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13715,7 +13971,7 @@ packages: '@react-stately/list': 3.10.2(react@18.2.0) '@react-types/button': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -13753,7 +14009,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/textfield': 3.9.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13814,7 +14070,7 @@ packages: '@react-stately/tooltip': 3.4.6(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/tooltip': 3.4.6(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -13879,7 +14135,7 @@ packages: '@react-aria/interactions': 3.20.1(react@18.2.0) '@react-aria/utils': 3.23.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14542,7 +14798,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/calendar': 3.4.3(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14568,7 +14824,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/checkbox': 3.6.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14591,7 +14847,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14618,7 +14874,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/combobox': 3.10.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14645,7 +14901,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14688,7 +14944,7 @@ packages: dependencies: '@react-stately/selection': 3.14.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14770,7 +15026,7 @@ packages: '@react-stately/selection': 3.14.2(react@18.2.0) '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14795,7 +15051,7 @@ packages: '@react-stately/overlays': 3.6.4(react@18.2.0) '@react-types/menu': 3.9.6(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14820,7 +15076,7 @@ packages: '@react-stately/form': 3.0.0(react@18.2.0) '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/numberfield': 3.7.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14868,7 +15124,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/radio': 3.7.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14892,7 +15148,7 @@ packages: dependencies: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/searchfield': 3.5.2(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14917,7 +15173,7 @@ packages: '@react-stately/overlays': 3.6.4(react@18.2.0) '@react-types/select': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14943,7 +15199,7 @@ packages: '@react-stately/collections': 3.10.4(react@18.2.0) '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14967,7 +15223,7 @@ packages: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/slider': 3.7.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -14996,7 +15252,7 @@ packages: '@react-types/grid': 3.2.3(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/table': 3.9.2(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -15025,7 +15281,7 @@ packages: '@react-stately/list': 3.10.2(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) '@react-types/tabs': 3.3.4(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -15048,7 +15304,7 @@ packages: dependencies: '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/checkbox': 3.6.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -15081,7 +15337,7 @@ packages: dependencies: '@react-stately/overlays': 3.6.4(react@18.2.0) '@react-types/tooltip': 3.4.6(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -15094,7 +15350,7 @@ packages: '@react-stately/selection': 3.14.2(react@18.2.0) '@react-stately/utils': 3.9.0(react@18.2.0) '@react-types/shared': 3.22.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.15 react: 18.2.0 dev: false @@ -16186,7 +16442,7 @@ packages: '@babel/core': 7.22.17 '@sentry/babel-plugin-component-annotate': 2.22.2 '@sentry/cli': 2.33.1 - dotenv: 16.4.5 + dotenv: 16.4.7 find-up: 5.0.0 glob: 9.3.5 magic-string: 0.30.8 @@ -16359,7 +16615,7 @@ packages: '@slack/logger': 3.0.0 '@slack/types': 2.8.0 '@types/is-stream': 1.1.0 - '@types/node': 18.19.20 + '@types/node': 20.14.14 axios: 0.27.2 eventemitter3: 3.1.2 form-data: 2.5.1 @@ -17444,18 +17700,18 @@ packages: zod: 3.23.8 dev: false - /@tabler/icons-react@2.40.0(react@18.2.0): - resolution: {integrity: sha512-C+dDOZowFbwI3LGQP0fdua+hOPkGkW7XeMcRXTSdEKc5fD75W6zRO5nXnWivIMRKsi/Y26EDmnQo15N8JX378w==} + /@tabler/icons-react@2.47.0(react@18.2.0): + resolution: {integrity: sha512-iqly2FvCF/qUbgmvS8E40rVeYY7laltc5GUjRxQj59DuX0x/6CpKHTXt86YlI2whg4czvd/c8Ce8YR08uEku0g==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: - '@tabler/icons': 2.40.0 + '@tabler/icons': 2.47.0 prop-types: 15.8.1 react: 18.2.0 dev: false - /@tabler/icons@2.40.0: - resolution: {integrity: sha512-VqKsBSX159cLFTnCzkCmGhZtSPJHNN0lM2sC4xe0HPOfPUnjiex7rDHDdut4oe4iKRecDDpwXwM9BcU6xCPlCg==} + /@tabler/icons@2.47.0: + resolution: {integrity: sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==} dev: false /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.1): @@ -17606,7 +17862,7 @@ packages: '@tailwindcss/node': 4.0.17 '@tailwindcss/oxide': 4.0.17 lightningcss: 1.29.2 - postcss: 8.4.44 + postcss: 8.5.3 tailwindcss: 4.0.17 dev: true @@ -17622,6 +17878,18 @@ packages: tailwindcss: 3.4.1(ts-node@10.9.1) dev: true + /@tailwindcss/typography@0.5.9(tailwindcss@4.0.17): + resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 4.0.17 + dev: true + /@tanstack/react-virtual@3.0.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-tiqKW/e2MJVCr7/pRUXulpkyxllaOclkHNfhKTo4pmHjJIqnhMfwIjc1Q1R0Un3PI3kQywywu/791c8z9u0qeA==} peerDependencies: @@ -17666,7 +17934,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 '@types/aria-query': 5.0.1 aria-query: 5.3.0 chalk: 4.1.2 @@ -17749,7 +18017,7 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /@types/aria-query@5.0.1: @@ -17909,7 +18177,7 @@ packages: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.4.10 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /@types/eslint@8.4.10: resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} @@ -17920,14 +18188,14 @@ packages: /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.5 - dev: true + '@types/estree': 1.0.6 /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -17972,9 +18240,15 @@ packages: /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.3 dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/humanize-duration@3.27.1: resolution: {integrity: sha512-K3e+NZlpCKd6Bd/EIdqjFJRFHbrq5TzPPLwREk5Iv/YoIjQrs6ljdAUCo+Lb2xFlGNOjGSE0dqsVD19cZL137w==} dev: true @@ -18049,9 +18323,15 @@ packages: /@types/mdast@3.0.10: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.3 dev: true + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/mdx@2.0.5: resolution: {integrity: sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==} dev: true @@ -18205,7 +18485,7 @@ packages: /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - '@types/react': 18.2.69 + '@types/react': 18.3.1 /@types/react-dom@19.0.4(@types/react@19.0.12): resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} @@ -18213,7 +18493,6 @@ packages: '@types/react': ^19.0.0 dependencies: '@types/react': 19.0.12 - dev: true /@types/react@18.2.48: resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} @@ -18240,7 +18519,6 @@ packages: resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} dependencies: csstype: 3.1.3 - dev: true /@types/readable-stream@4.0.14: resolution: {integrity: sha512-xZn/AuUbCMShGsqH/ehZtGDwQtbx00M9rZ2ENLe4tOjFZ/JFeWMhEZkk2fEe1jAUqqEAURIkFJ7Az/go8mM1/w==} @@ -18388,7 +18666,9 @@ packages: /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: true + + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} /@types/uuid@10.0.0: resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -18503,7 +18783,7 @@ packages: '@typescript-eslint/scope-manager': 5.59.6 '@typescript-eslint/types': 5.59.6 '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) - debug: 4.3.4 + debug: 4.4.0 eslint: 8.31.0 typescript: 5.5.4 transitivePeerDependencies: @@ -18639,6 +18919,10 @@ packages: - '@codemirror/search' dev: false + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + dev: false + /@unkey/cache@1.5.0: resolution: {integrity: sha512-vqGk9qH3Hn1Nva3hGAaib6G3IcrPkRQ1VgyMFG7asuANZ0RtohONd9RwxXwlaDopJJ66Dsx5rWrV4s/3U1GADg==} dependencies: @@ -18756,6 +19040,17 @@ packages: resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==} dev: true + /@vercel/postgres@0.10.0: + resolution: {integrity: sha512-fSD23DxGND40IzSkXjcFcxr53t3Tiym59Is0jSYIFpG4/0f0KO9SGtcp1sXiebvPaGe7N/tU05cH4yt2S6/IPg==} + engines: {node: '>=18.14'} + dependencies: + '@neondatabase/serverless': 0.9.5 + bufferutil: 4.0.9 + ws: 8.18.0(bufferutil@4.0.9) + transitivePeerDependencies: + - utf-8-validate + dev: false + /@vitest/coverage-v8@3.0.8(vitest@3.0.8): resolution: {integrity: sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==} peerDependencies: @@ -19005,7 +19300,7 @@ packages: '@vue/shared': 3.4.38 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 /@vue/compiler-dom@3.4.38: resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} @@ -19023,8 +19318,8 @@ packages: '@vue/shared': 3.4.38 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.4.44 - source-map-js: 1.2.0 + postcss: 8.5.3 + source-map-js: 1.2.1 /@vue/compiler-ssr@3.4.38: resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} @@ -19477,30 +19772,27 @@ packages: jsondiffpatch: 0.6.0 react: 18.3.1 zod: 3.23.8 - zod-to-json-schema: 3.24.3(zod@3.23.8) + zod-to-json-schema: 3.24.5(zod@3.23.8) dev: false - /ai@4.0.2(react@18.3.1)(zod@3.23.8): - resolution: {integrity: sha512-Dj17cVKCM+FgsJIAhYv7zT4YsrK3noFsLUxJOnTCVIHhmiNrl6/M6ebwQUOukLR/P2PbVzUQpHzdTvGck2b05Q==} + /ai@4.2.5(react@18.3.1)(zod@3.23.8): + resolution: {integrity: sha512-URJEslI3cgF/atdTJHtz+Sj0W1JTmiGmD3znw9KensL3qV605odktDim+GTazNJFPR4QaIu1lUio5b8RymvOjA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.0.0 + zod: ^3.23.8 peerDependenciesMeta: react: optional: true - zod: - optional: true dependencies: - '@ai-sdk/provider': 1.0.0 - '@ai-sdk/provider-utils': 2.0.1(zod@3.23.8) - '@ai-sdk/react': 1.0.1(react@18.3.1)(zod@3.23.8) - '@ai-sdk/ui-utils': 1.0.1(zod@3.23.8) + '@ai-sdk/provider': 1.1.0 + '@ai-sdk/provider-utils': 2.2.1(zod@3.23.8) + '@ai-sdk/react': 1.2.2(react@18.3.1)(zod@3.23.8) + '@ai-sdk/ui-utils': 1.2.1(zod@3.23.8) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 react: 18.3.1 zod: 3.23.8 - zod-to-json-schema: 3.24.3(zod@3.23.8) dev: true /ai@4.2.5(react@19.0.0)(zod@3.23.8): @@ -19672,7 +19964,7 @@ packages: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} dependencies: - glob: 10.3.10 + glob: 10.4.5 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -19728,6 +20020,13 @@ packages: tslib: 2.6.2 dev: false + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + dependencies: + tslib: 2.8.1 + dev: false + /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: @@ -19933,7 +20232,7 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /autoprefixer@10.4.13(postcss@8.4.44): + /autoprefixer@10.4.13(postcss@8.5.3): resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -19945,7 +20244,7 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.44 + postcss: 8.5.3 postcss-value-parser: 4.2.0 dev: true @@ -19956,9 +20255,9 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001699 - fraction.js: 4.2.0 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 + fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.4.35 @@ -19969,8 +20268,8 @@ packages: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001699 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001707 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -20169,7 +20468,6 @@ packages: /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -20318,6 +20616,12 @@ packages: dependencies: fill-range: 7.0.1 + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + /breakword@1.0.5: resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} dependencies: @@ -20346,21 +20650,21 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) + dev: false /browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 electron-to-chromium: 1.5.98 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) - dev: true /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -20385,6 +20689,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.8.4 + /buildcheck@0.0.6: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} @@ -20496,8 +20807,8 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 - glob: 10.3.10 - lru-cache: 10.0.1 + glob: 10.4.5 + lru-cache: 10.4.3 minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 @@ -20582,6 +20893,10 @@ packages: /caniuse-lite@1.0.30001699: resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + dev: false + + /caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -20603,7 +20918,6 @@ packages: /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: true /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} @@ -20692,19 +21006,15 @@ packages: /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true /character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true /character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -20750,7 +21060,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -21050,7 +21360,6 @@ packages: /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -21091,6 +21400,10 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true + /compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + dev: false + /component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} dev: true @@ -21235,13 +21548,13 @@ packages: /core-js-compat@3.27.1: resolution: {integrity: sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==} dependencies: - browserslist: 4.23.3 + browserslist: 4.24.4 dev: true /core-js-compat@3.36.0: resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} dependencies: - browserslist: 4.23.3 + browserslist: 4.24.4 dev: true /core-util-is@1.0.2: @@ -21336,7 +21649,7 @@ packages: cp-file: 10.0.0 globby: 13.2.2 junk: 4.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 nested-error-stacks: 2.1.1 p-filter: 3.0.0 p-map: 6.0.0 @@ -21472,7 +21785,7 @@ packages: engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 /css-unit-converter@1.1.2: resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} @@ -21758,7 +22071,6 @@ packages: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 - dev: true /decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} @@ -21919,6 +22231,7 @@ packages: /detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + requiresBuild: true /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -21934,6 +22247,12 @@ packages: minimist: 1.2.7 dev: false + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /devtools-protocol@0.0.1342118: resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} dev: false @@ -22059,7 +22378,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 csstype: 3.1.3 dev: false @@ -22110,6 +22429,10 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + /dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + /dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -22147,6 +22470,18 @@ packages: stream-shift: 1.0.1 dev: true + /e2b@1.2.1: + resolution: {integrity: sha512-ii/Bw55ecxgORqkArKNbuVTwqLgVZ0rH1X3J/NOe4LMZaVETm3qNpPBjoPkpQAsQjw2ew0Ad2sd54epqm9nLCw==} + engines: {node: '>=18'} + dependencies: + '@bufbuild/protobuf': 2.2.5 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.5) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.2.5)(@connectrpc/connect@2.0.0-rc.3) + compare-versions: 6.1.1 + openapi-fetch: 0.9.8 + platform: 1.3.6 + dev: false + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -22187,10 +22522,10 @@ packages: /electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + dev: false /electron-to-chromium@1.5.98: resolution: {integrity: sha512-bI/LbtRBxU2GzK7KK5xxFd2y9Lf9XguHooPYbcXWy6wUoT8NMnffsvRhPmSeUHLSDKAEtKuTaEtK4Ms15zkIEA==} - dev: true /email-reply-parser@1.8.0: resolution: {integrity: sha512-hiie/4vNxT5NYBux8m/jZccUQdtQqiq5ytwJwbA9QIkTWbTNPQasJXfsfdetZo23hBn4ZJleRDyOA5nV4+ssSQ==} @@ -22987,22 +23322,22 @@ packages: eslint: 8.31.0 dev: true - /eslint-config-prettier@9.0.0(eslint@8.45.0): + /eslint-config-prettier@9.0.0(eslint@8.49.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.45.0 + eslint: 8.49.0 dev: false - /eslint-config-turbo@1.10.12(eslint@8.45.0): + /eslint-config-turbo@1.10.12(eslint@8.49.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.45.0 - eslint-plugin-turbo: 1.10.12(eslint@8.45.0) + eslint: 8.49.0 + eslint-plugin-turbo: 1.10.12(eslint@8.49.0) dev: false /eslint-import-resolver-node@0.3.7: @@ -23274,13 +23609,13 @@ packages: - typescript dev: true - /eslint-plugin-turbo@1.10.12(eslint@8.45.0): + /eslint-plugin-turbo@1.10.12(eslint@8.49.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.45.0 + eslint: 8.49.0 dev: false /eslint-plugin-turbo@2.0.5(eslint@8.31.0): @@ -23292,13 +23627,13 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-turbo@2.0.5(eslint@8.45.0): + /eslint-plugin-turbo@2.0.5(eslint@8.49.0): resolution: {integrity: sha512-nCTXZdaKmdRybBdjnMrDFG+ppLc9toUqB01Hf0pfhkQw8OoC29oJIVPsCSvuL/W58RKD02CNEUrwnVt57t36IQ==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.45.0 + eslint: 8.49.0 dev: true /eslint-scope@5.1.1: @@ -23316,8 +23651,8 @@ packages: estraverse: 5.3.0 dev: true - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -23359,6 +23694,10 @@ packages: resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint@8.31.0: resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -23407,17 +23746,17 @@ packages: - supports-color dev: true - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + /eslint@8.49.0: + resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.49.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -23426,9 +23765,9 @@ packages: debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.2 - espree: 9.6.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -23469,6 +23808,15 @@ packages: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.2 + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -23505,7 +23853,7 @@ packages: /estree-util-attach-comments@2.1.0: resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /estree-util-build-jsx@2.2.2: @@ -23524,6 +23872,10 @@ packages: resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==} dev: true + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: @@ -23556,7 +23908,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -23605,6 +23957,7 @@ packages: /eventsource-parser@3.0.0: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} + dev: false /eventsource@3.0.5: resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} @@ -23819,7 +24172,17 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -23945,6 +24308,12 @@ packages: dependencies: to-regex-range: 5.0.1 + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} @@ -24028,7 +24397,7 @@ packages: /find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 pkg-dir: 4.2.0 dev: false @@ -24145,6 +24514,11 @@ packages: /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false /framer-motion@10.12.11(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uNsJAc/BQZ9V7tYgzRBXSrEdB+YrdJTtRvgn+8lNAQucGKaINJBL8I4aqXxXdw+HzwJZb/uR955jnOrxBy5sTA==} @@ -24468,7 +24842,7 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.5 minipass: 7.1.2 path-scurry: 1.10.1 @@ -24479,7 +24853,7 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.5 minipass: 7.1.2 path-scurry: 1.10.1 dev: false @@ -24494,7 +24868,6 @@ packages: minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 - dev: true /glob@11.0.0: resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} @@ -24550,7 +24923,7 @@ packages: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.10.1 + path-scurry: 1.11.1 dev: false /global-dirs@3.0.1: @@ -24586,7 +24959,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.3 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -24596,7 +24969,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.3 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -24807,7 +25180,7 @@ packages: /hast-util-to-estree@2.1.0: resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.0 '@types/hast': 2.3.4 '@types/unist': 2.0.6 @@ -24826,10 +25199,38 @@ packages: - supports-color dev: true + /hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: true + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: false + /header-generator@2.1.55: resolution: {integrity: sha512-UeR5q/hGY6o78wH9T5hBIdhTQ7kraw90jb+bhAuvcpEI6aEfzguYhNf33uxT2qbnOoSg8hFd0YCJtiEqujMPRg==} engines: {node: '>=16.0.0'} @@ -24891,6 +25292,10 @@ packages: selderee: 0.11.0 dev: false + /html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + dev: false + /htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: @@ -25121,6 +25526,10 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: true + /inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + dev: false + /inline-style-prefixer@6.0.4: resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} dependencies: @@ -25216,14 +25625,12 @@ packages: /is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true /is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - dev: true /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} @@ -25316,7 +25723,6 @@ packages: /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true /is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} @@ -25370,7 +25776,6 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} @@ -25443,7 +25848,6 @@ packages: /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - dev: true /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} @@ -25457,7 +25861,7 @@ packages: /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -25598,7 +26002,7 @@ packages: peerDependencies: ws: '*' dependencies: - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) dev: false /isstream@0.1.2: @@ -25652,7 +26056,6 @@ packages: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true /jackspeak@4.0.1: resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} @@ -26203,7 +26606,6 @@ packages: /lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -26376,7 +26778,6 @@ packages: /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -26410,13 +26811,8 @@ packages: engines: {node: '>=8'} dev: true - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - /lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - dev: true /lru-cache@11.0.0: resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} @@ -26471,6 +26867,14 @@ packages: react: 19.0.0 dev: false + /lucide-react@0.486.0(react@19.0.0): + resolution: {integrity: sha512-xWop/wMsC1ikiEVLZrxXjPKw4vU/eAip33G2mZHgbWnr4Nr5Rt4Vx4s/q1D3B/rQVbxjOuqASkEZcUxDEKzecw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 19.0.0 + dev: false + /luxon@3.2.1: resolution: {integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==} engines: {node: '>=12'} @@ -26517,7 +26921,7 @@ packages: dependencies: '@babel/parser': 7.26.8 '@babel/types': 7.26.8 - source-map-js: 1.2.0 + source-map-js: 1.2.1 dev: true /make-dir@3.1.0: @@ -26669,6 +27073,25 @@ packages: - supports-color dev: true + /mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-frontmatter@1.0.0: resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} dependencies: @@ -26687,6 +27110,19 @@ packages: - supports-color dev: true + /mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-mdx-jsx@2.1.4: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: @@ -26706,6 +27142,25 @@ packages: - supports-color dev: true + /mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.0 + stringify-entities: 4.0.3 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-mdx@2.0.1: resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: @@ -26730,6 +27185,19 @@ packages: - supports-color dev: true + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.0 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-phrasing@3.0.0: resolution: {integrity: sha512-S+QYsDRLkGi8U7o5JF1agKa/sdP+CNGXXLqC17pdTVL8FHHgQEiwFGa9yE5aYtUxNiFGYoaDy9V1kC85Sz86Gg==} dependencies: @@ -26737,6 +27205,13 @@ packages: unist-util-is: 5.1.1 dev: true + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + dev: false + /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: @@ -26750,6 +27225,20 @@ packages: unist-util-visit: 4.1.2 dev: true + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: false + /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: @@ -26763,10 +27252,30 @@ packages: zwitch: 2.0.4 dev: true + /mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + /mdast-util-to-string@3.1.0: resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} dev: true + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.4 + dev: false + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: false @@ -26777,7 +27286,7 @@ packages: /media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: true /media-typer@0.3.0: @@ -26856,6 +27365,27 @@ packages: uvu: 0.5.6 dev: true + /micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-extension-frontmatter@1.0.0: resolution: {integrity: sha512-EXjmRnupoX6yYuUJSQhrQ9ggK0iQtQlpi6xeJzVD5xscyAI+giqco5fdymayZhJMbIFecjnE2yz85S9NzIgQpg==} dependencies: @@ -26930,6 +27460,14 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-factory-label@1.0.2: resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} dependencies: @@ -26939,6 +27477,15 @@ packages: uvu: 0.5.6 dev: true + /micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-factory-mdx-expression@1.0.6: resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==} dependencies: @@ -26959,6 +27506,13 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-factory-title@1.0.2: resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} dependencies: @@ -26969,6 +27523,15 @@ packages: uvu: 0.5.6 dev: true + /micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-factory-whitespace@1.0.0: resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} dependencies: @@ -26978,6 +27541,15 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-util-character@1.1.0: resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} dependencies: @@ -26985,12 +27557,25 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-util-chunked@1.0.0: resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} dependencies: micromark-util-symbol: 1.0.1 dev: true + /micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + /micromark-util-classify-character@1.0.0: resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} dependencies: @@ -26999,6 +27584,14 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-util-combine-extensions@1.0.0: resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} dependencies: @@ -27006,12 +27599,25 @@ packages: micromark-util-types: 1.0.2 dev: true + /micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-util-decode-numeric-character-reference@1.0.0: resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} dependencies: micromark-util-symbol: 1.0.1 dev: true + /micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + /micromark-util-decode-string@1.0.2: resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} dependencies: @@ -27021,15 +27627,28 @@ packages: micromark-util-symbol: 1.0.1 dev: true + /micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + dev: false + /micromark-util-encode@1.0.1: resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} dev: true + /micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + dev: false + /micromark-util-events-to-acorn@1.2.0: resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-util-visit: 1.2.0 micromark-util-types: 1.0.2 uvu: 0.5.6 @@ -27041,18 +27660,34 @@ packages: resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} dev: true + /micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + dev: false + /micromark-util-normalize-identifier@1.0.0: resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} dependencies: micromark-util-symbol: 1.0.1 dev: true + /micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + dependencies: + micromark-util-symbol: 2.0.1 + dev: false + /micromark-util-resolve-all@1.0.0: resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} dependencies: micromark-util-types: 1.0.2 dev: true + /micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + dependencies: + micromark-util-types: 2.0.2 + dev: false + /micromark-util-sanitize-uri@1.1.0: resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} dependencies: @@ -27061,6 +27696,14 @@ packages: micromark-util-symbol: 1.0.1 dev: true + /micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + dev: false + /micromark-util-subtokenize@1.0.2: resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} dependencies: @@ -27070,14 +27713,31 @@ packages: uvu: 0.5.6 dev: true + /micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: false + /micromark-util-symbol@1.0.1: resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} dev: true + /micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + dev: false + /micromark-util-types@1.0.2: resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} dev: true + /micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + dev: false + /micromark@3.1.0: resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} dependencies: @@ -27102,6 +27762,30 @@ packages: - supports-color dev: true + /micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -27109,6 +27793,13 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -27184,7 +27875,7 @@ packages: stoppable: 1.1.0 undici: 5.28.4 workerd: 1.20240806.0 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) youch: 3.3.3 zod: 3.23.8 transitivePeerDependencies: @@ -27238,13 +27929,13 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -27515,6 +28206,7 @@ packages: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /nanoid@5.0.6: resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} @@ -27528,6 +28220,12 @@ packages: hasBin: true dev: false + /nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -27579,7 +28277,7 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -27667,7 +28365,7 @@ packages: '@playwright/test': 1.37.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.0.0-rc.0 @@ -27714,7 +28412,7 @@ packages: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -27807,6 +28505,10 @@ packages: engines: {node: '>= 6.13.0'} dev: false + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + /node-gyp@10.2.0: resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} engines: {node: ^16.14.0 || >=18.0.0} @@ -27814,7 +28516,7 @@ packages: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 - glob: 10.3.10 + glob: 10.4.5 graceful-fs: 4.2.11 make-fetch-happen: 13.0.1 nopt: 7.2.0 @@ -27832,10 +28534,10 @@ packages: /node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + dev: false /node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - dev: true /nodemailer@6.9.16: resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} @@ -28251,6 +28953,16 @@ packages: - encoding dev: false + /openapi-fetch@0.9.8: + resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + dependencies: + openapi-typescript-helpers: 0.0.8 + dev: false + + /openapi-typescript-helpers@0.0.8: + resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} + dev: false + /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true @@ -28529,7 +29241,6 @@ packages: /package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - dev: true /package-json@6.5.0: resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} @@ -28566,7 +29277,6 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: true /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} @@ -28657,7 +29367,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.1 + lru-cache: 10.4.3 minipass: 7.1.2 /path-scurry@1.11.1: @@ -28666,7 +29376,6 @@ packages: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 - dev: true /path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} @@ -28754,7 +29463,7 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.1 @@ -28911,6 +29620,10 @@ packages: mlly: 1.7.1 pathe: 1.1.2 + /platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + dev: false + /playwright-core@1.37.0: resolution: {integrity: sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==} engines: {node: '>=16'} @@ -28962,13 +29675,24 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 - /postcss-import@16.0.1(postcss@8.4.44): + /postcss-import@15.1.0(postcss@8.5.3): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + /postcss-import@16.0.1(postcss@8.5.3): resolution: {integrity: sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g==} engines: {node: '>=18.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.44 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.4 @@ -28990,6 +29714,15 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.44 + /postcss-js@4.0.1(postcss@8.5.3): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + /postcss-load-config@4.0.1(postcss@8.4.29)(ts-node@10.9.1): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} @@ -29025,7 +29758,23 @@ packages: ts-node: 10.9.1(@swc/core@1.3.26)(@types/node@20.14.14)(typescript@5.5.4) yaml: 2.3.1 - /postcss-load-config@6.0.1(postcss@8.4.44)(tsx@4.17.0): + /postcss-load-config@4.0.2(postcss@8.5.3): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.3 + postcss: 8.5.3 + yaml: 2.7.1 + + /postcss-load-config@6.0.1(postcss@8.5.3)(tsx@4.17.0): resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} peerDependencies: @@ -29044,11 +29793,11 @@ packages: optional: true dependencies: lilconfig: 3.1.3 - postcss: 8.4.44 + postcss: 8.5.3 tsx: 4.17.0 dev: true - /postcss-loader@8.1.1(postcss@8.4.44)(typescript@5.5.4)(webpack@5.88.2): + /postcss-loader@8.1.1(postcss@8.5.3)(typescript@5.5.4)(webpack@5.88.2): resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -29063,7 +29812,7 @@ packages: dependencies: cosmiconfig: 9.0.0(typescript@5.5.4) jiti: 1.21.0 - postcss: 8.4.44 + postcss: 8.5.3 semver: 7.6.3 webpack: 5.88.2(@swc/core@1.3.26)(esbuild@0.15.18) transitivePeerDependencies: @@ -29096,7 +29845,7 @@ packages: dependencies: icss-utils: 5.1.0(postcss@8.4.29) postcss: 8.4.29 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 dev: true @@ -29108,7 +29857,7 @@ packages: dependencies: icss-utils: 5.1.0(postcss@8.4.35) postcss: 8.4.35 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 dev: true @@ -29119,7 +29868,7 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.29 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 dev: true /postcss-modules-scope@3.1.1(postcss@8.4.35): @@ -29129,7 +29878,7 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 dev: true /postcss-modules-values@4.0.0(postcss@8.4.29): @@ -29172,7 +29921,7 @@ packages: resolution: {integrity: sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==} dependencies: postcss: 7.0.39 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 dev: false /postcss-nested@6.0.1(postcss@8.4.44): @@ -29182,7 +29931,16 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.44 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 + + /postcss-nested@6.2.0(postcss@8.5.3): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 /postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -29199,6 +29957,13 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + /postcss-value-parser@3.3.1: resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} dev: false @@ -29236,9 +30001,9 @@ packages: resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.7 + nanoid: 3.3.11 picocolors: 1.1.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 dev: true /postcss@8.4.31: @@ -29247,16 +30012,16 @@ packages: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 dev: false /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.7 + nanoid: 3.3.11 picocolors: 1.1.1 - source-map-js: 1.2.0 + source-map-js: 1.2.1 /postcss@8.4.44: resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} @@ -29266,6 +30031,14 @@ packages: picocolors: 1.1.1 source-map-js: 1.2.0 + /postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -29426,7 +30199,7 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.1.0 + react-is: 18.3.1 dev: true /pretty-hrtime@1.0.3: @@ -29587,6 +30360,10 @@ packages: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: true + /property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + dev: false + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false @@ -29681,7 +30458,7 @@ packages: debug: 4.4.0 devtools-protocol: 0.0.1342118 typed-query-selector: 2.12.0 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9) transitivePeerDependencies: - bufferutil - supports-color @@ -29718,7 +30495,7 @@ packages: commander: 5.1.0 glob: 7.2.3 postcss: 7.0.32 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 dev: false /qs@6.11.0: @@ -29972,7 +30749,7 @@ packages: scheduler: 0.25.0-rc.1 dev: false - /react-email@2.1.2(eslint@8.45.0): + /react-email@2.1.2(eslint@8.49.0): resolution: {integrity: sha512-HBHhpzEE5es9YUoo7VSj6qy1omjwndxf3/Sb44UJm/uJ2AjmqALo2yryux0CjW9QAVfitc9rxHkLvIb9H87QQw==} engines: {node: '>=18.0.0'} hasBin: true @@ -29998,8 +30775,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@8.45.0) - eslint-config-turbo: 1.10.12(eslint@8.45.0) + eslint-config-prettier: 9.0.0(eslint@8.49.0) + eslint-config-turbo: 1.10.12(eslint@8.49.0) framer-motion: 10.17.4(react-dom@18.2.0)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -30087,10 +30864,33 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true - /react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true + /react-markdown@10.1.0(@types/react@19.0.12)(react@19.0.0): + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.0.12 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /react-merge-refs@2.1.1: resolution: {integrity: sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==} dev: false @@ -30120,35 +30920,35 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.69)(react@18.2.0): - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + /react-remove-scroll-bar@2.3.8(@types/react@18.2.69)(react@18.2.0): + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: '@types/react': 18.2.69 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.69)(react@18.2.0) + react-style-singleton: 2.2.3(@types/react@18.2.69)(react@18.2.0) tslib: 2.8.1 dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + /react-remove-scroll-bar@2.3.8(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true dependencies: '@types/react': 18.3.1 react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.1)(react@18.3.1) tslib: 2.8.1 dev: false @@ -30164,11 +30964,11 @@ packages: dependencies: '@types/react': 18.2.69 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.69)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.69)(react@18.2.0) + react-remove-scroll-bar: 2.3.8(@types/react@18.2.69)(react@18.2.0) + react-style-singleton: 2.2.3(@types/react@18.2.69)(react@18.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.0(@types/react@18.2.69)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.69)(react@18.2.0) + use-callback-ref: 1.3.3(@types/react@18.2.69)(react@18.2.0) + use-sidecar: 1.1.3(@types/react@18.2.69)(react@18.2.0) dev: false /react-remove-scroll@2.5.5(@types/react@18.3.1)(react@18.3.1): @@ -30183,11 +30983,11 @@ packages: dependencies: '@types/react': 18.3.1 react: 18.3.1 - react-remove-scroll-bar: 2.3.4(@types/react@18.3.1)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) + react-remove-scroll-bar: 2.3.8(@types/react@18.3.1)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.1)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.0(@types/react@18.3.1)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@18.3.1)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.1)(react@18.3.1) dev: false /react-resizable-panels@2.0.9(react-dom@18.2.0)(react@18.2.0): @@ -30265,36 +31065,34 @@ packages: react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.69)(react@18.2.0): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + /react-style-singleton@2.2.3(@types/react@18.2.69)(react@18.2.0): + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true dependencies: '@types/react': 18.2.69 get-nonce: 1.0.1 - invariant: 2.2.4 react: 18.2.0 tslib: 2.8.1 dev: false - /react-style-singleton@2.2.1(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + /react-style-singleton@2.2.3(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true dependencies: '@types/react': 18.3.1 get-nonce: 1.0.1 - invariant: 2.2.4 react: 18.3.1 tslib: 2.8.1 dev: false @@ -30305,7 +31103,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -30592,7 +31390,7 @@ packages: /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: true /regexp-to-ast@0.5.0: @@ -30701,6 +31499,17 @@ packages: - supports-color dev: true + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + dev: false + /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: @@ -30710,6 +31519,16 @@ packages: unified: 10.1.2 dev: true + /remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + dev: false + /remix-auth-email-link@2.0.2(@remix-run/server-runtime@2.1.0)(remix-auth@3.6.0): resolution: {integrity: sha512-Lze9c50fsqBpixXQKe37wI2Dm4rlYYkNA6Eskxk8erQ7tbyN8xiFXOgo7Y3Al0SSjzkezw8au3uc2vCLJ8A5mQ==} peerDependencies: @@ -31104,7 +31923,7 @@ packages: /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /run-applescript@7.0.0: @@ -31747,6 +32566,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -31780,7 +32603,6 @@ packages: /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} @@ -32083,7 +32905,6 @@ packages: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -32162,12 +32983,24 @@ packages: resolution: {integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==} dev: false + /style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + dependencies: + style-to-object: 1.0.8 + dev: false + /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} dependencies: inline-style-parser: 0.1.1 dev: true + /style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + dependencies: + inline-style-parser: 0.2.4 + dev: false + /styled-jsx@5.1.1(@babel/core@7.24.5)(react@19.0.0-rc.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -32244,12 +33077,11 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.5 ts-interface-checker: 0.1.13 - dev: true /superagent@9.0.2: resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} @@ -32420,7 +33252,7 @@ packages: /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.7 dev: false /tailwind-merge@2.5.3: @@ -32431,6 +33263,10 @@ packages: resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} dev: false + /tailwind-merge@3.1.0: + resolution: {integrity: sha512-aV27Oj8B7U/tAOMhJsSGdWqelfmudnGMdXIlMnk1JfsjwSjts6o8HyfN7SFH3EztzH4YH8kk6GbLTHzITJO39Q==} + dev: false + /tailwind-scrollbar-hide@1.1.7: resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==} dev: false @@ -32457,7 +33293,7 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: - tailwindcss: 3.4.1(ts-node@10.9.1) + tailwindcss: 3.4.1 dev: false /tailwindcss-textshadow@2.1.3: @@ -32473,7 +33309,7 @@ packages: dependencies: '@fullhuman/postcss-purgecss': 2.3.0 autoprefixer: 9.8.8 - browserslist: 4.23.3 + browserslist: 4.24.4 bytes: 3.1.2 chalk: 4.1.2 color: 3.2.1 @@ -32488,7 +33324,7 @@ packages: postcss-functions: 3.0.0 postcss-js: 2.0.3 postcss-nested: 4.2.3 - postcss-selector-parser: 6.0.11 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 pretty-hrtime: 1.0.3 reduce-css-calc: 2.1.8 @@ -32505,27 +33341,57 @@ packages: chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.1 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.6 lilconfig: 2.1.0 - micromatch: 4.0.5 + micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.44 - postcss-import: 15.1.0(postcss@8.4.44) - postcss-js: 4.0.1(postcss@8.4.44) - postcss-load-config: 4.0.1(postcss@8.4.44)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.44) - postcss-selector-parser: 6.0.11 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 resolve: 1.22.8 - sucrase: 3.32.0 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node dev: false + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + /tailwindcss@3.4.1(ts-node@10.9.1): resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} engines: {node: '>=14.0.0'} @@ -33033,7 +33899,6 @@ packages: /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: true /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} @@ -33042,7 +33907,6 @@ packages: /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: true /trouter@2.0.1: resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} @@ -33252,7 +34116,7 @@ packages: /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - /tsup@8.4.0(postcss@8.4.44)(tsx@4.17.0)(typescript@5.5.4): + /tsup@8.4.0(postcss@8.5.3)(tsx@4.17.0)(typescript@5.5.4): resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} engines: {node: '>=18'} hasBin: true @@ -33279,8 +34143,8 @@ packages: esbuild: 0.25.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss: 8.4.44 - postcss-load-config: 6.0.1(postcss@8.4.44)(tsx@4.17.0) + postcss: 8.5.3 + postcss-load-config: 6.0.1(postcss@8.5.3)(tsx@4.17.0) resolve-from: 5.0.0 rollup: 4.36.0 source-map: 0.8.0-beta.0 @@ -33328,6 +34192,17 @@ packages: fsevents: 2.3.3 dev: true + /tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.25.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tsx@4.7.1: resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} engines: {node: '>=18.0.0'} @@ -33631,7 +34506,7 @@ packages: cli-highlight: 2.1.11 dayjs: 1.11.13 debug: 4.3.4 - dotenv: 16.4.5 + dotenv: 16.4.7 glob: 10.3.10 mkdirp: 2.1.6 pg: 8.11.5 @@ -33770,6 +34645,18 @@ packages: vfile: 5.3.7 dev: true + /unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.3 + dev: false + /unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -33797,6 +34684,12 @@ packages: resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-position-from-estree@1.1.1: resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==} dependencies: @@ -33809,6 +34702,12 @@ packages: '@types/unist': 2.0.6 dev: true + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-remove-position@4.0.1: resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==} dependencies: @@ -33822,6 +34721,12 @@ packages: '@types/unist': 2.0.6 dev: true + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /unist-util-visit-parents@5.1.1: resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} dependencies: @@ -33829,6 +34734,13 @@ packages: unist-util-is: 5.1.1 dev: true + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + dev: false + /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: @@ -33837,6 +34749,14 @@ packages: unist-util-visit-parents: 5.1.1 dev: true + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universal-cookie@7.2.0: resolution: {integrity: sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==} dependencies: @@ -33891,6 +34811,7 @@ packages: browserslist: 4.23.3 escalade: 3.2.0 picocolors: 1.1.1 + dev: false /update-browserslist-db@1.1.2(browserslist@4.24.4): resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} @@ -33901,7 +34822,6 @@ packages: browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 - dev: true /uploadthing@7.1.0(next@14.2.21)(tailwindcss@3.4.1): resolution: {integrity: sha512-l1bRHs+q/YLx3XwBav98t4Bl1wLWaskhPEwopxtYgiRrxX5nW3uUuSP0RJ9eKwx0+6ZhHWxHDvShf7ZLledqmQ==} @@ -33930,7 +34850,7 @@ packages: '@uploadthing/shared': 7.0.3 effect: 3.7.2 next: 14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.37.0)(react-dom@18.2.0)(react@18.3.1) - tailwindcss: 3.4.1(ts-node@10.9.1) + tailwindcss: 3.4.1 dev: false /uri-js@4.4.1: @@ -33960,12 +34880,12 @@ packages: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} dev: false - /use-callback-ref@1.3.0(@types/react@18.2.69)(react@18.2.0): - resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + /use-callback-ref@1.3.3(@types/react@18.2.69)(react@18.2.0): + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -33975,12 +34895,12 @@ packages: tslib: 2.8.1 dev: false - /use-callback-ref@1.3.0(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + /use-callback-ref@1.3.3(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -34003,12 +34923,12 @@ packages: react: 18.2.0 dev: false - /use-sidecar@1.1.2(@types/react@18.2.69)(react@18.2.0): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + /use-sidecar@1.1.3(@types/react@18.2.69)(react@18.2.0): + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -34019,12 +34939,12 @@ packages: tslib: 2.8.1 dev: false - /use-sidecar@1.1.2(@types/react@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + /use-sidecar@1.1.3(@types/react@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -34183,6 +35103,13 @@ packages: unist-util-stringify-position: 3.0.2 dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + dev: false + /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: @@ -34192,6 +35119,13 @@ packages: vfile-message: 3.1.3 dev: true + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + dev: false + /victory-vendor@36.6.11: resolution: {integrity: sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==} dependencies: @@ -34357,7 +35291,7 @@ packages: dependencies: '@types/node': 20.14.14 esbuild: 0.16.17 - postcss: 8.4.44 + postcss: 8.5.3 resolve: 1.22.8 rollup: 3.10.0 optionalDependencies: @@ -34394,7 +35328,7 @@ packages: dependencies: '@types/node': 20.14.14 esbuild: 0.18.11 - postcss: 8.4.44 + postcss: 8.5.3 rollup: 3.29.1 optionalDependencies: fsevents: 2.3.3 @@ -34430,7 +35364,7 @@ packages: dependencies: '@types/node': 20.14.14 esbuild: 0.20.2 - postcss: 8.4.44 + postcss: 8.5.3 rollup: 4.13.2 optionalDependencies: fsevents: 2.3.3 @@ -34826,13 +35760,13 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.11.5 '@webassemblyjs/wasm-edit': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 acorn: 8.12.1 acorn-import-assertions: 1.9.0(acorn@8.12.1) - browserslist: 4.23.3 + browserslist: 4.24.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.18.1 es-module-lexer: 1.3.1 @@ -34866,13 +35800,13 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.11.5 '@webassemblyjs/wasm-edit': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 acorn: 8.12.1 acorn-import-assertions: 1.9.0(acorn@8.12.1) - browserslist: 4.23.3 + browserslist: 4.24.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.18.1 es-module-lexer: 1.3.1 @@ -35036,7 +35970,7 @@ packages: date-fns: 3.6.0 esbuild: 0.17.19 miniflare: 3.20240806.0 - nanoid: 3.3.7 + nanoid: 3.3.11 path-to-regexp: 6.2.1 resolve: 1.22.8 resolve.exports: 2.0.2 @@ -35132,7 +36066,7 @@ packages: optional: true dev: false - /ws@8.18.0: + /ws@8.18.0(bufferutil@4.0.9): resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -35143,6 +36077,8 @@ packages: optional: true utf-8-validate: optional: true + dependencies: + bufferutil: 4.0.9 /xdg-app-paths@8.3.0: resolution: {integrity: sha512-mgxlWVZw0TNWHoGmXq+NC3uhCIc55dDpAlDkMQUaIAcQzysb0kxctwv//fvuW61/nAAeUBJMQ8mnZjMmuYwOcQ==} @@ -35210,6 +36146,11 @@ packages: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + /yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -35352,7 +36293,6 @@ packages: zod: ^3.24.1 dependencies: zod: 3.23.8 - dev: false /zod-validation-error@1.5.0(zod@3.23.8): resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} @@ -35388,4 +36328,3 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true diff --git a/references/d3-demo/.gitignore b/references/d3-chat/.gitignore similarity index 100% rename from references/d3-demo/.gitignore rename to references/d3-chat/.gitignore diff --git a/references/d3-demo/README.md b/references/d3-chat/README.md similarity index 100% rename from references/d3-demo/README.md rename to references/d3-chat/README.md diff --git a/references/d3-demo/components.json b/references/d3-chat/components.json similarity index 100% rename from references/d3-demo/components.json rename to references/d3-chat/components.json diff --git a/references/d3-demo/next.config.ts b/references/d3-chat/next.config.ts similarity index 100% rename from references/d3-demo/next.config.ts rename to references/d3-chat/next.config.ts diff --git a/references/d3-chat/package.json b/references/d3-chat/package.json new file mode 100644 index 0000000000..30527c797f --- /dev/null +++ b/references/d3-chat/package.json @@ -0,0 +1,56 @@ +{ + "name": "d3-chat", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "dev:trigger": "trigger dev", + "tunnel": "ngrok http --url=d3-demo.ngrok.dev 3000", + "python:install-requirements": "uv pip sync requirements.txt", + "python:compile-requirements": "uv pip compile requirements.in -o requirements.txt", + "python:install-browsers": "./.venv/bin/playwright install", + "python:install": "pnpm run python:compile-requirements && pnpm run python:install-requirements", + "python:create-env": "uv venv .venv", + "db:migrate": "tsx -r dotenv/config src/lib/migrate.ts up", + "db:migrate:down": "tsx -r dotenv/config src/lib/migrate.ts down" + }, + "dependencies": { + "@ai-sdk/anthropic": "^1.2.4", + "@ai-sdk/openai": "1.3.3", + "@e2b/code-interpreter": "^1.1.0", + "@radix-ui/react-avatar": "^1.1.3", + "@slack/web-api": "^6.8.1", + "@trigger.dev/python": "workspace:*", + "@trigger.dev/react-hooks": "workspace:*", + "@trigger.dev/sdk": "workspace:*", + "@vercel/postgres": "^0.10.0", + "ai": "4.2.5", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.486.0", + "marked": "^4.0.18", + "nanoid": "^5.1.5", + "next": "15.2.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-markdown": "^10.1.0", + "tailwind-merge": "^3.1.0", + "tw-animate-css": "^1.2.4", + "zod": "3.23.8" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@tailwindcss/typography": "^0.5.9", + "@trigger.dev/build": "workspace:*", + "@types/marked": "^4.0.3", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4.0.17", + "trigger.dev": "workspace:*", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/references/d3-demo/postcss.config.mjs b/references/d3-chat/postcss.config.mjs similarity index 100% rename from references/d3-demo/postcss.config.mjs rename to references/d3-chat/postcss.config.mjs diff --git a/references/d3-demo/public/file.svg b/references/d3-chat/public/file.svg similarity index 100% rename from references/d3-demo/public/file.svg rename to references/d3-chat/public/file.svg diff --git a/references/d3-demo/public/globe.svg b/references/d3-chat/public/globe.svg similarity index 100% rename from references/d3-demo/public/globe.svg rename to references/d3-chat/public/globe.svg diff --git a/references/d3-demo/public/next.svg b/references/d3-chat/public/next.svg similarity index 100% rename from references/d3-demo/public/next.svg rename to references/d3-chat/public/next.svg diff --git a/references/d3-demo/public/vercel.svg b/references/d3-chat/public/vercel.svg similarity index 100% rename from references/d3-demo/public/vercel.svg rename to references/d3-chat/public/vercel.svg diff --git a/references/d3-demo/public/window.svg b/references/d3-chat/public/window.svg similarity index 100% rename from references/d3-demo/public/window.svg rename to references/d3-chat/public/window.svg diff --git a/references/d3-chat/requirements.in b/references/d3-chat/requirements.in new file mode 100644 index 0000000000..dcd47d2526 --- /dev/null +++ b/references/d3-chat/requirements.in @@ -0,0 +1,2 @@ +crawl4ai +playwright \ No newline at end of file diff --git a/references/d3-chat/requirements.txt b/references/d3-chat/requirements.txt new file mode 100644 index 0000000000..30e80bc8ec --- /dev/null +++ b/references/d3-chat/requirements.txt @@ -0,0 +1,218 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile requirements.in -o requirements.txt +aiofiles==24.1.0 + # via crawl4ai +aiohappyeyeballs==2.6.1 + # via aiohttp +aiohttp==3.11.15 + # via + # crawl4ai + # litellm +aiosignal==1.3.2 + # via aiohttp +aiosqlite==0.21.0 + # via crawl4ai +annotated-types==0.7.0 + # via pydantic +anyio==4.9.0 + # via + # httpx + # openai +attrs==25.3.0 + # via + # aiohttp + # jsonschema + # referencing +beautifulsoup4==4.13.3 + # via crawl4ai +certifi==2025.1.31 + # via + # httpcore + # httpx + # requests +cffi==1.17.1 + # via cryptography +charset-normalizer==3.4.1 + # via requests +click==8.1.8 + # via + # crawl4ai + # litellm + # nltk +colorama==0.4.6 + # via crawl4ai +crawl4ai==0.5.0.post8 + # via -r requirements.in +cryptography==44.0.2 + # via pyopenssl +cssselect==1.3.0 + # via crawl4ai +distro==1.9.0 + # via openai +fake-http-header==0.3.5 + # via tf-playwright-stealth +fake-useragent==2.1.0 + # via crawl4ai +faust-cchardet==2.1.19 + # via crawl4ai +filelock==3.18.0 + # via huggingface-hub +frozenlist==1.5.0 + # via + # aiohttp + # aiosignal +fsspec==2025.3.2 + # via huggingface-hub +greenlet==3.1.1 + # via playwright +h11==0.14.0 + # via httpcore +httpcore==1.0.7 + # via httpx +httpx==0.28.1 + # via + # crawl4ai + # litellm + # openai +huggingface-hub==0.30.1 + # via tokenizers +humanize==4.12.2 + # via crawl4ai +idna==3.10 + # via + # anyio + # httpx + # requests + # yarl +importlib-metadata==8.6.1 + # via litellm +jinja2==3.1.6 + # via litellm +jiter==0.9.0 + # via openai +joblib==1.4.2 + # via nltk +jsonschema==4.23.0 + # via litellm +jsonschema-specifications==2024.10.1 + # via jsonschema +litellm==1.65.1 + # via crawl4ai +lxml==5.3.1 + # via crawl4ai +markdown-it-py==3.0.0 + # via rich +markupsafe==3.0.2 + # via jinja2 +mdurl==0.1.2 + # via markdown-it-py +multidict==6.3.0 + # via + # aiohttp + # yarl +nltk==3.9.1 + # via crawl4ai +numpy==2.2.4 + # via + # crawl4ai + # rank-bm25 +openai==1.70.0 + # via litellm +packaging==24.2 + # via huggingface-hub +pillow==10.4.0 + # via crawl4ai +playwright==1.51.0 + # via + # -r requirements.in + # crawl4ai + # tf-playwright-stealth +propcache==0.3.1 + # via + # aiohttp + # yarl +psutil==7.0.0 + # via crawl4ai +pycparser==2.22 + # via cffi +pydantic==2.11.1 + # via + # crawl4ai + # litellm + # openai +pydantic-core==2.33.0 + # via pydantic +pyee==12.1.1 + # via playwright +pygments==2.19.1 + # via rich +pyopenssl==25.0.0 + # via crawl4ai +pyperclip==1.9.0 + # via crawl4ai +python-dotenv==1.1.0 + # via + # crawl4ai + # litellm +pyyaml==6.0.2 + # via huggingface-hub +rank-bm25==0.2.2 + # via crawl4ai +referencing==0.36.2 + # via + # jsonschema + # jsonschema-specifications +regex==2024.11.6 + # via + # nltk + # tiktoken +requests==2.32.3 + # via + # crawl4ai + # huggingface-hub + # tiktoken +rich==14.0.0 + # via crawl4ai +rpds-py==0.24.0 + # via + # jsonschema + # referencing +sniffio==1.3.1 + # via + # anyio + # openai +snowballstemmer==2.2.0 + # via crawl4ai +soupsieve==2.6 + # via beautifulsoup4 +tf-playwright-stealth==1.1.2 + # via crawl4ai +tiktoken==0.9.0 + # via litellm +tokenizers==0.21.1 + # via litellm +tqdm==4.67.1 + # via + # huggingface-hub + # nltk + # openai +typing-extensions==4.13.0 + # via + # aiosqlite + # beautifulsoup4 + # huggingface-hub + # openai + # pydantic + # pydantic-core + # pyee + # typing-inspection +typing-inspection==0.4.0 + # via pydantic +urllib3==2.3.0 + # via requests +xxhash==3.5.0 + # via crawl4ai +yarl==1.18.3 + # via aiohttp +zipp==3.21.0 + # via importlib-metadata diff --git a/references/d3-chat/src/app/api/slack/interaction/route.ts b/references/d3-chat/src/app/api/slack/interaction/route.ts new file mode 100644 index 0000000000..a5e18f81b0 --- /dev/null +++ b/references/d3-chat/src/app/api/slack/interaction/route.ts @@ -0,0 +1,79 @@ +import { NextResponse } from "next/server"; +import { wait, auth } from "@trigger.dev/sdk"; + +// Verify Slack requests middleware +function verifySlackRequest(request: Request) { + // TODO: Implement Slack request verification using signing secret + // https://api.slack.com/authentication/verifying-requests-from-slack + return true; +} + +export async function POST(request: Request) { + // Verify the request is from Slack + if (!verifySlackRequest(request)) { + return new NextResponse("Unauthorized", { status: 401 }); + } + + try { + // Parse the urlencoded body from Slack + const formData = await request.formData(); + const payload = JSON.parse(formData.get("payload") as string); + + console.log("Received Slack payload:", JSON.stringify(payload, null, 2)); + + // Extract the action and values + const action = payload.actions[0]; + const value = JSON.parse(action.value); + const { tokenId, publicAccessToken, action: actionType } = value; + + console.log("Parsed action values:", { tokenId, actionType }); + + await auth.withAuth({ accessToken: publicAccessToken }, async () => { + // Complete the token based on the action + if (actionType === "approve") { + console.log("Completing token with approval"); + await wait.completeToken(tokenId, { approved: true }); + } else if (actionType === "deny") { + console.log("Completing token with denial"); + await wait.completeToken(tokenId, { approved: false }); + } + }); + + // Update the message to show it's been processed + const blocks = payload.message.blocks.filter((block: any) => block.type !== "actions"); + blocks.push({ + type: "context", + elements: [ + { + type: "mrkdwn", + text: `✅ ${actionType === "approve" ? "Approved" : "Denied"} by <@${ + payload.user.id + }> at ${new Date().toLocaleTimeString()}`, + }, + ], + }); + + // Send the update to Slack's response_url + const updateResponse = await fetch(payload.response_url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + replace_original: true, + text: actionType === "approve" ? "Query approved" : "Query denied", + blocks, + }), + }); + + if (!updateResponse.ok) { + console.error("Failed to update Slack message:", await updateResponse.text()); + } + + // Return an empty 200 OK response + return new NextResponse(null, { status: 200 }); + } catch (error) { + console.error("Error processing Slack interaction:", error); + return new NextResponse("Internal Server Error", { status: 500 }); + } +} diff --git a/references/d3-demo/src/app/favicon.ico b/references/d3-chat/src/app/favicon.ico similarity index 100% rename from references/d3-demo/src/app/favicon.ico rename to references/d3-chat/src/app/favicon.ico diff --git a/references/d3-demo/src/app/globals.css b/references/d3-chat/src/app/globals.css similarity index 100% rename from references/d3-demo/src/app/globals.css rename to references/d3-chat/src/app/globals.css diff --git a/references/d3-chat/src/app/layout.tsx b/references/d3-chat/src/app/layout.tsx new file mode 100644 index 0000000000..e585c88eb2 --- /dev/null +++ b/references/d3-chat/src/app/layout.tsx @@ -0,0 +1,30 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Todo Chat", + description: "Todo Chat", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/references/d3-chat/src/app/page.tsx b/references/d3-chat/src/app/page.tsx new file mode 100644 index 0000000000..64d1424bb7 --- /dev/null +++ b/references/d3-chat/src/app/page.tsx @@ -0,0 +1,16 @@ +import { ChatContainer } from "@/components/chat-container"; +import { Header } from "@/components/header"; +import { auth } from "@trigger.dev/sdk"; + +export default async function Home() { + const triggerToken = await auth.createTriggerPublicToken("todo-chat"); + + return ( + + + + + + + ); +} diff --git a/references/d3-chat/src/components/chat-container.tsx b/references/d3-chat/src/components/chat-container.tsx new file mode 100644 index 0000000000..35ebdb298d --- /dev/null +++ b/references/d3-chat/src/components/chat-container.tsx @@ -0,0 +1,203 @@ +"use client"; + +import { ChatInput } from "./chat-input"; +import { ChatMessage } from "./chat-message"; +import { ToolCallMessage } from "./tool-call-message"; +import { useRealtimeTaskTriggerWithStreams } from "@trigger.dev/react-hooks"; +import type { todoChat, STREAMS } from "../trigger/chat"; +import { TextStreamPart } from "ai"; + +type MessageBase = { + id: string; + role: "user" | "assistant" | "tool"; +}; + +type UserMessage = MessageBase & { + role: "user"; + content: string; +}; + +type AssistantMessage = MessageBase & { + role: "assistant"; + content: string; +}; + +type ToolMessage = MessageBase & { + role: "tool"; + name: string; + input: any; + output?: any; +}; + +type Message = UserMessage | AssistantMessage | ToolMessage; + +function getMessagesFromRun( + run: NonNullable< + ReturnType>["run"] + >, + fullStream: TextStreamPart[] = [] +): Message[] { + const messages: Message[] = []; + + // Add the user message + if (run.payload) { + messages.push({ + id: `user-${run.id}`, + role: "user", + content: run.payload.input, + }); + } + + // Track the current assistant message content + let currentAssistantContent = ""; + + // Keep track of tool calls and their results + const toolCalls = new Map(); + + // Process the stream + for (const part of fullStream) { + if (part.type === "tool-call") { + const toolMessage: ToolMessage = { + id: `tool-${part.toolCallId}`, + role: "tool", + name: part.toolName, + input: part.args, + }; + toolCalls.set(part.toolCallId, toolMessage); + messages.push(toolMessage); + } else if (part.type === "tool-result") { + const toolMessage = toolCalls.get(part.toolCallId); + if (toolMessage) { + toolMessage.output = part.result; + } + } else if (part.type === "text-delta") { + currentAssistantContent += part.textDelta; + + // Find or create the assistant message + const lastMessage = messages[messages.length - 1]; + if (lastMessage?.role === "assistant") { + messages[messages.length - 1] = { + ...lastMessage, + content: currentAssistantContent, + }; + } else { + messages.push({ + id: `assistant-${run.id}-${messages.length}`, + role: "assistant", + content: currentAssistantContent, + }); + } + } + } + + return messages; +} + +export function useTodoChat({ accessToken }: { accessToken: string }) { + const triggerInstance = useRealtimeTaskTriggerWithStreams("todo-chat", { + accessToken, + baseURL: process.env.NEXT_PUBLIC_TRIGGER_API_URL, + }); + + const messages = triggerInstance.run + ? getMessagesFromRun(triggerInstance.run, triggerInstance.streams?.fullStream) + : []; + + // Consider it submitting if we have a run but no streams yet + const isSubmitting = + (triggerInstance.run !== null && + !triggerInstance.streams?.fullStream && + triggerInstance.handle === null) || + triggerInstance.isLoading; + + const dashboardUrl = triggerInstance.run + ? `${process.env.NEXT_PUBLIC_DASHBOARD_RUNS_URL}/${triggerInstance.run.id}` + : null; + + return { + ...triggerInstance, + messages, + isSubmitting, + dashboardUrl, + }; +} + +export function ChatContainer({ triggerToken }: { triggerToken: string }) { + const { messages, submit, isSubmitting, dashboardUrl } = useTodoChat({ + accessToken: triggerToken, + }); + + return ( + + + + Chat Session + + Active + + {dashboardUrl && ( + + + + + + View Run + + )} + + + Clear + + + Export + + + + + + + {messages.map((message) => + message.role === "tool" ? ( + + ) : ( + + ) + )} + + + + + { + submit({ + input, + userId: "user_1234", + }); + }} + /> + + + + ); +} diff --git a/references/d3-chat/src/components/chat-input.tsx b/references/d3-chat/src/components/chat-input.tsx new file mode 100644 index 0000000000..ea58b10223 --- /dev/null +++ b/references/d3-chat/src/components/chat-input.tsx @@ -0,0 +1,44 @@ +import { useState } from "react"; + +interface ChatInputProps { + onSubmit: (input: string) => void; + isSubmitting?: boolean; +} + +export function ChatInput({ onSubmit, isSubmitting = false }: ChatInputProps) { + const [input, setInput] = useState(""); + + function handleSubmit() { + if (!input.trim() || isSubmitting) return; + onSubmit(input); + setInput(""); + } + + return ( + + + setInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + handleSubmit(); + } + }} + disabled={isSubmitting} + /> + + + {isSubmitting ? "Sending..." : "Send"} + + + ); +} diff --git a/references/d3-chat/src/components/chat-message.tsx b/references/d3-chat/src/components/chat-message.tsx new file mode 100644 index 0000000000..5e85f98cee --- /dev/null +++ b/references/d3-chat/src/components/chat-message.tsx @@ -0,0 +1,59 @@ +import { Avatar } from "@/components/ui/avatar"; +import ReactMarkdown from "react-markdown"; +import { marked } from "marked"; + +interface ChatMessageProps { + role: "user" | "assistant"; + content: string; + id: string; +} + +function parseMarkdownIntoBlocks(markdown: string): string[] { + const tokens = marked.lexer(markdown); + return tokens.map((token) => token.raw); +} + +const ParsedMarkdown = ({ content, id }: { content: string; id: string }) => { + const blocks = parseMarkdownIntoBlocks(content); + + return blocks.map((block, index) => {block}); +}; + +export function ChatMessage({ role, content, id }: ChatMessageProps) { + return ( + + + + + + {role === "user" ? "U" : "A"} + + + + + + {role === "user" ? "You" : "Assistant"} + + {role === "assistant" ? ( + + + + ) : ( + {content} + )} + + + + + ); +} diff --git a/references/d3-chat/src/components/header.tsx b/references/d3-chat/src/components/header.tsx new file mode 100644 index 0000000000..9cdcdc0eda --- /dev/null +++ b/references/d3-chat/src/components/header.tsx @@ -0,0 +1,16 @@ +export function Header() { + return ( + + + + Todo Chat + v1.0.0 + + + user_123456 + + + + ) +} + diff --git a/references/d3-chat/src/components/tool-call-message.tsx b/references/d3-chat/src/components/tool-call-message.tsx new file mode 100644 index 0000000000..01ba5300fd --- /dev/null +++ b/references/d3-chat/src/components/tool-call-message.tsx @@ -0,0 +1,71 @@ +interface ToolCallMessageProps { + name: string; + input: any; + output?: any; +} + +export function ToolCallMessage({ name, input, output }: ToolCallMessageProps) { + const hasOutput = output !== undefined; + + return ( + + + + + + {name} + + + Tool Call {!hasOutput && "(Running...)"} + + + + + + Input + + {JSON.stringify(input, null, 2)} + + + + {hasOutput ? ( + + Output + + {JSON.stringify(output, null, 2)} + + + ) : ( + + + + + + Waiting for result... + + )} + + + + ); +} diff --git a/references/d3-chat/src/components/ui/avatar.tsx b/references/d3-chat/src/components/ui/avatar.tsx new file mode 100644 index 0000000000..71e428b4ca --- /dev/null +++ b/references/d3-chat/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/references/d3-demo/src/extensions/playwright.ts b/references/d3-chat/src/extensions/playwright.ts similarity index 100% rename from references/d3-demo/src/extensions/playwright.ts rename to references/d3-chat/src/extensions/playwright.ts diff --git a/references/d3-chat/src/lib/migrate.ts b/references/d3-chat/src/lib/migrate.ts new file mode 100644 index 0000000000..7a32a1bc48 --- /dev/null +++ b/references/d3-chat/src/lib/migrate.ts @@ -0,0 +1,49 @@ +import { sql } from "@vercel/postgres"; + +export async function migrate(direction: "up" | "down") { + if (direction === "up") { + await migrateUp(); + } else { + await migrateDown(); + } +} + +export async function migrateUp() { + const createTable = await sql` + CREATE TABLE IF NOT EXISTS todos ( + id VARCHAR(255) PRIMARY KEY, + user_id VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + status VARCHAR(50) NOT NULL DEFAULT 'pending', + priority INTEGER NOT NULL DEFAULT 3, + due_date TIMESTAMP WITH TIME ZONE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + completed_at TIMESTAMP WITH TIME ZONE, + tags TEXT[], -- Array of tags + assigned_to VARCHAR(255) + ); + `; + + console.log(`Created "todos" table`); + + return { + createTable, + }; +} + +export async function migrateDown() { + const dropTable = await sql` + DROP TABLE IF EXISTS todos; + `; + + console.log(`Dropped "todos" table`); +} + +async function main() { + const direction = process.argv[2]; + await migrate(direction as "up" | "down"); +} + +main().catch(console.error); diff --git a/references/d3-chat/src/lib/slack.ts b/references/d3-chat/src/lib/slack.ts new file mode 100644 index 0000000000..3698c700c6 --- /dev/null +++ b/references/d3-chat/src/lib/slack.ts @@ -0,0 +1,114 @@ +import { WebClient } from "@slack/web-api"; +import { logger } from "@trigger.dev/sdk"; + +// Initialize the Slack client +const slack = new WebClient(process.env.SLACK_BOT_TOKEN); + +type SendApprovalMessageParams = { + query: string; + userId: string; + tokenId: string; + publicAccessToken: string; + input: string; +}; + +export async function sendSQLApprovalMessage({ + query, + userId, + tokenId, + publicAccessToken, + input, +}: SendApprovalMessageParams) { + return await logger.trace( + "sendSQLApprovalMessage", + async (span) => { + const response = await slack.chat.postMessage({ + channel: process.env.SLACK_CHANNEL_ID!, + text: `SQL Query Approval Required for user ${userId}`, // Fallback text for notifications + blocks: [ + { + type: "header", + text: { + type: "plain_text", + text: "🚨 SQL Query Approval Required", + emoji: true, + }, + }, + { + type: "context", + elements: [ + { + type: "mrkdwn", + text: `*Requested by:* <@${userId}>`, + }, + ], + }, + { + type: "section", + text: { + type: "mrkdwn", + text: "*User Request:*\n" + input, + }, + }, + { + type: "section", + text: { + type: "mrkdwn", + text: "*Generated Query:*\n```sql\n" + query + "\n```", + }, + }, + { + type: "actions", + block_id: "sql_approval_actions", + elements: [ + { + type: "button", + text: { + type: "plain_text", + text: "Approve ✅", + emoji: true, + }, + style: "primary", + value: JSON.stringify({ + tokenId, + publicAccessToken, + action: "approve", + }), + action_id: "sql_approve", + }, + { + type: "button", + text: { + type: "plain_text", + text: "Deny ❌", + emoji: true, + }, + style: "danger", + value: JSON.stringify({ + tokenId, + publicAccessToken, + action: "deny", + }), + action_id: "sql_deny", + }, + ], + }, + { + type: "context", + elements: [ + { + type: "mrkdwn", + text: "⚠️ This action cannot be undone", + }, + ], + }, + ], + }); + + return response; + }, + { + icon: "tabler-brand-slack", + } + ); +} diff --git a/references/d3-demo/src/lib/utils.ts b/references/d3-chat/src/lib/utils.ts similarity index 100% rename from references/d3-demo/src/lib/utils.ts rename to references/d3-chat/src/lib/utils.ts diff --git a/references/d3-chat/src/trigger/chat.ts b/references/d3-chat/src/trigger/chat.ts new file mode 100644 index 0000000000..21b34fa082 --- /dev/null +++ b/references/d3-chat/src/trigger/chat.ts @@ -0,0 +1,228 @@ +import { openai } from "@ai-sdk/openai"; +import { anthropic } from "@ai-sdk/anthropic"; +import { python } from "@trigger.dev/python"; +import { ai } from "@trigger.dev/sdk/ai"; +import { metadata, schemaTask, wait } from "@trigger.dev/sdk/v3"; +import { sql } from "@vercel/postgres"; +import { streamText, TextStreamPart, tool } from "ai"; +import { nanoid } from "nanoid"; +import { z } from "zod"; +import { sendSQLApprovalMessage } from "../lib/slack"; +import { chartTool } from "./sandbox"; +import { QueryApproval } from "./schemas"; + +const crawlerTask = schemaTask({ + id: "crawler", + description: "Crawl a URL and return the markdown", + schema: z.object({ + url: z.string().describe("The URL to crawl"), + }), + run: async ({ url }) => { + const results = await python.runScript("./src/trigger/python/crawler.py", [url]); + + return results.stdout; + }, +}); + +const crawler = ai.tool(crawlerTask); + +const queryApprovalTask = schemaTask({ + id: "query-approval", + description: "Get approval for a SQL query from an admin", + schema: z.object({ + userId: z.string().describe("The user_id to get approval for"), + input: z.string().describe("The input to get approval for"), + query: z.string().describe("The SQL query to execute"), + }), + run: async ({ userId, input, query }) => { + const token = await wait.createToken({ + tags: [`user:${userId}`, "approval"], + timeout: "5m", // timeout in 5 minutes + }); + + await sendSQLApprovalMessage({ + query, + userId, + tokenId: token.id, + publicAccessToken: token.publicAccessToken, + input, + }); + + const result = await wait.forToken(token); + + // result.ok === false if the token timed out + if (!result.ok) { + return { + approved: false, + }; + } else { + return result.output; + } + }, +}); + +const queryApproval = ai.tool(queryApprovalTask); + +const executeSql = tool({ + description: "Use this tool to execute a SQL query", + parameters: z.object({ + query: z.string().describe("The SQL query to execute"), + }), + execute: async ({ query }) => { + // DANGER: This is a dangerous tool, it can execute arbitrary SQL queries. + const result = await sql.query(query); + + return result.rows; + }, +}); + +const generateId = tool({ + description: "Use this tool to generate a unique ID for a todo", + parameters: z.object({ + prefix: z.string().describe("The prefix for the ID (defaults to 'todo')").default("todo"), + }), + execute: async ({ prefix }) => { + return `${prefix}_${nanoid(12)}`; + }, +}); + +const getUserTodos = tool({ + description: "Use this tool to get all todos for a user", + parameters: z.object({ + userId: z.string().describe("The user_id to get todos for"), + }), + execute: async ({ userId }) => { + const result = await sql`SELECT * FROM todos WHERE user_id = ${userId}`; + + return result.rows; + }, +}); + +const getUserId = tool({ + description: "Use this tool to get the user_id for the current user", + parameters: z.object({}), + execute: async () => { + const userId = metadata.get("user_id"); + + if (!userId) { + throw new Error("No user_id found"); + } + + return userId; + }, +}); + +export const todoChat = schemaTask({ + id: "todo-chat", + description: "Chat with the todo app", + schema: z.object({ + input: z + .string() + .describe( + "The input to chat with the todo app. Will be a request to read or update the todo list." + ), + userId: z.string(), + }), + run: async ({ input, userId }) => { + metadata.set("user_id", userId); + + const system = ` + You are a SQL (postgres) expert who can turn natural language descriptions for a todo app + into a SQL query which can then be executed against a SQL database. Here is the schema: + + CREATE TABLE IF NOT EXISTS todos ( + id VARCHAR(255) PRIMARY KEY, + user_id VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + status VARCHAR(50) NOT NULL DEFAULT 'pending', + priority INTEGER NOT NULL DEFAULT 3, + due_date TIMESTAMP WITH TIME ZONE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + completed_at TIMESTAMP WITH TIME ZONE, + tags TEXT[], -- Array of tags + assigned_to VARCHAR(255) + ); + + Only Create, Read, Update, and Delete operations are allowed. + + The output will be a SQL query. + + If the query produced is a mutation, you will need to get approval first from an admin using the queryApproval tool. + If the queryApproval tool returns false, you will need to stop and return an error message. + If the queryApproval tool returns true, you will need to execute the query using the executeSql tool. + + The executeSql tool will return the results of the query. + + The current time is ${new Date().toISOString()}. + + When creating a todo, you'll need to generate a unique ID for the todo, using the generateId tool. + For updates, you'll need to use the getUserTodos tool to find the todo first. + + IMPORTANT: Don't ask the user to provide any more information to help you generate the SQL query, do your best to generate the query based on the input alone. + + After successfully executing a mutation query, get the latest user todos and summarize them along with what has been updated. + After successfully executing a read query, summarize the results in a human readable format. + + If the user specifies a URL, you can use the crawler tool to crawl the URL and return the markdown, helping inform the SQL query. + `; + + const prompt = input; + + const result = streamText({ + model: getModel(), + system, + prompt, + maxSteps: 10, + tools: { + queryApproval, + executeSql, + generateId, + getUserTodos, + crawler, + getUserId, + chart: chartTool, + }, + experimental_telemetry: { + isEnabled: true, + }, + }); + + const stream = await metadata.stream("fullStream", result.fullStream); + + const textParts = []; + + for await (const part of stream) { + if (part.type === "text-delta") { + textParts.push(part.textDelta); + } + } + + return textParts.join(""); + }, +}); + +export type TOOLS = { + queryApproval: typeof queryApproval; + executeSql: typeof executeSql; + generateId: typeof generateId; + getUserTodos: typeof getUserTodos; + crawler: typeof crawler; + getUserId: typeof getUserId; + chart: typeof chartTool; +}; + +export type STREAMS = { + fullStream: TextStreamPart; +}; + +const CHAT_PROVIDER: "openai" | "anthropic" = "openai"; + +function getModel() { + if (CHAT_PROVIDER === "openai") { + return openai("gpt-4o"); + } else { + return anthropic("claude-3-5-sonnet-latest"); + } +} diff --git a/references/d3-chat/src/trigger/python/crawler.py b/references/d3-chat/src/trigger/python/crawler.py new file mode 100644 index 0000000000..3d2af00e0a --- /dev/null +++ b/references/d3-chat/src/trigger/python/crawler.py @@ -0,0 +1,25 @@ +import asyncio +import sys +from crawl4ai import AsyncWebCrawler +from crawl4ai.async_configs import BrowserConfig + +async def main(url: str): + # Get proxy configuration from environment variables + browser_config = BrowserConfig( + browser_type="chrome", + headless=True, + verbose=False, + ) + + async with AsyncWebCrawler(config=browser_config) as crawler: + result = await crawler.arun( + url=url, + ) + print(result.markdown) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: python crawler.py ") + sys.exit(1) + url = sys.argv[1] + asyncio.run(main(url)) \ No newline at end of file diff --git a/references/d3-chat/src/trigger/sandbox.ts b/references/d3-chat/src/trigger/sandbox.ts new file mode 100644 index 0000000000..4a3fb858ac --- /dev/null +++ b/references/d3-chat/src/trigger/sandbox.ts @@ -0,0 +1,61 @@ +import { openai } from "@ai-sdk/openai"; +import { Sandbox } from "@e2b/code-interpreter"; +import { ai } from "@trigger.dev/sdk/ai"; +import { schemaTask } from "@trigger.dev/sdk/v3"; +import { generateObject } from "ai"; +import { z } from "zod"; + +const chartTask = schemaTask({ + id: "chart", + description: "Generate a chart using natural language", + schema: z.object({ + input: z.string().describe("The chart to generate"), + }), + run: async ({ input }) => { + const code = await generateObject({ + model: openai("gpt-4o"), + schema: z.object({ + code: z.string().describe("The Python code to execute"), + }), + system: ` + You are a helpful assistant that can generate Python code to be executed in a sandbox, using matplotlib.pyplot. + + For example: + + import matplotlib.pyplot as plt + plt.plot([1, 2, 3, 4]) + plt.ylabel('some numbers') + plt.show() + + Make sure the code ends with plt.show() + `, + prompt: input, + }); + + const sandbox = await Sandbox.create(); + + const execution = await sandbox.runCode(code.object.code); + + const firstResult = execution.results[0]; + + if (firstResult.png) { + return { + chart: firstResult.png, + }; + } else { + throw new Error("No chart generated"); + } + }, +}); + +export const chartTool = ai.tool(chartTask, { + experimental_toToolResultContent: (result) => { + return [ + { + type: "image", + data: result.chart, + mimeType: "image/png", + }, + ]; + }, +}); diff --git a/references/d3-chat/src/trigger/schemas.ts b/references/d3-chat/src/trigger/schemas.ts new file mode 100644 index 0000000000..e0a5bebfdd --- /dev/null +++ b/references/d3-chat/src/trigger/schemas.ts @@ -0,0 +1,16 @@ +import { z } from "zod"; + +export const AgentLoopMetadata = z.object({ + waitToken: z.object({ + id: z.string(), + publicAccessToken: z.string(), + }), +}); + +export type AgentLoopMetadata = z.infer; + +export const QueryApproval = z.object({ + approved: z.boolean().describe("Whether the query has been approved"), +}); + +export type QueryApproval = z.infer; diff --git a/references/d3-chat/tailwind.config.ts b/references/d3-chat/tailwind.config.ts new file mode 100644 index 0000000000..7c5882e06f --- /dev/null +++ b/references/d3-chat/tailwind.config.ts @@ -0,0 +1,112 @@ +import type { Config } from "tailwindcss"; +import typography from "@tailwindcss/typography"; + +const config: Config = { + darkMode: ["class"], + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + "*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + fontFamily: { + mono: ["Menlo", "Monaco", "Consolas", "monospace"], + }, + colors: { + gray: { + 50: "#f9fafb", + 100: "#f3f4f6", + 200: "#e5e7eb", + 300: "#d1d5db", + 400: "#9ca3af", + 500: "#6b7280", + 600: "#4b5563", + 700: "#374151", + 800: "#1f2937", + 900: "#111827", + }, + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + chart: { + "1": "hsl(var(--chart-1))", + "2": "hsl(var(--chart-2))", + "3": "hsl(var(--chart-3))", + "4": "hsl(var(--chart-4))", + "5": "hsl(var(--chart-5))", + }, + sidebar: { + DEFAULT: "hsl(var(--sidebar-background))", + foreground: "hsl(var(--sidebar-foreground))", + primary: "hsl(var(--sidebar-primary))", + "primary-foreground": "hsl(var(--sidebar-primary-foreground))", + accent: "hsl(var(--sidebar-accent))", + "accent-foreground": "hsl(var(--sidebar-accent-foreground))", + border: "hsl(var(--sidebar-border))", + ring: "hsl(var(--sidebar-ring))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { + height: "0", + }, + to: { + height: "var(--radix-accordion-content-height)", + }, + }, + "accordion-up": { + from: { + height: "var(--radix-accordion-content-height)", + }, + to: { + height: "0", + }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [typography], +}; +export default config; diff --git a/references/d3-chat/trigger.config.ts b/references/d3-chat/trigger.config.ts new file mode 100644 index 0000000000..745f065e19 --- /dev/null +++ b/references/d3-chat/trigger.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from "@trigger.dev/sdk"; +import { pythonExtension } from "@trigger.dev/python/extension"; +import { installPlaywrightChromium } from "./src/extensions/playwright"; + +export default defineConfig({ + project: "proj_cdmymsrobxmcgjqzhdkq", + dirs: ["./src/trigger"], + maxDuration: 3600, + build: { + extensions: [ + // This is required to use the Python extension + pythonExtension({ + requirementsFile: "./requirements.txt", // Optional: Path to your requirements file + devPythonBinaryPath: `.venv/bin/python`, // Optional: Custom Python binary path + scripts: ["src/trigger/python/**/*.py"], // List of Python scripts to include + }), + installPlaywrightChromium(), + ], + }, +}); diff --git a/references/d3-demo/tsconfig.json b/references/d3-chat/tsconfig.json similarity index 100% rename from references/d3-demo/tsconfig.json rename to references/d3-chat/tsconfig.json diff --git a/references/d3-openai-agents/.gitignore b/references/d3-openai-agents/.gitignore new file mode 100644 index 0000000000..5ef6a52078 --- /dev/null +++ b/references/d3-openai-agents/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/references/d3-openai-agents/README.md b/references/d3-openai-agents/README.md new file mode 100644 index 0000000000..e215bc4ccf --- /dev/null +++ b/references/d3-openai-agents/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/references/d3-openai-agents/components.json b/references/d3-openai-agents/components.json new file mode 100644 index 0000000000..ffe928f5b6 --- /dev/null +++ b/references/d3-openai-agents/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/references/d3-openai-agents/next.config.ts b/references/d3-openai-agents/next.config.ts new file mode 100644 index 0000000000..e9ffa3083a --- /dev/null +++ b/references/d3-openai-agents/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/references/d3-demo/package.json b/references/d3-openai-agents/package.json similarity index 78% rename from references/d3-demo/package.json rename to references/d3-openai-agents/package.json index da36771119..b405b9d83e 100644 --- a/references/d3-demo/package.json +++ b/references/d3-openai-agents/package.json @@ -1,5 +1,5 @@ { - "name": "references-d3-demo", + "name": "references-d3-openai-agents", "version": "0.1.0", "private": true, "scripts": { @@ -12,17 +12,22 @@ "python:install-requirements": "uv pip sync requirements.txt", "python:compile-requirements": "uv pip compile requirements.in -o requirements.txt", "python:install": "pnpm run python:compile-requirements && pnpm run python:install-requirements", - "python:create-env": "uv venv .venv" + "python:create-env": "uv venv .venv", + "db:migrate": "tsx -r dotenv/config src/lib/migrate.ts up", + "db:migrate:down": "tsx -r dotenv/config src/lib/migrate.ts down" }, "dependencies": { "@ai-sdk/openai": "1.3.3", + "@slack/web-api": "^6.8.1", + "@trigger.dev/python": "workspace:*", "@trigger.dev/react-hooks": "workspace:*", "@trigger.dev/sdk": "workspace:*", - "@trigger.dev/python": "workspace:*", + "@vercel/postgres": "^0.10.0", "ai": "4.2.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.484.0", + "nanoid": "^5.1.5", "next": "15.2.4", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -33,12 +38,14 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@trigger.dev/build": "workspace:*", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "dotenv": "16.4.7", "tailwindcss": "^4.0.17", "trigger.dev": "workspace:*", - "@trigger.dev/build": "workspace:*", + "tsx": "4.19.3", "typescript": "^5" } } \ No newline at end of file diff --git a/references/d3-openai-agents/postcss.config.mjs b/references/d3-openai-agents/postcss.config.mjs new file mode 100644 index 0000000000..c7bcb4b1ee --- /dev/null +++ b/references/d3-openai-agents/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/references/d3-openai-agents/public/file.svg b/references/d3-openai-agents/public/file.svg new file mode 100644 index 0000000000..004145cddf --- /dev/null +++ b/references/d3-openai-agents/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/d3-openai-agents/public/globe.svg b/references/d3-openai-agents/public/globe.svg new file mode 100644 index 0000000000..567f17b0d7 --- /dev/null +++ b/references/d3-openai-agents/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/d3-openai-agents/public/next.svg b/references/d3-openai-agents/public/next.svg new file mode 100644 index 0000000000..5174b28c56 --- /dev/null +++ b/references/d3-openai-agents/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/d3-openai-agents/public/vercel.svg b/references/d3-openai-agents/public/vercel.svg new file mode 100644 index 0000000000..7705396033 --- /dev/null +++ b/references/d3-openai-agents/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/d3-openai-agents/public/window.svg b/references/d3-openai-agents/public/window.svg new file mode 100644 index 0000000000..b2b2a44f6e --- /dev/null +++ b/references/d3-openai-agents/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/references/d3-demo/requirements.in b/references/d3-openai-agents/requirements.in similarity index 100% rename from references/d3-demo/requirements.in rename to references/d3-openai-agents/requirements.in diff --git a/references/d3-demo/requirements.txt b/references/d3-openai-agents/requirements.txt similarity index 100% rename from references/d3-demo/requirements.txt rename to references/d3-openai-agents/requirements.txt diff --git a/references/d3-openai-agents/src/app/api/slack/interaction/route.ts b/references/d3-openai-agents/src/app/api/slack/interaction/route.ts new file mode 100644 index 0000000000..a5e18f81b0 --- /dev/null +++ b/references/d3-openai-agents/src/app/api/slack/interaction/route.ts @@ -0,0 +1,79 @@ +import { NextResponse } from "next/server"; +import { wait, auth } from "@trigger.dev/sdk"; + +// Verify Slack requests middleware +function verifySlackRequest(request: Request) { + // TODO: Implement Slack request verification using signing secret + // https://api.slack.com/authentication/verifying-requests-from-slack + return true; +} + +export async function POST(request: Request) { + // Verify the request is from Slack + if (!verifySlackRequest(request)) { + return new NextResponse("Unauthorized", { status: 401 }); + } + + try { + // Parse the urlencoded body from Slack + const formData = await request.formData(); + const payload = JSON.parse(formData.get("payload") as string); + + console.log("Received Slack payload:", JSON.stringify(payload, null, 2)); + + // Extract the action and values + const action = payload.actions[0]; + const value = JSON.parse(action.value); + const { tokenId, publicAccessToken, action: actionType } = value; + + console.log("Parsed action values:", { tokenId, actionType }); + + await auth.withAuth({ accessToken: publicAccessToken }, async () => { + // Complete the token based on the action + if (actionType === "approve") { + console.log("Completing token with approval"); + await wait.completeToken(tokenId, { approved: true }); + } else if (actionType === "deny") { + console.log("Completing token with denial"); + await wait.completeToken(tokenId, { approved: false }); + } + }); + + // Update the message to show it's been processed + const blocks = payload.message.blocks.filter((block: any) => block.type !== "actions"); + blocks.push({ + type: "context", + elements: [ + { + type: "mrkdwn", + text: `✅ ${actionType === "approve" ? "Approved" : "Denied"} by <@${ + payload.user.id + }> at ${new Date().toLocaleTimeString()}`, + }, + ], + }); + + // Send the update to Slack's response_url + const updateResponse = await fetch(payload.response_url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + replace_original: true, + text: actionType === "approve" ? "Query approved" : "Query denied", + blocks, + }), + }); + + if (!updateResponse.ok) { + console.error("Failed to update Slack message:", await updateResponse.text()); + } + + // Return an empty 200 OK response + return new NextResponse(null, { status: 200 }); + } catch (error) { + console.error("Error processing Slack interaction:", error); + return new NextResponse("Internal Server Error", { status: 500 }); + } +} diff --git a/references/d3-openai-agents/src/app/favicon.ico b/references/d3-openai-agents/src/app/favicon.ico new file mode 100644 index 0000000000..718d6fea48 Binary files /dev/null and b/references/d3-openai-agents/src/app/favicon.ico differ diff --git a/references/d3-openai-agents/src/app/globals.css b/references/d3-openai-agents/src/app/globals.css new file mode 100644 index 0000000000..dc98be74c4 --- /dev/null +++ b/references/d3-openai-agents/src/app/globals.css @@ -0,0 +1,122 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/references/d3-demo/src/app/layout.tsx b/references/d3-openai-agents/src/app/layout.tsx similarity index 100% rename from references/d3-demo/src/app/layout.tsx rename to references/d3-openai-agents/src/app/layout.tsx diff --git a/references/d3-demo/src/app/page.tsx b/references/d3-openai-agents/src/app/page.tsx similarity index 100% rename from references/d3-demo/src/app/page.tsx rename to references/d3-openai-agents/src/app/page.tsx diff --git a/references/d3-demo/src/components/chat-interface.tsx b/references/d3-openai-agents/src/components/chat-interface.tsx similarity index 100% rename from references/d3-demo/src/components/chat-interface.tsx rename to references/d3-openai-agents/src/components/chat-interface.tsx diff --git a/references/d3-demo/src/components/initial-prompt.tsx b/references/d3-openai-agents/src/components/initial-prompt.tsx similarity index 100% rename from references/d3-demo/src/components/initial-prompt.tsx rename to references/d3-openai-agents/src/components/initial-prompt.tsx diff --git a/references/d3-demo/src/components/main-app.tsx b/references/d3-openai-agents/src/components/main-app.tsx similarity index 100% rename from references/d3-demo/src/components/main-app.tsx rename to references/d3-openai-agents/src/components/main-app.tsx diff --git a/references/d3-openai-agents/src/extensions/playwright.ts b/references/d3-openai-agents/src/extensions/playwright.ts new file mode 100644 index 0000000000..178bed23d1 --- /dev/null +++ b/references/d3-openai-agents/src/extensions/playwright.ts @@ -0,0 +1,36 @@ +import type { BuildContext, BuildExtension } from "@trigger.dev/build"; + +// This is a custom build extension to install Playwright and Chromium +export function installPlaywrightChromium(): BuildExtension { + return { + name: "InstallPlaywrightChromium", + onBuildComplete(context: BuildContext) { + const instructions = [ + // Base and Chromium dependencies + `RUN apt-get update && apt-get install -y --no-install-recommends \ + curl unzip npm libnspr4 libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0 \ + libasound2 libnss3 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \ + libgbm1 libxkbcommon0 \ + && apt-get clean && rm -rf /var/lib/apt/lists/*`, + + // Install Playwright and Chromium + `RUN npm install -g playwright`, + `RUN mkdir -p /ms-playwright`, + `RUN PLAYWRIGHT_BROWSERS_PATH=/ms-playwright python -m playwright install --with-deps chromium`, + ]; + + context.addLayer({ + id: "playwright", + image: { instructions }, + deploy: { + env: { + PLAYWRIGHT_BROWSERS_PATH: "/ms-playwright", + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: "1", + PLAYWRIGHT_SKIP_BROWSER_VALIDATION: "1", + }, + override: true, + }, + }); + }, + }; +} diff --git a/references/d3-openai-agents/src/lib/migrate.ts b/references/d3-openai-agents/src/lib/migrate.ts new file mode 100644 index 0000000000..7a32a1bc48 --- /dev/null +++ b/references/d3-openai-agents/src/lib/migrate.ts @@ -0,0 +1,49 @@ +import { sql } from "@vercel/postgres"; + +export async function migrate(direction: "up" | "down") { + if (direction === "up") { + await migrateUp(); + } else { + await migrateDown(); + } +} + +export async function migrateUp() { + const createTable = await sql` + CREATE TABLE IF NOT EXISTS todos ( + id VARCHAR(255) PRIMARY KEY, + user_id VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + status VARCHAR(50) NOT NULL DEFAULT 'pending', + priority INTEGER NOT NULL DEFAULT 3, + due_date TIMESTAMP WITH TIME ZONE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + completed_at TIMESTAMP WITH TIME ZONE, + tags TEXT[], -- Array of tags + assigned_to VARCHAR(255) + ); + `; + + console.log(`Created "todos" table`); + + return { + createTable, + }; +} + +export async function migrateDown() { + const dropTable = await sql` + DROP TABLE IF EXISTS todos; + `; + + console.log(`Dropped "todos" table`); +} + +async function main() { + const direction = process.argv[2]; + await migrate(direction as "up" | "down"); +} + +main().catch(console.error); diff --git a/references/d3-openai-agents/src/lib/utils.ts b/references/d3-openai-agents/src/lib/utils.ts new file mode 100644 index 0000000000..bd0c391ddd --- /dev/null +++ b/references/d3-openai-agents/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/references/d3-openai-agents/src/trigger/approval.ts b/references/d3-openai-agents/src/trigger/approval.ts new file mode 100644 index 0000000000..ee6be8e2aa --- /dev/null +++ b/references/d3-openai-agents/src/trigger/approval.ts @@ -0,0 +1,313 @@ +import { openai } from "@ai-sdk/openai"; +import { logger, metadata, schemaTask, wait } from "@trigger.dev/sdk/v3"; +import { sql } from "@vercel/postgres"; +import { streamText, TextStreamPart } from "ai"; +import { nanoid } from "nanoid"; +import { z } from "zod"; +import { WebClient } from "@slack/web-api"; +import { QueryApproval } from "./schemas"; +import { tool } from "ai"; +import { ai } from "@trigger.dev/sdk/ai"; + +const queryApprovalTask = schemaTask({ + id: "query-approval", + description: "Get approval for a SQL query from an admin", + schema: z.object({ + userId: z.string().describe("The user_id to get approval for"), + input: z.string().describe("The input to get approval for"), + query: z.string().describe("The SQL query to execute"), + }), + run: async ({ userId, input, query }) => { + const toolOptions = ai.currentToolOptions(); + + if (toolOptions) { + logger.info("tool options", { + toolOptions, + }); + } + + const token = await wait.createToken({ + tags: [`user:${userId}`, "approval"], + timeout: "1m", + }); + + logger.info("waiting for approval", { + query, + }); + + await sendSQLApprovalMessage({ + query, + userId, + tokenId: token.id, + publicAccessToken: token.publicAccessToken, + input, + }); + + const result = await wait.forToken(token); + + if (!result.ok) { + return { + approved: false, + }; + } else { + if (result.output.approved) { + logger.info("query approved", { + query, + }); + } else { + logger.warn("query denied", { + query, + }); + } + + return { + approved: result.output.approved, + }; + } + }, +}); + +const queryApproval = ai.tool(queryApprovalTask); + +const executeSql = tool({ + description: "Use this tool to execute a SQL query", + parameters: z.object({ + query: z.string().describe("The SQL query to execute"), + }), + execute: async ({ query }) => { + return await sql.query(query); + }, +}); + +const generateId = tool({ + description: "Use this tool to generate a unique ID for a todo", + parameters: z.object({ + prefix: z.string().describe("The prefix for the ID (defaults to 'todo')").default("todo"), + }), + execute: async ({ prefix }) => { + return `${prefix}_${nanoid(12)}`; + }, +}); + +const getUserTodos = tool({ + description: "Use this tool to get all todos for a user", + parameters: z.object({ + userId: z.string().describe("The user_id to get todos for"), + }), + execute: async ({ userId }) => { + const result = await sql`SELECT * FROM todos WHERE user_id = ${userId}`; + + return result.rows; + }, +}); + +export type STREAM = { + ai: TextStreamPart<{ + queryApproval: typeof queryApproval; + executeSql: typeof executeSql; + generateId: typeof generateId; + getUserTodos: typeof getUserTodos; + }>; +}; + +export const generateAndExecuteSQL = schemaTask({ + id: "generate-and-execute-sql", + description: "Generate and execute SQL", + schema: z.object({ + model: z.string().default("gpt-4o"), + input: z.string().describe("The input to generate the SQL from"), + userId: z.string().describe("The user_id to generate the SQL for"), + }), + run: async ({ model, input, userId }) => { + const system = ` + You are a SQL (postgres) expert who can turn natural language descriptions for a todo app + into a SQL query which can then be executed against a SQL database. Here is the schema: + + CREATE TABLE IF NOT EXISTS todos ( + id VARCHAR(255) PRIMARY KEY, + user_id VARCHAR(255) NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + status VARCHAR(50) NOT NULL DEFAULT 'pending', + priority INTEGER NOT NULL DEFAULT 3, + due_date TIMESTAMP WITH TIME ZONE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + completed_at TIMESTAMP WITH TIME ZONE, + tags TEXT[], -- Array of tags + assigned_to VARCHAR(255) + ); + + Only Create, Read, Update, and Delete operations are allowed. + + The input will be a user_id and a prompt. + + The output will be a SQL query. + + If the query produced is a mutation, you will need to get approval first from an admin using the queryApproval tool. + If the queryApproval tool returns false, you will need to stop and return an error message. + If the queryApproval tool returns true, you will need to execute the query using the executeSql tool. + + The executeSql tool will return the results of the query + + The current time is ${new Date().toISOString()}. + + When creating a todo, you'll need to generate a unique ID for the todo, using the generateId tool. + For updates, you'll need to use the getUserTodos tool to find the todo first. + + IMPORTANT: Don't ask the user to provide any more information to help you generate the SQL query, do your best to generate the query based on the input alone. + + After successfully executing a mutation query, get the latest user todos and summarize them along with what has been updated. + After successfully executing a read query, summarize the results in a human readable format. + `; + + const prompt = ` + User ${userId} has the following prompt: ${input} + + Generate a SQL query to execute. + `; + + const result = streamText({ + model: openai(model), + system, + prompt, + maxSteps: 10, + tools: { + queryApproval, + executeSql, + generateId, + getUserTodos, + }, + experimental_telemetry: { + isEnabled: true, + }, + }); + + const stream = await metadata.stream("ai", result.fullStream); + + const textDeltas: string[] = []; + + for await (const chunk of stream) { + switch (chunk.type) { + case "text-delta": { + textDeltas.push(chunk.textDelta); + break; + } + } + } + + return textDeltas.join(""); + }, +}); + +// Initialize the Slack client +const slack = new WebClient(process.env.SLACK_BOT_TOKEN); + +type SendApprovalMessageParams = { + query: string; + userId: string; + tokenId: string; + publicAccessToken: string; + input: string; +}; + +export async function sendSQLApprovalMessage({ + query, + userId, + tokenId, + publicAccessToken, + input, +}: SendApprovalMessageParams) { + return await logger.trace( + "sendSQLApprovalMessage", + async (span) => { + const response = await slack.chat.postMessage({ + channel: process.env.SLACK_CHANNEL_ID!, + text: `SQL Query Approval Required for user ${userId}`, // Fallback text for notifications + blocks: [ + { + type: "header", + text: { + type: "plain_text", + text: "🚨 SQL Query Approval Required", + emoji: true, + }, + }, + { + type: "context", + elements: [ + { + type: "mrkdwn", + text: `*Requested by:* <@${userId}>`, + }, + ], + }, + { + type: "section", + text: { + type: "mrkdwn", + text: "*User Request:*\n" + input, + }, + }, + { + type: "section", + text: { + type: "mrkdwn", + text: "*Generated Query:*\n```sql\n" + query + "\n```", + }, + }, + { + type: "actions", + block_id: "sql_approval_actions", + elements: [ + { + type: "button", + text: { + type: "plain_text", + text: "Approve ✅", + emoji: true, + }, + style: "primary", + value: JSON.stringify({ + tokenId, + publicAccessToken, + action: "approve", + }), + action_id: "sql_approve", + }, + { + type: "button", + text: { + type: "plain_text", + text: "Deny ❌", + emoji: true, + }, + style: "danger", + value: JSON.stringify({ + tokenId, + publicAccessToken, + action: "deny", + }), + action_id: "sql_deny", + }, + ], + }, + { + type: "context", + elements: [ + { + type: "mrkdwn", + text: "⚠️ This action cannot be undone", + }, + ], + }, + ], + }); + + return response; + }, + { + icon: "tabler-brand-slack", + } + ); +} diff --git a/references/d3-demo/src/trigger/chat.ts b/references/d3-openai-agents/src/trigger/chat.ts similarity index 100% rename from references/d3-demo/src/trigger/chat.ts rename to references/d3-openai-agents/src/trigger/chat.ts diff --git a/references/d3-demo/src/trigger/d3Demo.ts b/references/d3-openai-agents/src/trigger/openaiAgent.ts similarity index 100% rename from references/d3-demo/src/trigger/d3Demo.ts rename to references/d3-openai-agents/src/trigger/openaiAgent.ts diff --git a/references/d3-demo/src/trigger/python/agent.py b/references/d3-openai-agents/src/trigger/python/agent.py similarity index 100% rename from references/d3-demo/src/trigger/python/agent.py rename to references/d3-openai-agents/src/trigger/python/agent.py diff --git a/references/d3-demo/src/trigger/schemas.ts b/references/d3-openai-agents/src/trigger/schemas.ts similarity index 89% rename from references/d3-demo/src/trigger/schemas.ts rename to references/d3-openai-agents/src/trigger/schemas.ts index 5c51a1a39b..c2e5982a1b 100644 --- a/references/d3-demo/src/trigger/schemas.ts +++ b/references/d3-openai-agents/src/trigger/schemas.ts @@ -38,3 +38,9 @@ export const RowEnrichmentResult = z.object({ }); export type RowEnrichmentResult = z.infer; + +export const QueryApproval = z.object({ + approved: z.boolean().describe("Whether the query has been approved"), +}); + +export type QueryApproval = z.infer; diff --git a/references/d3-demo/tailwind.config.ts b/references/d3-openai-agents/tailwind.config.ts similarity index 100% rename from references/d3-demo/tailwind.config.ts rename to references/d3-openai-agents/tailwind.config.ts diff --git a/references/d3-demo/trigger.config.ts b/references/d3-openai-agents/trigger.config.ts similarity index 100% rename from references/d3-demo/trigger.config.ts rename to references/d3-openai-agents/trigger.config.ts diff --git a/references/d3-openai-agents/tsconfig.json b/references/d3-openai-agents/tsconfig.json new file mode 100644 index 0000000000..c1334095f8 --- /dev/null +++ b/references/d3-openai-agents/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}
+ {JSON.stringify(input, null, 2)} +
+ {JSON.stringify(output, null, 2)} +