diff --git a/.claude/settings.json b/.claude/settings.json index 9a3670860..7b4574481 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,8 +1,11 @@ { "permissions": { "allow": [ + "Bash(sleep:*)", "Bash(make:*)", "Bash(make)", + "Bash(mise:*)", + "Bash(mise)", "Bash(nox:*)", "Bash(nox)", "Bash(pytest:*)", diff --git a/.github/workflows/temporal-js-build-test.yaml b/.github/workflows/temporal-js-build-test.yaml new file mode 100644 index 000000000..ba14129f6 --- /dev/null +++ b/.github/workflows/temporal-js-build-test.yaml @@ -0,0 +1,46 @@ +name: temporal-js + +on: + pull_request: + paths: + - "integrations/temporal-js/**" + - "js/**" + - ".github/workflows/temporal-js-test.yaml" + push: + branches: [main] + paths: + - "integrations/temporal-js/**" + - "js/**" + +jobs: + build-and-test: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + node-version: [20, 22] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build braintrust + working-directory: js + run: pnpm run build + + - name: Build @braintrust/temporal + working-directory: integrations/temporal-js + run: pnpm run build + + - name: Run @braintrust/temporal tests + working-directory: integrations/temporal-js + run: pnpm run test diff --git a/integrations/temporal-js/README.md b/integrations/temporal-js/README.md new file mode 100644 index 000000000..d9b20bebe --- /dev/null +++ b/integrations/temporal-js/README.md @@ -0,0 +1,54 @@ +# @braintrust/temporal + +SDK for integrating [Braintrust](https://braintrust.dev) tracing with [Temporal](https://temporal.io/) workflows and activities. + +## Installation + +This package has peer dependencies that you must install alongside it: + +```bash +npm install @braintrust/temporal braintrust @temporalio/client @temporalio/worker @temporalio/workflow @temporalio/activity @temporalio/common +# or +yarn add @braintrust/temporal braintrust @temporalio/client @temporalio/worker @temporalio/workflow @temporalio/activity @temporalio/common +# or +pnpm add @braintrust/temporal braintrust @temporalio/client @temporalio/worker @temporalio/workflow @temporalio/activity @temporalio/common +``` + +## Usage + +Initialize Braintrust, then install the plugin on both the Temporal client and worker. + +```typescript +import { Client, Connection } from "@temporalio/client"; +import { Worker } from "@temporalio/worker"; +import * as braintrust from "braintrust"; +import { BraintrustTemporalPlugin } from "@braintrust/temporal"; + +braintrust.initLogger({ projectName: "my-project" }); + +const plugin = new BraintrustTemporalPlugin(); + +const client = new Client({ + connection: await Connection.connect(), + plugins: [plugin], +}); + +const worker = await Worker.create({ + taskQueue: "my-queue", + workflowsPath: require.resolve("./workflows"), + activities, + plugins: [plugin], +}); +``` + +## Workflow interceptors + +This package also exports workflow interceptors that are loaded into the Temporal workflow isolate: + +- `@braintrust/temporal/workflow-interceptors` + +The `BraintrustTemporalPlugin` automatically configures `workflowModules` to include these interceptors when used on a worker. + +## Example + +See the example app in `examples/temporal`. diff --git a/integrations/temporal-js/examples/temporal/.env.example b/integrations/temporal-js/examples/temporal/.env.example new file mode 100644 index 000000000..79bf2de0e --- /dev/null +++ b/integrations/temporal-js/examples/temporal/.env.example @@ -0,0 +1,2 @@ +# Braintrust API key for tracing +BRAINTRUST_API_KEY=your-api-key-here diff --git a/integrations/temporal-js/examples/temporal/.gitignore b/integrations/temporal-js/examples/temporal/.gitignore new file mode 100644 index 000000000..9c97bbd46 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +.env diff --git a/integrations/temporal-js/examples/temporal/Procfile b/integrations/temporal-js/examples/temporal/Procfile new file mode 100644 index 000000000..42699294b --- /dev/null +++ b/integrations/temporal-js/examples/temporal/Procfile @@ -0,0 +1,4 @@ +server: temporal server start-dev +worker1: pnpm run worker +worker2: pnpm run worker +worker3: pnpm run worker diff --git a/integrations/temporal-js/examples/temporal/README.md b/integrations/temporal-js/examples/temporal/README.md new file mode 100644 index 000000000..376f5e8ed --- /dev/null +++ b/integrations/temporal-js/examples/temporal/README.md @@ -0,0 +1,183 @@ +# Temporal + Braintrust Tracing Example + +This example demonstrates how to integrate Braintrust tracing with Temporal workflows and activities. + +## Prerequisites + +- [mise](https://mise.jdx.dev/) (recommended) - automatically installs all dependencies +- OR manually install: + - Node.js 20+ + - `pnpm` + - Temporal CLI (`temporal`) + - Optional: [`overmind`](https://github.com/DarthSim/overmind) (only if you want to use the included `Procfile`) + +### Option 1: Using mise (recommended) + +[mise](https://mise.jdx.dev/) will automatically install and manage all required tools (Node.js, Temporal CLI, overmind, and dependencies): + +**Install mise:** + +```bash +# macOS/Linux +curl https://mise.run | sh + +# Or using Homebrew +brew install mise +``` + +**Setup and run:** + +```bash +# Copy and configure environment +cp .env.example .env +# Edit .env with your BRAINTRUST_API_KEY + +# mise will automatically install tools and dependencies +mise run server # Start temporal server and workers + +# In another terminal: +mise run workflow # Run the workflow client +``` + +**Available mise tasks:** + +```bash +mise run install # Install dependencies +mise run server # Run temporal server and workers +mise run workflow # Run workflow client +mise run stop # Stop temporal server and workers +mise run kill # Force kill all processes +``` + +### Option 2: Manual installation + +#### Installing Temporal CLI + +The Temporal CLI is required to run the local Temporal server: + +**macOS:** + +```bash +brew install temporal +``` + +**Linux:** + +```bash +# Using Homebrew +brew install temporal + +# Or using curl +curl -sSf https://temporal.download/cli.sh | sh +``` + +**Windows:** + +```powershell +# Using Scoop +scoop install temporal + +# Or download from releases +# https://github.com/temporalio/cli/releases +``` + +Verify the installation: + +```bash +temporal --version +``` + +#### Installing overmind (optional) + +Overmind is a process manager that makes it easy to run multiple services together. If you want to use `overmind start` to run everything at once, install it for your platform: + +**macOS:** + +```bash +brew install overmind +``` + +**Linux:** + +```bash +brew install overmind + +# Or download from releases +# https://github.com/DarthSim/overmind/releases +``` + +**Windows:** +Overmind is not officially supported on Windows. Use the manual approach below instead. + +## Setup + +```bash +# Copy and configure environment +cp .env.example .env +# Edit .env with your BRAINTRUST_API_KEY + +# Install dependencies +pnpm install +``` + +## Running the Example + +### Option 1: Using overmind + +Start the temporal server and workers together: + +```bash +overmind start +``` + +Then in another terminal, run the workflow: + +```bash +pnpm run client +``` + +### Option 2: Manual + +1. Start the Temporal server: + +```bash +temporal server start-dev +``` + +2. Start the worker: + +```bash +pnpm run worker +``` + +3. Run the client: + +```bash +pnpm run client + +# Or with a signal: +pnpm run client -- --signal +``` + +## What Gets Traced + +- **Client span**: Wraps the workflow execution call +- **Workflow span**: Created via sinks when the workflow starts +- **Activity spans**: Created for each activity execution with parent linking + +The trace hierarchy looks like: + +``` +Client span ("example.temporal.workflow") + └── Workflow span ("temporal.workflow.simpleWorkflow") + └── Activity span ("temporal.activity.addTen") + └── Activity span ("temporal.activity.multiplyByTwo") + └── Activity span ("temporal.activity.subtractFive") +``` + +## How It Works + +1. **Client interceptor**: Captures the current Braintrust span context and adds it to workflow headers +2. **Workflow interceptor**: Extracts parent context from headers and creates a workflow span via sinks +3. **Sinks**: Allow the workflow isolate to call into Node.js to create spans (with `callDuringReplay: false`) +4. **Activity interceptor**: Creates spans for each activity, using the workflow span as parent diff --git a/integrations/temporal-js/examples/temporal/mise.toml b/integrations/temporal-js/examples/temporal/mise.toml new file mode 100644 index 000000000..b331ddd45 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/mise.toml @@ -0,0 +1,40 @@ +# Mise will automatically read and use .tool-versions files as well as this file. +[settings] +experimental=true + +[env] +# See env.example to configure API keys. +_.file = ".env" + +[tools] +node = "20" +temporal = "latest" +overmind = "latest" + +[hooks] +postinstall = "mise run install" + +[tasks.install] +description = "Install dependencies" +run = "pnpm install --ignore-workspace" + +[tasks.server] +description = "Run temporal server and workers" +run = "overmind s" + +[tasks.workflow] +description = "Run workflow client" +run = "pnpm exec ts-node src/client.ts" + +[tasks.stop] +description = "Stop temporal server and workers" +run = "overmind quit || true" + +[tasks.kill] +description = "Force kill temporal server and workers" +run = """ +pkill -f 'examples/temporal.*ts-node' 2>/dev/null || true +pkill -f 'overmind.*temporal' 2>/dev/null || true +rm -f .overmind.sock +echo 'Server killed' +""" diff --git a/integrations/temporal-js/examples/temporal/package.json b/integrations/temporal-js/examples/temporal/package.json new file mode 100644 index 000000000..5993e2ac2 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/package.json @@ -0,0 +1,26 @@ +{ + "name": "temporal-example", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "tsc", + "worker": "pnpm exec ts-node src/worker.ts", + "client": "pnpm exec ts-node src/client.ts" + }, + "dependencies": { + "@braintrust/temporal": "^0.1.0", + "@temporalio/activity": "^1.11.0", + "@temporalio/client": "^1.11.0", + "@temporalio/common": "^1.11.0", + "@temporalio/worker": "^1.11.0", + "@temporalio/workflow": "^1.11.0", + "braintrust": "^2.0.0", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/uuid": "^9.0.0", + "ts-node": "^10.9.0", + "typescript": "^5.0.0" + } +} diff --git a/integrations/temporal-js/examples/temporal/src/activities.ts b/integrations/temporal-js/examples/temporal/src/activities.ts new file mode 100644 index 000000000..d14833191 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/src/activities.ts @@ -0,0 +1,42 @@ +import * as braintrust from "braintrust"; + +export interface TaskInput { + value: number; +} + +export async function addTen(input: TaskInput): Promise { + console.log(`Adding 10 to ${input.value}`); + + // Test child span within activity + const result = await braintrust.traced( + async (span) => { + span.log({ + input: { value: input.value, operation: "add", operand: 10 }, + }); + await new Promise((resolve) => setTimeout(resolve, 500)); + const sum = input.value + 10; + span.log({ output: sum }); + return sum; + }, + { name: "compute.addition" }, + ); + + console.log(`Result: ${input.value} + 10 = ${result}`); + return result; +} + +export async function multiplyByTwo(input: TaskInput): Promise { + console.log(`Multiplying ${input.value} by 2`); + await new Promise((resolve) => setTimeout(resolve, 300)); + const result = input.value * 2; + console.log(`Result: ${input.value} * 2 = ${result}`); + return result; +} + +export async function subtractFive(input: TaskInput): Promise { + console.log(`Subtracting 5 from ${input.value}`); + await new Promise((resolve) => setTimeout(resolve, 300)); + const result = input.value - 5; + console.log(`Result: ${input.value} - 5 = ${result}`); + return result; +} diff --git a/integrations/temporal-js/examples/temporal/src/client.ts b/integrations/temporal-js/examples/temporal/src/client.ts new file mode 100644 index 000000000..6ee408207 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/src/client.ts @@ -0,0 +1,53 @@ +import { Client, Connection } from "@temporalio/client"; +import { v4 as uuid } from "uuid"; +import * as braintrust from "braintrust"; +import { BraintrustTemporalPlugin } from "@braintrust/temporal"; +import { simpleWorkflow } from "./workflows"; +import type { TaskInput } from "./activities"; + +const TASK_QUEUE = "braintrust-example-task-queue"; + +async function main() { + braintrust.initLogger({ projectName: "temporal-example" }); + + const connection = await Connection.connect({ + address: "localhost:7233", + }); + + const client = new Client({ + connection, + namespace: "default", + plugins: [new BraintrustTemporalPlugin()], + }); + + const inputData: TaskInput = { value: 5 }; + const workflowId = `simple-workflow-${uuid().slice(0, 8)}`; + + console.log(`Starting workflow with value: ${inputData.value}`); + console.log(`Workflow ID: ${workflowId}`); + + // Wrap in a Braintrust span + await braintrust.traced( + async (span) => { + const handle = await client.workflow.start(simpleWorkflow, { + args: [inputData], + taskQueue: TASK_QUEUE, + workflowId, + }); + + const result = await handle.result(); + span.log({ output: result }); + console.log(`\nResult: ${result}`); + console.log(`\nView trace: ${span.link()}`); + return result; + }, + { name: "temporal.client.simpleWorkflow" }, + ); + + await braintrust.flush(); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/integrations/temporal-js/examples/temporal/src/worker.ts b/integrations/temporal-js/examples/temporal/src/worker.ts new file mode 100644 index 000000000..5f1488fb8 --- /dev/null +++ b/integrations/temporal-js/examples/temporal/src/worker.ts @@ -0,0 +1,31 @@ +import { Worker, NativeConnection } from "@temporalio/worker"; +import * as braintrust from "braintrust"; +import { BraintrustTemporalPlugin } from "@braintrust/temporal"; +import * as activities from "./activities"; + +const TASK_QUEUE = "braintrust-example-task-queue"; + +async function main() { + braintrust.initLogger({ projectName: "temporal-example" }); + + const connection = await NativeConnection.connect({ + address: "localhost:7233", + }); + + const worker = await Worker.create({ + connection, + namespace: "default", + taskQueue: TASK_QUEUE, + workflowsPath: require.resolve("./workflows"), + activities, + plugins: [new BraintrustTemporalPlugin()], + }); + + console.log(`Worker started on task queue: ${TASK_QUEUE}`); + await worker.run(); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/integrations/temporal-js/examples/temporal/src/workflows.ts b/integrations/temporal-js/examples/temporal/src/workflows.ts new file mode 100644 index 000000000..cf8dc4b5d --- /dev/null +++ b/integrations/temporal-js/examples/temporal/src/workflows.ts @@ -0,0 +1,47 @@ +import { + proxyActivities, + sleep, + workflowInfo, + defineSignal, + setHandler, + log, +} from "@temporalio/workflow"; +import type * as activities from "./activities"; + +const { addTen, multiplyByTwo, subtractFive } = proxyActivities< + typeof activities +>({ + startToCloseTimeout: "10 seconds", +}); + +export const addSignalValue = defineSignal<[number]>("addSignalValue"); + +export interface TaskInput { + value: number; +} + +export async function simpleWorkflow(input: TaskInput): Promise { + log.info(`Starting workflow with value: ${input.value}`); + + let signalValue = 0; + setHandler(addSignalValue, (value: number) => { + log.info(`Received signal with value: ${value}`); + signalValue += value; + }); + + // Step 1: Add 10 + const step1 = await addTen({ value: input.value }); + log.info(`After step 1: ${step1}`); + + // Step 2: Multiply by 2 + const step2 = await multiplyByTwo({ value: step1 }); + log.info(`After step 2: ${step2}`); + + // Step 3: Subtract 5 + const step3 = await subtractFive({ value: step2 }); + log.info(`After step 3: ${step3}`); + + const finalResult = `Complete: ${input.value} -> +10=${step1} -> *2=${step2} -> -5=${step3} + signal(${signalValue}) = ${step3 + signalValue}`; + log.info(finalResult); + return finalResult; +} diff --git a/integrations/temporal-js/examples/temporal/tsconfig.json b/integrations/temporal-js/examples/temporal/tsconfig.json new file mode 100644 index 000000000..4372a9f5c --- /dev/null +++ b/integrations/temporal-js/examples/temporal/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2021", + "module": "commonjs", + "lib": ["ES2021"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src", + "declaration": true + }, + "include": ["src/**/*"] +} diff --git a/integrations/temporal-js/package.json b/integrations/temporal-js/package.json new file mode 100644 index 000000000..9f63318da --- /dev/null +++ b/integrations/temporal-js/package.json @@ -0,0 +1,71 @@ +{ + "name": "@braintrust/temporal", + "version": "0.1.0", + "description": "SDK for integrating Braintrust with Temporal", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "module": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./workflow-interceptors": { + "types": "./dist/workflow-interceptors.d.ts", + "import": "./dist/workflow-interceptors.mjs", + "module": "./dist/workflow-interceptors.mjs", + "require": "./dist/workflow-interceptors.js" + } + }, + "scripts": { + "build": "tsup", + "watch": "tsup --watch", + "clean": "rm -r dist/*", + "test": "vitest run" + }, + "author": "Braintrust Data Inc.", + "license": "MIT", + "devDependencies": { + "@temporalio/activity": "^1.14.1", + "@temporalio/client": "^1.14.1", + "@temporalio/common": "^1.14.1", + "@temporalio/worker": "^1.14.1", + "@temporalio/workflow": "^1.14.1", + "@types/node": "^22.15.21", + "braintrust": "workspace:*", + "tsup": "^8.5.0", + "typescript": "5.5.4", + "vitest": "^2.1.9" + }, + "peerDependencies": { + "@temporalio/activity": ">=1.11.0", + "@temporalio/client": ">=1.11.0", + "@temporalio/common": ">=1.11.0", + "@temporalio/worker": ">=1.11.0", + "@temporalio/workflow": ">=1.11.0", + "braintrust": ">=2.0.0" + }, + "peerDependenciesMeta": { + "braintrust": { + "optional": false + }, + "@temporalio/activity": { + "optional": false + }, + "@temporalio/client": { + "optional": false + }, + "@temporalio/common": { + "optional": false + }, + "@temporalio/worker": { + "optional": false + }, + "@temporalio/workflow": { + "optional": false + } + } +} diff --git a/integrations/temporal-js/src/index.ts b/integrations/temporal-js/src/index.ts new file mode 100644 index 000000000..367ba8de4 --- /dev/null +++ b/integrations/temporal-js/src/index.ts @@ -0,0 +1,50 @@ +/** + * Braintrust integration for Temporal workflows and activities. + * + * This module provides a plugin that automatically creates Braintrust spans + * for Temporal workflows and activities, with proper parent-child relationships + * across distributed workers. + * + * @example + * ```typescript + * import { Client, Connection } from "@temporalio/client"; + * import { Worker } from "@temporalio/worker"; + * import * as braintrust from "braintrust"; + * import { createBraintrustTemporalPlugin } from "@braintrust/temporal"; + * + * // Initialize Braintrust logger + * braintrust.initLogger({ projectName: "my-project" }); + * + * // Create the plugin + * const braintrustPlugin = createBraintrustTemporalPlugin(); + * + * // Create client with the plugin + * const client = new Client({ + * connection: await Connection.connect(), + * plugins: [braintrustPlugin], + * }); + * + * // Create worker with the plugin + * const worker = await Worker.create({ + * taskQueue: "my-queue", + * workflowsPath: require.resolve("./workflows"), + * activities, + * plugins: [braintrustPlugin], + * }); + * ``` + * + * The resulting trace will show: + * ``` + * trigger-workflow (client span) + * └── temporal.workflow.myWorkflow + * ├── temporal.activity.activityOne + * └── temporal.activity.activityTwo + * ``` + */ + +export { + BraintrustTemporalPlugin, + createBraintrustTemporalPlugin, +} from "./plugin"; + +export type { BraintrustSinks } from "./sinks"; diff --git a/integrations/temporal-js/src/interceptors.ts b/integrations/temporal-js/src/interceptors.ts new file mode 100644 index 000000000..ac32133e7 --- /dev/null +++ b/integrations/temporal-js/src/interceptors.ts @@ -0,0 +1,184 @@ +import type { Context } from "@temporalio/activity"; +import type { + ActivityInboundCallsInterceptor, + ActivityExecuteInput, + Next, + ActivityInterceptors, +} from "@temporalio/worker"; +import type { WorkflowClientInterceptor } from "@temporalio/client"; +import { defaultPayloadConverter } from "@temporalio/common"; +import * as braintrust from "braintrust"; +import { SpanComponentsV3 } from "braintrust/util"; +import { getWorkflowSpanExport } from "./sinks"; +import { + BRAINTRUST_SPAN_HEADER, + BRAINTRUST_WORKFLOW_SPAN_ID_HEADER, + deserializeHeaderValue, +} from "./utils"; + +/** + * Create a client interceptor that propagates Braintrust span context to workflows. + * Use this when creating a Temporal Client to enable trace context propagation. + */ +export function createBraintrustClientInterceptor(): WorkflowClientInterceptor { + return { + async start(input, next) { + const span = braintrust.currentSpan(); + if (span) { + const exported = await span.export(); + if (exported) { + const payload = defaultPayloadConverter.toPayload(exported); + if (payload) { + return next({ + ...input, + headers: { + ...input.headers, + [BRAINTRUST_SPAN_HEADER]: payload, + }, + }); + } + } + } + return next(input); + }, + async signal(input, next) { + return next(input); + }, + async signalWithStart(input, next) { + const span = braintrust.currentSpan(); + if (span) { + const exported = await span.export(); + if (exported) { + const payload = defaultPayloadConverter.toPayload(exported); + if (payload) { + return next({ + ...input, + headers: { + ...input.headers, + [BRAINTRUST_SPAN_HEADER]: payload, + }, + }); + } + } + } + return next(input); + }, + }; +} + +/** + * Activity interceptor that creates Braintrust spans for activity executions. + */ +class BraintrustActivityInterceptor implements ActivityInboundCallsInterceptor { + constructor(private ctx: Context) {} + + async execute( + input: ActivityExecuteInput, + next: Next, + ): Promise { + const info = this.ctx.info; + const runId = info.workflowExecution.runId; + + // Try to get workflow span export - first check local Map, then headers + let parent: string | undefined; + + // Check if we have the workflow span export locally (same worker as workflow) + const spanExportPromise = getWorkflowSpanExport(runId); + if (spanExportPromise) { + try { + parent = await spanExportPromise; + } catch { + // Ignore errors, fall through to header check + } + } + + // For cross-worker activities: construct parent from workflow span ID + client context + if (!parent && input.headers) { + const workflowSpanId = deserializeHeaderValue( + input.headers[BRAINTRUST_WORKFLOW_SPAN_ID_HEADER], + ); + const clientContext = deserializeHeaderValue( + input.headers[BRAINTRUST_SPAN_HEADER], + ); + + if (workflowSpanId && clientContext) { + try { + const clientComponents = SpanComponentsV3.fromStr(clientContext); + const clientData = clientComponents.data; + + // We can only construct a workflow parent if we have: + // 1. Tracing context (root_span_id) + // 2. Object metadata (object_id or compute_object_metadata_args) + const hasTracingContext = !!clientData.root_span_id; + const hasObjectMetadata = + !!clientData.object_id || !!clientData.compute_object_metadata_args; + + if (hasTracingContext && hasObjectMetadata) { + // Construct workflow parent with the workflow's span ID + // IMPORTANT: row_id must match span_id for the parent span + // Must provide EITHER object_id OR compute_object_metadata_args, not both + const workflowComponents = new SpanComponentsV3({ + object_type: clientData.object_type, + object_id: clientData.object_id || undefined, + compute_object_metadata_args: clientData.object_id + ? undefined + : clientData.compute_object_metadata_args || undefined, + propagated_event: clientData.propagated_event, + row_id: workflowSpanId, // Use workflow's row_id, not client's + span_id: workflowSpanId, // Use workflow's span_id, not client's + root_span_id: clientData.root_span_id, // Keep same trace + }); + + parent = workflowComponents.toStr(); + } else { + // Client context doesn't have root_span_id, use it directly + parent = clientContext; + } + } catch { + // Fall back to client context if parsing fails + parent = clientContext; + } + } else if (clientContext) { + // No workflow span ID, use client context directly + parent = clientContext; + } + } + + const span = braintrust.startSpan({ + name: `temporal.activity.${info.activityType}`, + spanAttributes: { type: "task" }, + parent, + event: { + metadata: { + "temporal.activity_type": info.activityType, + "temporal.activity_id": info.activityId, + "temporal.workflow_id": info.workflowExecution.workflowId, + "temporal.workflow_run_id": runId, + }, + }, + }); + + try { + const result = await braintrust.withCurrent(span, () => next(input)); + span.log({ output: result }); + span.end(); + return result; + } catch (e) { + span.log({ error: String(e) }); + span.end(); + throw e; + } + } +} + +/** + * Create an activity interceptor factory for use with Worker.create(). + * This factory creates BraintrustActivityInterceptor instances for each activity. + */ +export function createBraintrustActivityInterceptor( + ctx: Context, +): ActivityInterceptors { + return { + inbound: new BraintrustActivityInterceptor(ctx), + }; +} diff --git a/integrations/temporal-js/src/plugin.ts b/integrations/temporal-js/src/plugin.ts new file mode 100644 index 000000000..18ee740aa --- /dev/null +++ b/integrations/temporal-js/src/plugin.ts @@ -0,0 +1,128 @@ +import type { ClientPlugin, ClientOptions } from "@temporalio/client"; +import type { WorkerPlugin, WorkerOptions } from "@temporalio/worker"; +import { + createBraintrustClientInterceptor, + createBraintrustActivityInterceptor, +} from "./interceptors"; +import { createBraintrustSinks } from "./sinks"; + +/** + * A Braintrust plugin for Temporal that automatically instruments + * workflows and activities with tracing spans. + * + * This plugin implements both ClientPlugin and WorkerPlugin interfaces, + * so it can be used with both Temporal Client and Worker. + * + * @example + * ```typescript + * import { Client, Connection } from "@temporalio/client"; + * import { Worker } from "@temporalio/worker"; + * import * as braintrust from "braintrust"; + * import { BraintrustTemporalPlugin } from "@braintrust/temporal"; + * + * // Initialize Braintrust logger + * braintrust.initLogger({ projectName: "my-project" }); + * + * // Create client with the plugin + * const client = new Client({ + * connection: await Connection.connect(), + * plugins: [new BraintrustTemporalPlugin()], + * }); + * + * // Create worker with the plugin + * const worker = await Worker.create({ + * taskQueue: "my-queue", + * workflowsPath: require.resolve("./workflows"), + * activities, + * plugins: [new BraintrustTemporalPlugin()], + * }); + * ``` + */ +export class BraintrustTemporalPlugin implements ClientPlugin, WorkerPlugin { + get name(): string { + return "braintrust"; + } + + /** + * Configure the Temporal Client with Braintrust interceptors. + * Adds the client interceptor for propagating span context to workflows. + */ + configureClient( + options: Omit, + ): Omit { + const existing = options.interceptors?.workflow; + const braintrustInterceptor = createBraintrustClientInterceptor(); + + // workflow can be an array or an object with named interceptors + let workflow: typeof existing; + if (Array.isArray(existing)) { + workflow = [...existing, braintrustInterceptor]; + } else if (existing) { + // It's a WorkflowClientInterceptors object, merge our interceptor + workflow = { + ...existing, + ...braintrustInterceptor, + }; + } else { + workflow = [braintrustInterceptor]; + } + + return { + ...options, + interceptors: { + ...options.interceptors, + workflow, + }, + }; + } + + /** + * Configure the Temporal Worker with Braintrust interceptors and sinks. + * Adds the activity interceptor for creating spans, the sinks for workflow spans, + * and the workflow interceptor modules for bundling. + */ + configureWorker(options: WorkerOptions): WorkerOptions { + const existingActivityInterceptors = options.interceptors?.activity ?? []; + const existingWorkflowModules = options.interceptors?.workflowModules ?? []; + const existingSinks = options.sinks ?? {}; + + const braintrustSinks = createBraintrustSinks(); + + // Resolve the workflow interceptors module path + // This needs to be resolved at runtime to get the actual file path + const workflowInterceptorsPath = require.resolve( + "@braintrust/temporal/workflow-interceptors", + ); + + return { + ...options, + interceptors: { + ...options.interceptors, + activity: [ + ...existingActivityInterceptors, + createBraintrustActivityInterceptor, + ], + workflowModules: [...existingWorkflowModules, workflowInterceptorsPath], + }, + sinks: { + ...existingSinks, + ...braintrustSinks, + }, + }; + } +} + +/** + * Create a Braintrust plugin for Temporal. + * + * @example + * ```typescript + * const plugin = createBraintrustTemporalPlugin(); + * + * const client = new Client({ plugins: [plugin] }); + * const worker = await Worker.create({ plugins: [plugin], ... }); + * ``` + */ +export function createBraintrustTemporalPlugin(): BraintrustTemporalPlugin { + return new BraintrustTemporalPlugin(); +} diff --git a/integrations/temporal-js/src/sinks.ts b/integrations/temporal-js/src/sinks.ts new file mode 100644 index 000000000..bd2967ca4 --- /dev/null +++ b/integrations/temporal-js/src/sinks.ts @@ -0,0 +1,76 @@ +import type { WorkflowInfo, Sinks } from "@temporalio/workflow"; +import type { InjectedSinks } from "@temporalio/worker"; +import * as braintrust from "braintrust"; + +// Sink interface (used in workflow code via proxySinks) +// NOTE: WorkflowInfo is NOT included here - it's automatically injected by the runtime +export interface BraintrustSinks extends Sinks { + braintrust: { + workflowStarted(parentContext?: string, workflowSpanId?: string): void; + workflowCompleted(error?: string): void; + }; +} + +// Active workflow spans tracked by run ID +const workflowSpans = new Map(); +// Workflow span exports tracked by run ID (as promises for async export) +const workflowSpanExports = new Map>(); + +/** + * Get the exported span context for a workflow by run ID. + * Activities on the same worker can use this to parent to the workflow span. + */ +export function getWorkflowSpanExport( + runId: string, +): Promise | undefined { + return workflowSpanExports.get(runId); +} + +/** + * Create the Braintrust sinks for workflow span management. + * These sinks are called from the workflow isolate via proxySinks. + */ +export function createBraintrustSinks(): InjectedSinks { + return { + braintrust: { + workflowStarted: { + fn: ( + info: WorkflowInfo, + parentContext?: string, + workflowSpanId?: string, + ) => { + const span = braintrust.startSpan({ + name: `temporal.workflow.${info.workflowType}`, + spanAttributes: { type: "task" }, + parent: parentContext, + spanId: workflowSpanId, + event: { + metadata: { + "temporal.workflow_type": info.workflowType, + "temporal.workflow_id": info.workflowId, + "temporal.run_id": info.runId, + }, + }, + }); + workflowSpans.set(info.runId, span); + workflowSpanExports.set(info.runId, span.export()); + }, + callDuringReplay: false, + }, + workflowCompleted: { + fn: (info: WorkflowInfo, error?: string) => { + const span = workflowSpans.get(info.runId); + if (span) { + if (error) { + span.log({ error }); + } + span.end(); + workflowSpans.delete(info.runId); + workflowSpanExports.delete(info.runId); + } + }, + callDuringReplay: false, + }, + }, + }; +} diff --git a/integrations/temporal-js/src/temporal.test.ts b/integrations/temporal-js/src/temporal.test.ts new file mode 100644 index 000000000..80f932acf --- /dev/null +++ b/integrations/temporal-js/src/temporal.test.ts @@ -0,0 +1,243 @@ +import { expect, test, describe } from "vitest"; +import { + serializeHeaderValue, + deserializeHeaderValue, + BRAINTRUST_SPAN_HEADER, + BRAINTRUST_WORKFLOW_SPAN_HEADER, + BRAINTRUST_WORKFLOW_SPAN_ID_HEADER, +} from "./utils"; +import { SpanComponentsV3, SpanObjectTypeV3 } from "braintrust/util"; +import { + BraintrustTemporalPlugin, + createBraintrustTemporalPlugin, +} from "./plugin"; + +describe("temporal header utilities", () => { + test("serializeHeaderValue encodes string correctly", () => { + const value = "test-span-id"; + const payload = serializeHeaderValue(value); + + expect(payload.metadata?.encoding).toBeDefined(); + expect(payload.data).toBeDefined(); + expect(new TextDecoder().decode(payload.metadata?.encoding)).toBe( + "json/plain", + ); + expect(new TextDecoder().decode(payload.data)).toBe('"test-span-id"'); + }); + + test("deserializeHeaderValue decodes payload correctly", () => { + const original = "test-value-123"; + const payload = serializeHeaderValue(original); + const decoded = deserializeHeaderValue(payload); + + expect(decoded).toBe(original); + }); + + test("deserializeHeaderValue handles undefined payload", () => { + expect(deserializeHeaderValue(undefined)).toBeUndefined(); + }); + + test("deserializeHeaderValue handles payload without data", () => { + expect(deserializeHeaderValue({ metadata: {} })).toBeUndefined(); + }); + + test("deserializeHeaderValue handles invalid JSON", () => { + const payload = { + data: new TextEncoder().encode("not valid json"), + }; + expect(deserializeHeaderValue(payload)).toBeUndefined(); + }); + + test("round-trip serialization preserves complex strings", () => { + const testCases = [ + "simple", + "with spaces", + "with/slashes", + "unicode-日本語", + "emoji-👋", + "", + ]; + + for (const value of testCases) { + const payload = serializeHeaderValue(value); + const decoded = deserializeHeaderValue(payload); + expect(decoded).toBe(value); + } + }); + + test("header constants are defined", () => { + expect(BRAINTRUST_SPAN_HEADER).toBe("_braintrust-span"); + expect(BRAINTRUST_WORKFLOW_SPAN_HEADER).toBe("_braintrust-workflow-span"); + expect(BRAINTRUST_WORKFLOW_SPAN_ID_HEADER).toBe( + "_braintrust-workflow-span-id", + ); + }); +}); + +describe("SpanComponentsV3 cross-worker reconstruction", () => { + test("can parse and reconstruct span components with new span_id", () => { + const clientComponents = new SpanComponentsV3({ + object_type: SpanObjectTypeV3.PROJECT_LOGS, + object_id: "project-123", + row_id: "row-456", + span_id: "client-span-id", + root_span_id: "root-span-id", + }); + + const clientContext = clientComponents.toStr(); + const workflowSpanId = "workflow-span-id"; + + const parsed = SpanComponentsV3.fromStr(clientContext); + const data = parsed.data; + + expect(data.row_id).toBe("row-456"); + expect(data.root_span_id).toBe("root-span-id"); + expect(data.span_id).toBe("client-span-id"); + + if (data.row_id && data.root_span_id) { + const workflowComponents = new SpanComponentsV3({ + object_type: data.object_type, + object_id: data.object_id, + propagated_event: data.propagated_event, + row_id: data.row_id, + root_span_id: data.root_span_id, + span_id: workflowSpanId, + }); + + const reconstructed = SpanComponentsV3.fromStr( + workflowComponents.toStr(), + ); + expect(reconstructed.data.span_id).toBe(workflowSpanId); + expect(reconstructed.data.row_id).toBe("row-456"); + expect(reconstructed.data.root_span_id).toBe("root-span-id"); + expect(reconstructed.data.object_id).toBe("project-123"); + } + }); + + test("preserves object_type when reconstructing", () => { + const objectTypes = [ + SpanObjectTypeV3.PROJECT_LOGS, + SpanObjectTypeV3.EXPERIMENT, + SpanObjectTypeV3.PLAYGROUND_LOGS, + ]; + + for (const objectType of objectTypes) { + const original = new SpanComponentsV3({ + object_type: objectType, + object_id: "test-id", + row_id: "row-id", + span_id: "original-span-id", + root_span_id: "root-span-id", + }); + + const parsed = SpanComponentsV3.fromStr(original.toStr()); + + const reconstructed = new SpanComponentsV3({ + object_type: parsed.data.object_type, + object_id: parsed.data.object_id, + propagated_event: parsed.data.propagated_event, + row_id: parsed.data.row_id!, + root_span_id: parsed.data.root_span_id!, + span_id: "new-span-id", + }); + + expect(reconstructed.data.object_type).toBe(objectType); + } + }); + + test("handles span components without row_id fields", () => { + const componentsWithoutRowId = new SpanComponentsV3({ + object_type: SpanObjectTypeV3.PROJECT_LOGS, + object_id: "test-id", + }); + + const parsed = SpanComponentsV3.fromStr(componentsWithoutRowId.toStr()); + + expect(parsed.data.row_id).toBeUndefined(); + expect(parsed.data.span_id).toBeUndefined(); + expect(parsed.data.root_span_id).toBeUndefined(); + }); + + test("preserves propagated_event when reconstructing", () => { + const propagatedEvent = { key: "value", nested: { inner: 123 } }; + + const original = new SpanComponentsV3({ + object_type: SpanObjectTypeV3.PROJECT_LOGS, + object_id: "test-id", + propagated_event: propagatedEvent, + row_id: "row-id", + span_id: "original-span-id", + root_span_id: "root-span-id", + }); + + const parsed = SpanComponentsV3.fromStr(original.toStr()); + + const reconstructed = new SpanComponentsV3({ + object_type: parsed.data.object_type, + object_id: parsed.data.object_id, + propagated_event: parsed.data.propagated_event, + row_id: parsed.data.row_id!, + root_span_id: parsed.data.root_span_id!, + span_id: "new-span-id", + }); + + expect(reconstructed.data.propagated_event).toEqual(propagatedEvent); + }); +}); + +describe("BraintrustTemporalPlugin", () => { + test("createBraintrustTemporalPlugin returns a plugin instance", () => { + const plugin = createBraintrustTemporalPlugin(); + expect(plugin).toBeInstanceOf(BraintrustTemporalPlugin); + expect(plugin.name).toBe("braintrust"); + }); + + test("plugin has configureClient method", () => { + const plugin = createBraintrustTemporalPlugin(); + expect(typeof plugin.configureClient).toBe("function"); + }); + + test("plugin has configureWorker method", () => { + const plugin = createBraintrustTemporalPlugin(); + expect(typeof plugin.configureWorker).toBe("function"); + }); + + test("configureClient adds workflow interceptor", () => { + const plugin = createBraintrustTemporalPlugin(); + const options = {}; + const configured = plugin.configureClient(options); + + expect(configured.interceptors).toBeDefined(); + expect(configured.interceptors?.workflow).toBeDefined(); + expect(Array.isArray(configured.interceptors?.workflow)).toBe(true); + expect(configured.interceptors?.workflow?.length).toBe(1); + }); + + test("configureClient preserves existing interceptors", () => { + const plugin = createBraintrustTemporalPlugin(); + const existingInterceptor = { start: async (i: unknown, n: unknown) => n }; + const options = { + interceptors: { + workflow: [existingInterceptor], + }, + }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const configured = plugin.configureClient(options as any); + + expect(configured.interceptors?.workflow?.length).toBe(2); + }); + + test("configureWorker adds activity interceptor and sinks", () => { + const plugin = createBraintrustTemporalPlugin(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const options = {} as any; + const configured = plugin.configureWorker(options); + + expect(configured.interceptors).toBeDefined(); + expect(configured.interceptors?.activity).toBeDefined(); + expect(Array.isArray(configured.interceptors?.activity)).toBe(true); + expect(configured.interceptors?.activity?.length).toBe(1); + expect(configured.sinks).toBeDefined(); + expect(configured.sinks?.braintrust).toBeDefined(); + }); +}); diff --git a/integrations/temporal-js/src/utils.ts b/integrations/temporal-js/src/utils.ts new file mode 100644 index 000000000..dc5add88a --- /dev/null +++ b/integrations/temporal-js/src/utils.ts @@ -0,0 +1,29 @@ +import type { Payload } from "@temporalio/common"; + +export const BRAINTRUST_SPAN_HEADER = "_braintrust-span"; +export const BRAINTRUST_WORKFLOW_SPAN_HEADER = "_braintrust-workflow-span"; +export const BRAINTRUST_WORKFLOW_SPAN_ID_HEADER = + "_braintrust-workflow-span-id"; + +export function serializeHeaderValue(value: string): Payload { + return { + metadata: { + encoding: new TextEncoder().encode("json/plain"), + }, + data: new TextEncoder().encode(JSON.stringify(value)), + }; +} + +export function deserializeHeaderValue( + payload: Payload | undefined, +): string | undefined { + if (!payload?.data) { + return undefined; + } + try { + const decoded = new TextDecoder().decode(payload.data); + return JSON.parse(decoded); + } catch { + return undefined; + } +} diff --git a/integrations/temporal-js/src/workflow-interceptors.ts b/integrations/temporal-js/src/workflow-interceptors.ts new file mode 100644 index 000000000..a1dd2bf70 --- /dev/null +++ b/integrations/temporal-js/src/workflow-interceptors.ts @@ -0,0 +1,159 @@ +/** + * Workflow interceptors for Braintrust tracing. + * + * IMPORTANT: This module is loaded into the Temporal workflow isolate. + * It cannot import Node.js modules or access external state directly. + * Communication with the outside world is done via sinks. + */ +import { + WorkflowInterceptorsFactory, + WorkflowInboundCallsInterceptor, + WorkflowOutboundCallsInterceptor, + WorkflowExecuteInput, + Next, + proxySinks, + workflowInfo, + uuid4, +} from "@temporalio/workflow"; +import type { + ActivityInput, + LocalActivityInput, + StartChildWorkflowExecutionInput, +} from "@temporalio/workflow"; +import type { Payload } from "@temporalio/common"; +import type { BraintrustSinks } from "./sinks"; +import { + BRAINTRUST_SPAN_HEADER, + BRAINTRUST_WORKFLOW_SPAN_HEADER, + BRAINTRUST_WORKFLOW_SPAN_ID_HEADER, + serializeHeaderValue, + deserializeHeaderValue, +} from "./utils"; + +const { braintrust } = proxySinks(); + +/** + * Shared state between inbound and outbound interceptors for a single workflow. + * Created per-workflow by the factory function to avoid global state issues. + */ +interface WorkflowSpanState { + parentContext: string | undefined; + spanId: string | undefined; +} + +class BraintrustWorkflowInboundInterceptor + implements WorkflowInboundCallsInterceptor +{ + constructor(private state: WorkflowSpanState) {} + + async execute( + input: WorkflowExecuteInput, + next: Next, + ): Promise { + // Extract parent context from headers + const parentContext = input.headers + ? deserializeHeaderValue(input.headers[BRAINTRUST_SPAN_HEADER]) + : undefined; + + // Store for the outbound interceptor to forward to activities + this.state.parentContext = parentContext; + + // Generate a deterministic spanId for the workflow span + this.state.spanId = uuid4(); + + // Create workflow span via sink (only called if not replaying) + // NOTE: WorkflowInfo is injected automatically by the runtime + braintrust.workflowStarted(parentContext, this.state.spanId); + + try { + const result = await next(input); + braintrust.workflowCompleted(); + return result; + } catch (e) { + braintrust.workflowCompleted(e instanceof Error ? e.message : String(e)); + throw e; + } + } +} + +class BraintrustWorkflowOutboundInterceptor + implements WorkflowOutboundCallsInterceptor +{ + constructor(private state: WorkflowSpanState) {} + + private getHeaders(): Record { + const info = workflowInfo(); + const headers: Record = {}; + + // Pass runId so activity can look up workflow span on same worker + headers[BRAINTRUST_WORKFLOW_SPAN_HEADER] = serializeHeaderValue(info.runId); + + // Pass workflow span ID for cross-worker activities to construct parent + if (this.state.spanId) { + headers[BRAINTRUST_WORKFLOW_SPAN_ID_HEADER] = serializeHeaderValue( + this.state.spanId, + ); + } + + // Pass client context for cross-worker activities to construct parent + if (this.state.parentContext) { + headers[BRAINTRUST_SPAN_HEADER] = serializeHeaderValue( + this.state.parentContext, + ); + } + + return headers; + } + + scheduleActivity( + input: ActivityInput, + next: Next, + ) { + return next({ + ...input, + headers: { + ...input.headers, + ...this.getHeaders(), + }, + }); + } + + scheduleLocalActivity( + input: LocalActivityInput, + next: Next, + ) { + return next({ + ...input, + headers: { + ...input.headers, + ...this.getHeaders(), + }, + }); + } + + startChildWorkflowExecution( + input: StartChildWorkflowExecutionInput, + next: Next, + ) { + return next({ + ...input, + headers: { + ...input.headers, + ...this.getHeaders(), + }, + }); + } +} + +export const interceptors: WorkflowInterceptorsFactory = () => { + // Create shared state for this workflow instance + const state: WorkflowSpanState = { + parentContext: undefined, + spanId: undefined, + }; + + return { + inbound: [new BraintrustWorkflowInboundInterceptor(state)], + outbound: [new BraintrustWorkflowOutboundInterceptor(state)], + }; +}; diff --git a/integrations/temporal-js/tsconfig.json b/integrations/temporal-js/tsconfig.json new file mode 100644 index 000000000..357391770 --- /dev/null +++ b/integrations/temporal-js/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "declaration": true, + "lib": ["es2022"], + "module": "commonjs", + "target": "es2022", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["."], + "exclude": ["node_modules/**", "**/dist/**"] +} diff --git a/integrations/temporal-js/tsup.config.ts b/integrations/temporal-js/tsup.config.ts new file mode 100644 index 000000000..e37c36c4b --- /dev/null +++ b/integrations/temporal-js/tsup.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from "tsup"; + +export default defineConfig([ + { + entry: ["src/index.ts", "src/workflow-interceptors.ts"], + format: ["cjs", "esm"], + outDir: "dist", + external: [ + "braintrust", + "braintrust/util", + "@braintrust/temporal/workflow-interceptors", + "@temporalio/activity", + "@temporalio/client", + "@temporalio/common", + "@temporalio/worker", + "@temporalio/workflow", + ], + dts: true, + }, +]); diff --git a/integrations/temporal-js/turbo.json b/integrations/temporal-js/turbo.json new file mode 100644 index 000000000..3e50dc890 --- /dev/null +++ b/integrations/temporal-js/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "tasks": { + "build": { + "outputs": ["**/dist/**"] + } + } +} diff --git a/integrations/temporal-js/vitest.config.ts b/integrations/temporal-js/vitest.config.ts new file mode 100644 index 000000000..77a73cf2e --- /dev/null +++ b/integrations/temporal-js/vitest.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: {}, +}); diff --git a/js/.TEMPORAL_TODO.md b/js/.TEMPORAL_TODO.md deleted file mode 100644 index 2262a3efd..000000000 --- a/js/.TEMPORAL_TODO.md +++ /dev/null @@ -1,38 +0,0 @@ -# TypeScript Temporal Integration - TODO - -## Configuration Files - -- [ ] Create `src/wrappers/temporal/package.json` with Temporal dependencies -- [ ] Create `src/wrappers/temporal/tsconfig.json` extending main config -- [ ] Create `src/wrappers/temporal/vitest.config.js` for tests - -## Core Implementation (`src/wrappers/temporal/temporal.ts`) - -- [ ] Implement header serialization utilities (`spanContextToHeaders`, `spanContextFromHeaders`) -- [ ] Implement `BraintrustClientOutboundInterceptor` (propagate context to workflows) -- [ ] Implement `BraintrustActivityInboundInterceptor` (create spans for activities) -- [ ] Implement `BraintrustWorkflowInboundInterceptor` (create workflow spans, handle replay) -- [ ] Implement `BraintrustWorkflowOutboundInterceptor` (propagate context to activities/child workflows) -- [ ] Create main `BraintrustInterceptor` export class - -## Tests - -- [ ] Write `src/wrappers/temporal/temporal.test.ts` with unit tests - -## Examples (`examples/temporal/`) - -- [ ] Create `examples/temporal/workflow.ts` with SimpleWorkflow and activities (add_ten, multiply_by_two) -- [ ] Create `examples/temporal/worker.ts` with BraintrustInterceptor setup -- [ ] Create `examples/temporal/run.ts` with client and workflow execution -- [ ] Create `examples/temporal/package.json` with example dependencies - -## Integration - -- [ ] Update `src/exports-node.ts` to export BraintrustInterceptor -- [ ] Add `test:temporal` script to main `package.json` - -## Reference Files - -- Python: `sdk/py/src/braintrust/contrib/temporal/__init__.py` -- Python examples: `sdk/py/examples/temporal/` -- JS patterns: `sdk/js/src/wrappers/mastra/mastra.ts` diff --git a/js/CLAUDE.md b/js/CLAUDE.md index 6ce12237a..69483485d 100644 --- a/js/CLAUDE.md +++ b/js/CLAUDE.md @@ -35,6 +35,14 @@ Or from sdk root: make fixup # Run pre-commit hooks on all files ``` +## Before Committing + +Always run formatting before committing to avoid pre-commit hook failures: + +```bash +pnpm prettier --write . # Format all files +``` + ## Test Framework Uses Vitest. Config in `vitest.config.js`. Tests make real API calls (no VCR/cassettes). diff --git a/js/README.md b/js/README.md index 081baa9d5..1b09f9b4b 100644 --- a/js/README.md +++ b/js/README.md @@ -2,7 +2,7 @@ An isomorphic JS library for logging data to Braintrust. ## Version information -**1.x** is the current stable release with improved ESM support. OpenTelemetry integration is available via the separate [`@braintrust/otel`](https://www.npmjs.com/package/@braintrust/otel) package. +**1.x** is the current stable release with improved ESM support. OpenTelemetry integration is available via the separate [`@braintrust/otel`](https://www.npmjs.com/package/@braintrust/otel) package. Temporal integration is available via the separate [`@braintrust/temporal`](https://www.npmjs.com/package/@braintrust/temporal) package (install its peer dependencies alongside it). ### Upgrading from 0.x diff --git a/js/smoke/tests/otel-v1/tsconfig.json b/js/smoke/tests/otel-v1/tsconfig.json index 1ad966779..dc1fa471a 100644 --- a/js/smoke/tests/otel-v1/tsconfig.json +++ b/js/smoke/tests/otel-v1/tsconfig.json @@ -1,17 +1,17 @@ { - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "isolatedModules": true, - "types": ["node"] - }, - "include": ["otel_example.ts"], - "exclude": ["node_modules"] - } + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "types": ["node"] + }, + "include": ["otel_example.ts"], + "exclude": ["node_modules"] +} diff --git a/js/smoke/tests/span/tsconfig.json b/js/smoke/tests/span/tsconfig.json index 3aa5f582d..4bdb1a460 100644 --- a/js/smoke/tests/span/tsconfig.json +++ b/js/smoke/tests/span/tsconfig.json @@ -1,17 +1,17 @@ { - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "isolatedModules": true, - "types": ["node"] - }, - "include": ["simple_span_example.ts", "span_test_helper.ts"], - "exclude": ["node_modules"] - } + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "types": ["node"] + }, + "include": ["simple_span_example.ts", "span_test_helper.ts"], + "exclude": ["node_modules"] +} diff --git a/js/src/imports.test.ts b/js/src/imports.test.ts index 068b82791..bdea54aae 100644 --- a/js/src/imports.test.ts +++ b/js/src/imports.test.ts @@ -44,11 +44,13 @@ describe("CLI import restrictions", () => { const importPath = importMatch[1]; // Check if the import path references the CLI directory + // Only match actual /cli/ directory paths, not package names containing "cli" + // (e.g., @temporalio/client should not match) if ( - importPath.includes("/cli") || importPath.includes("/cli/") || importPath === "./cli" || importPath === "../cli" || + importPath.endsWith("/cli") || importPath.match(/^\.\.\/.*\/cli$/) || importPath.match(/^\.\.\/.*\/cli\//) ) { diff --git a/js/typedoc.json b/js/typedoc.json index 3d17888fd..40756caa2 100644 --- a/js/typedoc.json +++ b/js/typedoc.json @@ -1,20 +1,18 @@ { - "compilerOptions": { - "skipLibCheck": true - }, - "tsconfig": "./tsconfig.json", - "excludeExternals": true, - "externalPattern": [ - "**/node_modules/**" - ], - "exclude": ["**/examples/**", "**/smoke/**"], - "plugin": ["typedoc-plugin-markdown"], - "out": "../../docs/reference/sdks/ts-api", - "githubPages": false, - "disableSources": true, - "excludePrivate": true, - "hideBreadcrumbs": true, - "excludeInternal": true, - "theme": "markdown", - "groupOrder": ["Functions", "*"] + "compilerOptions": { + "skipLibCheck": true + }, + "tsconfig": "./tsconfig.json", + "excludeExternals": true, + "externalPattern": ["**/node_modules/**"], + "exclude": ["**/examples/**", "**/smoke/**"], + "plugin": ["typedoc-plugin-markdown"], + "out": "../../docs/reference/sdks/ts-api", + "githubPages": false, + "disableSources": true, + "excludePrivate": true, + "hideBreadcrumbs": true, + "excludeInternal": true, + "theme": "markdown", + "groupOrder": ["Functions", "*"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1cd8ef9c..04937443d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 2.6.6(@types/node@20.10.5)(typescript@5.3.3) tsup: specifier: ^8.3.5 - version: 8.3.5(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2) + version: 8.3.5(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2) typedoc: specifier: ^0.25.13 version: 0.25.13(typescript@5.3.3) @@ -49,7 +49,7 @@ importers: version: 5.3.3 vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3)) + version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(terser@5.44.1) zod: specifier: ^3.25.34 version: 3.25.76 @@ -70,7 +70,7 @@ importers: version: link:../../js tsup: specifier: ^8.3.5 - version: 8.3.5(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2) + version: 8.3.5(@swc/core@1.15.8)(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2) tsx: specifier: ^3.14.0 version: 3.14.0 @@ -82,7 +82,7 @@ importers: version: 5.4.4 vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.19.9)(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4)) + version: 2.1.9(@types/node@20.19.9)(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(terser@5.44.1) zod: specifier: ^3.25.34 version: 3.25.76 @@ -110,7 +110,7 @@ importers: version: link:../../js tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.6)(typescript@5.5.4)(yaml@2.8.2) + version: 8.5.1(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.5.4)(yaml@2.8.2) typedoc: specifier: ^0.28.15 version: 0.28.15(typescript@5.5.4) @@ -118,6 +118,39 @@ importers: specifier: 5.5.4 version: 5.5.4 + integrations/temporal-js: + devDependencies: + '@temporalio/activity': + specifier: ^1.14.1 + version: 1.14.1 + '@temporalio/client': + specifier: ^1.14.1 + version: 1.14.1 + '@temporalio/common': + specifier: ^1.14.1 + version: 1.14.1 + '@temporalio/worker': + specifier: ^1.14.1 + version: 1.14.1 + '@temporalio/workflow': + specifier: ^1.14.1 + version: 1.14.1 + '@types/node': + specifier: ^22.15.21 + version: 22.19.1 + braintrust: + specifier: workspace:* + version: link:../../js + tsup: + specifier: ^8.5.0 + version: 8.5.1(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.5.4)(yaml@2.8.2) + typescript: + specifier: 5.5.4 + version: 5.5.4 + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@22.19.1)(msw@2.6.6(@types/node@22.19.1)(typescript@5.5.4))(terser@5.44.1) + integrations/vercel-ai-sdk: dependencies: '@ai-sdk/provider': @@ -135,13 +168,13 @@ importers: version: 20.10.5 tsup: specifier: ^8.3.5 - version: 8.3.5(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2) + version: 8.3.5(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2) typescript: specifier: ^5.3.3 version: 5.3.3 vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3)) + version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(terser@5.44.1) internal/golden: dependencies: @@ -155,34 +188,6 @@ importers: specifier: ^3.23.8 version: 3.25.76 - internal/golden/ai-sdk-v5: - dependencies: - '@ai-sdk/anthropic': - specifier: ^2.0.39 - version: 2.0.57(zod@3.25.76) - '@ai-sdk/openai': - specifier: ^2.0.56 - version: 2.0.89(zod@3.25.76) - ai: - specifier: ^5.0.116 - version: 5.0.121(zod@3.25.76) - braintrust: - specifier: link:../../../js - version: link:../../../js - zod: - specifier: ^3.23.8 - version: 3.25.76 - devDependencies: - '@types/node': - specifier: ^20.0.0 - version: 20.19.16 - tsx: - specifier: ^4.7.0 - version: 4.21.0 - typescript: - specifier: ^5.3.0 - version: 5.5.4 - js: dependencies: '@ai-sdk/provider': @@ -323,7 +328,7 @@ importers: version: 8.50.0(eslint@9.39.2)(typescript@5.4.4) ai: specifier: ^6.0.0 - version: 6.0.27(zod@3.25.76) + version: 6.0.37(zod@3.25.76) async: specifier: ^3.2.5 version: 3.2.5 @@ -350,10 +355,10 @@ importers: version: 4.0.1 ts-jest: specifier: ^29.1.4 - version: 29.1.4(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.27.0)(jest@29.7.0(@types/node@20.10.5))(typescript@5.4.4) + version: 29.1.4(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.27.0)(jest@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)))(typescript@5.4.4) tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2) + version: 8.5.1(@swc/core@1.15.8)(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2) tsx: specifier: ^3.14.0 version: 3.14.0 @@ -368,10 +373,10 @@ importers: version: 5.4.4 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.10.5)) + version: 4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1)) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4)) + version: 2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(terser@5.44.1) zod: specifier: ^3.25.34 version: 3.25.76 @@ -389,10 +394,10 @@ importers: version: 5.4.4 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.19.16)) + version: 4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.19.16)(terser@5.44.1)) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@20.19.16)(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4)) + version: 2.1.9(@types/node@20.19.16)(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(terser@5.44.1) zod: specifier: ^3.25.34 version: 3.25.76 @@ -405,26 +410,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.57': - resolution: {integrity: sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/gateway@2.0.27': - resolution: {integrity: sha512-8hbezMsGa0crSt7/DKjkYL1UbbJJW/UFxTfhmf5qcIeYeeWG4dTNmm+DWbUdIsTaWvp59KC4eeC9gYXBbTHd7w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/gateway@3.0.11': - resolution: {integrity: sha512-gLrgNXA95wdo/zAlA0miX/SJEYKSYCHg+e0Y/uQeABLScZAMjPw3jWaeANta/Db1T4xfi8cBvY3nnV8Pa27z+w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/openai@2.0.89': - resolution: {integrity: sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw==} + '@ai-sdk/gateway@3.0.15': + resolution: {integrity: sha512-OsWcXMfkF9U38YhU7926rYt4IAtJuZlnM1e8STN8hHb4qbiTaORBSXcFaJuOEZ1kYOf3DqqP7CxbmM543ePzIg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -444,14 +431,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.20': - resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@4.0.4': - resolution: {integrity: sha512-VxhX0B/dWGbpNHxrKCWUAJKXIXV015J4e7qYjdIU9lLWeptk0KMLGcqkB4wFxff5Njqur8dt8wRi1MN9lZtDqg==} + '@ai-sdk/provider-utils@4.0.7': + resolution: {integrity: sha512-ItzTdBxRLieGz1GHPwl9X3+HKfwTfFd9MdIa91aXRnOjUVRw68ENjAGKm3FcXGsBLkXDLaFWgjbTVdXe2igs2w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -468,12 +449,8 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/provider@2.0.1': - resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} - engines: {node: '>=18'} - - '@ai-sdk/provider@3.0.2': - resolution: {integrity: sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==} + '@ai-sdk/provider@3.0.3': + resolution: {integrity: sha512-qGPYdoAuECaUXPrrz0BPX1SacZQuJ6zky0aakxpW89QW1hrY0eF4gcFm/3L9Pk8C5Fwe+RvBf2z7ZjDhaPjnlg==} engines: {node: '>=18'} '@ai-sdk/react@0.0.16': @@ -870,6 +847,10 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1496,6 +1477,15 @@ packages: '@modelcontextprotocol/sdk': optional: true + '@grpc/grpc-js@1.14.3': + resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1696,6 +1686,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -1711,9 +1704,51 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -2060,6 +2095,125 @@ packages: peerDependencies: acorn: ^8.9.0 + '@swc/core-darwin-arm64@1.15.8': + resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.8': + resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.8': + resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.8': + resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.8': + resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.8': + resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.8': + resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.8': + resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.8': + resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.8': + resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.8': + resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + + '@temporalio/activity@1.14.1': + resolution: {integrity: sha512-wG2fTNgomhcKOzPY7mqhKqe8scawm4BvUYdgX1HJouHmVNRgtZurf2xQWJZQOTxWrsXfdoYqzohZLzxlNtcC5A==} + engines: {node: '>= 18.0.0'} + + '@temporalio/client@1.14.1': + resolution: {integrity: sha512-AfWSA0LYzBvDLFiFgrPWqTGGq1NGnF3d4xKnxf0PGxSmv5SLb/aqQ9lzHg4DJ5UNkHO4M/NwzdxzzoaR1J5F8Q==} + engines: {node: '>= 18.0.0'} + + '@temporalio/common@1.14.1': + resolution: {integrity: sha512-y49wOm3AIEKZufIQ/QU5JhTSaHJIEkiUt5bGB0/uSzCg8P4g8Cz0XoVPSbDwuCix533O9cOKcliYq7Gzjt/sIA==} + engines: {node: '>= 18.0.0'} + + '@temporalio/core-bridge@1.14.1': + resolution: {integrity: sha512-mrXXIFK5yNvsSZsTejLnL64JMuMliQjFKktSGITm2Ci7cWZ/ZTOVN6u+hCsUKfadYYv83jSuOC9Xe3z3RK273w==} + engines: {node: '>= 18.0.0'} + + '@temporalio/nexus@1.14.1': + resolution: {integrity: sha512-51oTeJ8nntAMF8boFSlzVdHlyC7y/LaLQPZMjEEOV2pi8O9yOI7GZvYDIAHhY8Z8AcDVgbXb8x0BbkjkwNiUiQ==} + engines: {node: '>= 18.0.0'} + + '@temporalio/proto@1.14.1': + resolution: {integrity: sha512-mCsUommDPXbXbBu60p1g4jpSqVb+GNR67yR0uKTU8ARb4qVZQo7SQnOUaneoxDERDXuR/yIjVCektMm+7Myb+A==} + engines: {node: '>= 18.0.0'} + + '@temporalio/worker@1.14.1': + resolution: {integrity: sha512-wFfN5gc03eq1bYAuJNsG9a1iWBG6hL9zAfYbxiJdshPhpHa82BtHGvXD447oT2BX3zqI+Jf2b0m/N0wgkW6wyQ==} + engines: {node: '>= 18.0.0'} + + '@temporalio/workflow@1.14.1': + resolution: {integrity: sha512-MzshcoRo8zjQYa9WHrv3XC8LVvpRNSVaW3kOSTmHuTYDh/7be48WODOgs5yUpbnkpsw6rjVCDCgtB/K02cQwDg==} + engines: {node: '>= 18.0.0'} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/argparse@2.0.14': resolution: {integrity: sha512-jJ6NMs9rXQ0rsqNt3TL4Elcwhd6wygo3lJOVoiHzURD34vsCcAlw443uGu4PXTtEmMF7sYKoadTCLXNmuJuQGw==} @@ -2096,6 +2250,12 @@ packages: '@types/diff-match-patch@1.0.36': resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2332,6 +2492,57 @@ packages: '@vue/shared@3.5.21': resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zodios/core@10.9.6': resolution: {integrity: sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==} peerDependencies: @@ -2353,11 +2564,21 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -2389,14 +2610,8 @@ packages: zod: optional: true - ai@5.0.121: - resolution: {integrity: sha512-3iYPdARKGLryC/7OA9RgBUaym1gynvWS7UPy8NwoRNCKP52lshldtHB5xcEfVviw7liWH2zJlW9yEzsDglcIEQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ai@6.0.27: - resolution: {integrity: sha512-a4ToMt5+4xOzHuYdoTy2GQXuNa2/Tpuhxfs5QESHtEV/Vf2HAzSwmTwikrIs8CDKPuMWV1I9YqAvaN5xexMCiQ==} + ai@6.0.37: + resolution: {integrity: sha512-GUMBYx0TXKxXRcWy6DY3ryHJZ7cATxc99WPT7WCD8hGCYkdhFVItKPTtINeTlK+FlUomDqzjPGtiDcVftcw//w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2409,6 +2624,19 @@ packages: ajv: optional: true + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2456,6 +2684,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2539,6 +2770,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -2571,13 +2806,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2638,11 +2868,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001632: - resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} - - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} @@ -2679,6 +2906,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -2734,6 +2965,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2803,6 +3037,9 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -2908,6 +3145,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -2925,11 +3166,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.799: - resolution: {integrity: sha512-3D3DwWkRTzrdEpntY0hMLYwj7SeBk1138CkPE8sBDSj3WzrzOiG2rHm3luw8jucpf+WiyLBCZyU9lMHyQI9M9Q==} - - electron-to-chromium@1.5.189: - resolution: {integrity: sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2952,6 +3190,10 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2977,6 +3219,9 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -3013,10 +3258,6 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3036,6 +3277,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3081,6 +3326,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -3109,6 +3358,10 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource-parser@1.1.2: resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} engines: {node: '>=14.18'} @@ -3273,6 +3526,9 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3341,6 +3597,15 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -3436,6 +3701,10 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + heap-js@2.7.1: + resolution: {integrity: sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==} + engines: {node: '>=10.0.0'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -3457,6 +3726,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3747,6 +4020,10 @@ packages: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3900,6 +4177,10 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -3911,6 +4192,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -3972,6 +4256,9 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + memfs@4.51.1: + resolution: {integrity: sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -4079,6 +4366,10 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} + msw@2.6.6: resolution: {integrity: sha512-npfIIVRHKQX3Lw4aLWX4wBh+lQwpqdZNyJYB5K/+ktK8NhtkdsTxGK7WDrgknozcVyRI7TOqY6yBS9j2FTR+YQ==} engines: {node: '>=18'} @@ -4124,6 +4415,10 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nexus-rpc@0.0.1: + resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} + engines: {node: '>= 18.0.0'} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -4144,11 +4439,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4472,6 +4764,10 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proto3-json-serializer@2.0.2: + resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} + engines: {node: '>=14.0.0'} + protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} @@ -4516,6 +4812,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -4606,6 +4905,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} @@ -4619,6 +4921,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -4648,6 +4954,9 @@ packages: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -4735,6 +5044,12 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-loader@4.0.2: + resolution: {integrity: sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.72.1 + source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -4874,6 +5189,12 @@ packages: resolution: {integrity: sha512-FrE+kPWjYcX6CE8+5fjfUCcJJtzG89apH3saSqMNsbloI44F7CEs/Vfqf9xO5Soh4YDdOtyKkqVSBCSpSP8H9w==} engines: {node: '>=18'} + swc-loader@0.2.6: + resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} + peerDependencies: + '@swc/core': ^1.2.147 + webpack: '>=2' + swr@2.2.0: resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} peerDependencies: @@ -4890,6 +5211,10 @@ packages: tanu@0.1.13: resolution: {integrity: sha512-UbRmX7ccZ4wMVOY/Uw+7ji4VOkEYSYJG1+I4qzbnn4qh/jtvVbrm6BFnF12NQQ4+jGv21wKmjb1iFyUSVnBWcQ==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} @@ -4898,6 +5223,27 @@ packages: resolution: {integrity: sha512-2qSN6TnomHgVLtk+htSWbaYs4Rd2MH/RU7VpHTy6MBstyNyWbM4yKd1DCYpE3fDg8dmGWojXCngNi/MHCzGuAA==} engines: {node: '>=12'} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -4909,6 +5255,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4964,6 +5316,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -5004,6 +5362,20 @@ packages: esbuild: optional: true + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-pattern@5.8.0: resolution: {integrity: sha512-kIjN2qmWiHnhgr5DAkAafF9fwb0T5OhMVSWrm8XEdTFnX6+wfXwYOFjeF86UZ54vduqiR7BfqScFmXSzSaH8oA==} @@ -5065,11 +5437,6 @@ packages: resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} hasBin: true - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} - engines: {node: '>=18.0.0'} - hasBin: true - turbo-darwin-64@2.5.6: resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} cpu: [x64] @@ -5206,6 +5573,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unionfs@4.6.0: + resolution: {integrity: sha512-fJAy3gTHjFi5S3TP5EGdjs/OUMFFvI/ady3T8qVuZfkv8Qi8prV/Q8BuFEgODJslhZTT2z2qdD2lGdee9qjEnA==} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -5218,14 +5588,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5249,10 +5613,17 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -5356,6 +5727,10 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + watchpack@2.5.0: + resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} + engines: {node: '>=10.13.0'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -5366,6 +5741,20 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -5472,6 +5861,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5510,32 +5903,13 @@ snapshots: '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@2.0.57(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) - zod: 3.25.76 - - '@ai-sdk/gateway@2.0.27(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) - '@vercel/oidc': 3.1.0 - zod: 3.25.76 - - '@ai-sdk/gateway@3.0.11(zod@3.25.76)': + '@ai-sdk/gateway@3.0.15(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@3.25.76) + '@ai-sdk/provider': 3.0.3 + '@ai-sdk/provider-utils': 4.0.7(zod@3.25.76) '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/openai@2.0.89(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) - zod: 3.25.76 - '@ai-sdk/provider-utils@1.0.0(zod@4.2.1)': dependencies: '@ai-sdk/provider': 0.0.11 @@ -5552,16 +5926,9 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': + '@ai-sdk/provider-utils@4.0.7(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.1 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 - zod: 3.25.76 - - '@ai-sdk/provider-utils@4.0.4(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 3.0.2 + '@ai-sdk/provider': 3.0.3 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 @@ -5578,11 +5945,7 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@2.0.1': - dependencies: - json-schema: 0.4.0 - - '@ai-sdk/provider@3.0.2': + '@ai-sdk/provider@3.0.3': dependencies: json-schema: 0.4.0 @@ -5774,7 +6137,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.7 '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -5782,7 +6145,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -6229,6 +6592,11 @@ snapshots: '@colors/colors@1.5.0': optional: true + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -6583,6 +6951,18 @@ snapshots: - supports-color - utf-8-validate + '@grpc/grpc-js@1.14.3': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -6657,6 +7037,13 @@ snapshots: '@types/node': 20.19.9 optional: true + '@inquirer/confirm@5.0.2(@types/node@22.19.1)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.19.1) + '@inquirer/type': 3.0.1(@types/node@22.19.1) + '@types/node': 22.19.1 + optional: true + '@inquirer/core@10.1.0(@types/node@20.10.5)': dependencies: '@inquirer/figures': 1.0.8 @@ -6701,6 +7088,21 @@ snapshots: - '@types/node' optional: true + '@inquirer/core@10.1.0(@types/node@22.19.1)': + dependencies: + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@22.19.1) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + optional: true + '@inquirer/figures@1.0.8': {} '@inquirer/type@3.0.1(@types/node@20.10.5)': @@ -6717,6 +7119,11 @@ snapshots: '@types/node': 20.19.9 optional: true + '@inquirer/type@3.0.1(@types/node@22.19.1)': + dependencies: + '@types/node': 22.19.1 + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6749,7 +7156,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -6763,7 +7170,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.19.1) + jest-config: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -6788,7 +7195,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.19.16 + '@types/node': 22.19.1 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -6806,7 +7213,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.19.16 + '@types/node': 22.19.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6898,14 +7305,14 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/yargs': 17.0.32 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -6927,6 +7334,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -6946,8 +7358,52 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + optional: true + + '@js-sdsl/ordered-map@4.4.2': {} + '@jsdevtools/ono@7.1.3': {} + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.4.3 @@ -7357,6 +7813,147 @@ snapshots: dependencies: acorn: 8.15.0 + '@swc/core-darwin-arm64@1.15.8': + optional: true + + '@swc/core-darwin-x64@1.15.8': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.8': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.8': + optional: true + + '@swc/core-linux-arm64-musl@1.15.8': + optional: true + + '@swc/core-linux-x64-gnu@1.15.8': + optional: true + + '@swc/core-linux-x64-musl@1.15.8': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.8': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.8': + optional: true + + '@swc/core-win32-x64-msvc@1.15.8': + optional: true + + '@swc/core@1.15.8': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.8 + '@swc/core-darwin-x64': 1.15.8 + '@swc/core-linux-arm-gnueabihf': 1.15.8 + '@swc/core-linux-arm64-gnu': 1.15.8 + '@swc/core-linux-arm64-musl': 1.15.8 + '@swc/core-linux-x64-gnu': 1.15.8 + '@swc/core-linux-x64-musl': 1.15.8 + '@swc/core-win32-arm64-msvc': 1.15.8 + '@swc/core-win32-ia32-msvc': 1.15.8 + '@swc/core-win32-x64-msvc': 1.15.8 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + + '@temporalio/activity@1.14.1': + dependencies: + '@temporalio/client': 1.14.1 + '@temporalio/common': 1.14.1 + abort-controller: 3.0.0 + + '@temporalio/client@1.14.1': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@temporalio/common': 1.14.1 + '@temporalio/proto': 1.14.1 + abort-controller: 3.0.0 + long: 5.3.2 + uuid: 11.1.0 + + '@temporalio/common@1.14.1': + dependencies: + '@temporalio/proto': 1.14.1 + long: 5.3.2 + ms: 3.0.0-canary.1 + nexus-rpc: 0.0.1 + proto3-json-serializer: 2.0.2 + + '@temporalio/core-bridge@1.14.1': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@temporalio/common': 1.14.1 + + '@temporalio/nexus@1.14.1': + dependencies: + '@temporalio/client': 1.14.1 + '@temporalio/common': 1.14.1 + '@temporalio/proto': 1.14.1 + long: 5.3.2 + nexus-rpc: 0.0.1 + + '@temporalio/proto@1.14.1': + dependencies: + long: 5.3.2 + protobufjs: 7.5.4 + + '@temporalio/worker@1.14.1': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@swc/core': 1.15.8 + '@temporalio/activity': 1.14.1 + '@temporalio/client': 1.14.1 + '@temporalio/common': 1.14.1 + '@temporalio/core-bridge': 1.14.1 + '@temporalio/nexus': 1.14.1 + '@temporalio/proto': 1.14.1 + '@temporalio/workflow': 1.14.1 + abort-controller: 3.0.0 + heap-js: 2.7.1 + memfs: 4.51.1 + nexus-rpc: 0.0.1 + proto3-json-serializer: 2.0.2 + protobufjs: 7.5.4 + rxjs: 7.8.2 + source-map: 0.7.6 + source-map-loader: 4.0.2(webpack@5.104.1(@swc/core@1.15.8)) + supports-color: 8.1.1 + swc-loader: 0.2.6(@swc/core@1.15.8)(webpack@5.104.1(@swc/core@1.15.8)) + unionfs: 4.6.0 + webpack: 5.104.1(@swc/core@1.15.8) + transitivePeerDependencies: + - '@swc/helpers' + - esbuild + - uglify-js + - webpack-cli + + '@temporalio/workflow@1.14.1': + dependencies: + '@temporalio/common': 1.14.1 + '@temporalio/proto': 1.14.1 + nexus-rpc: 0.0.1 + + '@tsconfig/node10@1.0.12': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@types/argparse@2.0.14': {} '@types/async@3.2.24': {} @@ -7385,31 +7982,41 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/cli-progress@3.11.5': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/connect@3.4.38': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/cookie@0.6.0': {} '@types/cors@2.8.17': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/diff-match-patch@1.0.36': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.6': {} '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -7422,11 +8029,11 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/hast@3.0.4': dependencies: @@ -7488,12 +8095,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -7515,7 +8122,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 '@types/yargs-parser@21.0.3': {} @@ -7625,41 +8232,50 @@ snapshots: chai: 5.2.0 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(vite@5.4.14(@types/node@20.10.5))': + '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.6.6(@types/node@20.10.5)(typescript@5.3.3) - vite: 5.4.14(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) - '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(vite@5.4.14(@types/node@20.10.5))': + '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.6.6(@types/node@20.10.5)(typescript@5.4.4) - vite: 5.4.14(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) - '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.16))': + '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.16)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.6.6(@types/node@20.19.16)(typescript@5.4.4) - vite: 5.4.14(@types/node@20.19.16) + vite: 5.4.14(@types/node@20.19.16)(terser@5.44.1) - '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.9))': + '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.9)(terser@5.44.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.6.6(@types/node@20.19.9)(typescript@5.4.4) - vite: 5.4.14(@types/node@20.19.9) + vite: 5.4.14(@types/node@20.19.9)(terser@5.44.1) + + '@vitest/mocker@2.1.9(msw@2.6.6(@types/node@22.19.1)(typescript@5.5.4))(vite@5.4.14(@types/node@22.19.1)(terser@5.44.1))': + dependencies: + '@vitest/spy': 2.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + msw: 2.6.6(@types/node@22.19.1)(typescript@5.5.4) + vite: 5.4.14(@types/node@22.19.1)(terser@5.44.1) '@vitest/pretty-format@2.1.9': dependencies: @@ -7740,6 +8356,86 @@ snapshots: '@vue/shared@3.5.21': {} + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@zodios/core@10.9.6(axios@1.11.0)(zod@3.25.76)': dependencies: axios: 1.11.0 @@ -7762,10 +8458,19 @@ snapshots: negotiator: 1.0.0 optional: true + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + optional: true + acorn@8.15.0: {} agent-base@7.1.4: {} @@ -7799,19 +8504,11 @@ snapshots: - solid-js - vue - ai@5.0.121(zod@3.25.76): + ai@6.0.37(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.27(zod@3.25.76) - '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - zod: 3.25.76 - - ai@6.0.27(zod@3.25.76): - dependencies: - '@ai-sdk/gateway': 3.0.11(zod@3.25.76) - '@ai-sdk/provider': 3.0.2 - '@ai-sdk/provider-utils': 4.0.4(zod@3.25.76) + '@ai-sdk/gateway': 3.0.15(zod@3.25.76) + '@ai-sdk/provider': 3.0.3 + '@ai-sdk/provider-utils': 4.0.7(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 @@ -7819,6 +8516,15 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7866,6 +8572,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: + optional: true + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -8042,6 +8751,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.9.14: {} + bignumber.js@9.3.1: {} binary-search@1.3.6: {} @@ -8106,19 +8817,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.1: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001632 - electron-to-chromium: 1.4.799 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) - - browserslist@4.25.1: - dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.189 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) bs-logger@0.2.6: dependencies: @@ -8172,9 +8877,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001632: {} - - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001764: {} chai@5.2.0: dependencies: @@ -8209,6 +8912,8 @@ snapshots: chownr@3.0.0: {} + chrome-trace-event@1.0.4: {} + ci-info@3.9.0: {} cjs-module-lexer@1.4.3: {} @@ -8255,6 +8960,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@2.20.3: {} + commander@4.1.1: {} commander@5.1.0: {} @@ -8313,13 +9020,13 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - create-jest@29.7.0(@types/node@20.10.5): + create-jest@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.5) + jest-config: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -8328,6 +9035,9 @@ snapshots: - supports-color - ts-node + create-require@1.1.1: + optional: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 @@ -8398,6 +9108,9 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: + optional: true + dotenv@16.4.5: {} dunder-proto@1.0.1: @@ -8414,9 +9127,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.4.799: {} - - electron-to-chromium@1.5.189: {} + electron-to-chromium@1.5.267: {} emittery@0.13.1: {} @@ -8430,6 +9141,11 @@ snapshots: encodeurl@2.0.0: {} + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} error-ex@1.3.2: @@ -8488,6 +9204,8 @@ snapshots: es-module-lexer@1.6.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -8619,8 +9337,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 - escalade@3.1.2: {} - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -8631,6 +9347,11 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -8701,6 +9422,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -8719,6 +9442,8 @@ snapshots: eventemitter3@4.0.7: {} + events@3.3.0: {} + eventsource-parser@1.1.2: {} eventsource-parser@3.0.6: {} @@ -8952,6 +9677,8 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-monkey@1.1.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -9036,6 +9763,12 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -9135,6 +9868,8 @@ snapshots: headers-polyfill@4.0.3: {} + heap-js@2.7.1: {} + hosted-git-info@2.8.9: {} html-escaper@2.0.2: {} @@ -9160,6 +9895,8 @@ snapshots: dependencies: ms: 2.1.3 + hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -9167,7 +9904,6 @@ snapshots: iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - optional: true ignore@5.3.2: {} @@ -9372,16 +10108,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.10.5): + jest-cli@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.5) + create-jest: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.10.5) + jest-config: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9391,7 +10127,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.10.5): + jest-config@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -9417,11 +10153,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.10.5 + ts-node: 10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.19.1): + jest-config@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)): dependencies: '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 @@ -9447,6 +10184,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.19.1 + ts-node: 10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -9485,7 +10223,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.19.16 + '@types/node': 22.19.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9524,7 +10262,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.16 + '@types/node': 22.19.1 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -9633,7 +10371,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.19.16 + '@types/node': 22.19.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -9659,19 +10397,25 @@ snapshots: jest-util: 29.7.0 string-length: 4.0.2 + jest-worker@27.5.1: + dependencies: + '@types/node': 22.19.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@29.7.0: dependencies: - '@types/node': 20.19.16 + '@types/node': 22.19.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.10.5): + jest@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.10.5) + jest-cli: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9805,6 +10549,8 @@ snapshots: load-tsconfig@0.2.5: {} + loader-runner@4.3.1: {} + locate-character@3.0.0: {} locate-path@5.0.0: @@ -9815,6 +10561,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -9867,6 +10615,15 @@ snapshots: media-typer@1.1.0: optional: true + memfs@4.51.1: + dependencies: + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + memorystream@0.3.1: {} merge-descriptors@1.0.3: {} @@ -9971,6 +10728,8 @@ snapshots: ms@2.1.3: {} + ms@3.0.0-canary.1: {} + msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -10074,6 +10833,32 @@ snapshots: - '@types/node' optional: true + msw@2.6.6(@types/node@22.19.1)(typescript@5.5.4): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.0.2(@types/node@22.19.1) + '@mswjs/interceptors': 0.37.3 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + chalk: 4.1.2 + graphql: 16.9.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + strict-event-emitter: 0.5.1 + type-fest: 4.30.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - '@types/node' + optional: true + mustache@4.2.0: {} mute-stream@2.0.0: {} @@ -10097,6 +10882,8 @@ snapshots: neo-async@2.6.2: {} + nexus-rpc@0.0.1: {} + nice-try@1.0.5: {} node-domexception@1.0.0: {} @@ -10107,9 +10894,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.14: {} - - node-releases@2.0.19: {} + node-releases@2.0.27: {} normalize-package-data@2.5.0: dependencies: @@ -10410,6 +11195,10 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + proto3-json-serializer@2.0.2: + dependencies: + protobufjs: 7.5.4 + protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -10459,6 +11248,10 @@ snapshots: queue-microtask@1.2.3: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + range-parser@1.2.1: {} raw-body@2.5.2: @@ -10568,6 +11361,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.5 @@ -10585,6 +11382,13 @@ snapshots: safer-buffer@2.1.2: {} + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + secure-json-parse@2.7.0: {} semver@5.7.2: {} @@ -10630,6 +11434,10 @@ snapshots: - supports-color optional: true + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -10741,6 +11549,12 @@ snapshots: source-map-js@1.2.1: {} + source-map-loader@4.0.2(webpack@5.104.1(@swc/core@1.15.8)): + dependencies: + iconv-lite: 0.6.3 + source-map-js: 1.2.1 + webpack: 5.104.1(@swc/core@1.15.8) + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -10898,6 +11712,12 @@ snapshots: magic-string: 0.30.19 zimmerframe: 1.1.4 + swc-loader@0.2.6(@swc/core@1.15.8)(webpack@5.104.1(@swc/core@1.15.8)): + dependencies: + '@swc/core': 1.15.8 + '@swc/counter': 0.1.3 + webpack: 5.104.1(@swc/core@1.15.8) + swr@2.2.0(react@19.1.1): dependencies: react: 19.1.1 @@ -10914,6 +11734,8 @@ snapshots: tslib: 2.8.1 typescript: 4.9.5 + tapable@2.3.0: {} + tar@7.5.2: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -10924,6 +11746,24 @@ snapshots: termi-link@1.1.0: {} + terser-webpack-plugin@5.3.16(@swc/core@1.15.8)(webpack@5.104.1(@swc/core@1.15.8)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.104.1(@swc/core@1.15.8) + optionalDependencies: + '@swc/core': 1.15.8 + + terser@5.44.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -10938,6 +11778,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tinybench@2.9.0: {} tinybench@4.0.1: {} @@ -10983,6 +11827,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} ts-algebra@2.0.0: {} @@ -10993,11 +11841,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.4(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.27.0)(jest@29.7.0(@types/node@20.10.5))(typescript@5.4.4): + ts-jest@29.1.4(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.27.0)(jest@29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)))(typescript@5.4.4): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.10.5) + jest: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -11012,6 +11860,27 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.28.0) esbuild: 0.27.0 + ts-node@10.9.2(@swc/core@1.15.8)(@types/node@20.10.5)(typescript@5.4.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.10.5 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.15.8 + optional: true + ts-pattern@5.8.0: {} ts-toolbelt@9.6.0: {} @@ -11022,7 +11891,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2): + tsup@8.3.5(@swc/core@1.15.8)(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -11041,6 +11910,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.15.8 postcss: 8.5.6 typescript: 5.4.4 transitivePeerDependencies: @@ -11049,7 +11919,7 @@ snapshots: - tsx - yaml - tsup@8.3.5(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2): + tsup@8.3.5(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.3.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) cac: 6.7.14 @@ -11068,6 +11938,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.15.8 postcss: 8.5.6 typescript: 5.3.3 transitivePeerDependencies: @@ -11076,7 +11947,7 @@ snapshots: - tsx - yaml - tsup@8.5.1(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2): + tsup@8.5.1(@swc/core@1.15.8)(postcss@8.5.6)(tsx@3.14.0)(typescript@5.4.4)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -11096,6 +11967,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.15.8 postcss: 8.5.6 typescript: 5.4.4 transitivePeerDependencies: @@ -11104,7 +11976,7 @@ snapshots: - tsx - yaml - tsup@8.5.1(postcss@8.5.6)(typescript@5.5.4)(yaml@2.8.2): + tsup@8.5.1(@swc/core@1.15.8)(postcss@8.5.6)(typescript@5.5.4)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -11124,6 +11996,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.15.8 postcss: 8.5.6 typescript: 5.5.4 transitivePeerDependencies: @@ -11140,13 +12013,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tsx@4.21.0: - dependencies: - esbuild: 0.27.0 - get-tsconfig: 4.13.0 - optionalDependencies: - fsevents: 2.3.3 - turbo-darwin-64@2.5.6: optional: true @@ -11281,21 +12147,19 @@ snapshots: undici-types@6.21.0: {} + unionfs@4.6.0: + dependencies: + fs-monkey: 1.1.0 + universalify@0.2.0: {} universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.0.16(browserslist@4.23.1): - dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.1.1 - - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -11316,8 +12180,13 @@ snapshots: uuid@10.0.0: {} + uuid@11.1.0: {} + uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -11335,13 +12204,13 @@ snapshots: vary@1.1.2: {} - vite-node@2.1.9(@types/node@20.10.5): + vite-node@2.1.9(@types/node@20.10.5)(terser@5.44.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) transitivePeerDependencies: - '@types/node' - less @@ -11353,13 +12222,13 @@ snapshots: - supports-color - terser - vite-node@2.1.9(@types/node@20.19.16): + vite-node@2.1.9(@types/node@20.19.16)(terser@5.44.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@20.19.16) + vite: 5.4.14(@types/node@20.19.16)(terser@5.44.1) transitivePeerDependencies: - '@types/node' - less @@ -11371,13 +12240,13 @@ snapshots: - supports-color - terser - vite-node@2.1.9(@types/node@20.19.9): + vite-node@2.1.9(@types/node@20.19.9)(terser@5.44.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 5.4.14(@types/node@20.19.9) + vite: 5.4.14(@types/node@20.19.9)(terser@5.44.1) transitivePeerDependencies: - '@types/node' - less @@ -11389,29 +12258,47 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.10.5)): + vite-node@2.1.9(@types/node@22.19.1)(terser@5.44.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.6.0 + pathe: 1.1.2 + vite: 5.4.14(@types/node@22.19.1)(terser@5.44.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1)): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.1.1(typescript@5.4.4) optionalDependencies: - vite: 5.4.14(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.19.16)): + vite-tsconfig-paths@4.3.2(typescript@5.4.4)(vite@5.4.14(@types/node@20.19.16)(terser@5.44.1)): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.1.1(typescript@5.4.4) optionalDependencies: - vite: 5.4.14(@types/node@20.19.16) + vite: 5.4.14(@types/node@20.19.16)(terser@5.44.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.14(@types/node@20.10.5): + vite@5.4.14(@types/node@20.10.5)(terser@5.44.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -11419,8 +12306,9 @@ snapshots: optionalDependencies: '@types/node': 20.10.5 fsevents: 2.3.3 + terser: 5.44.1 - vite@5.4.14(@types/node@20.19.16): + vite@5.4.14(@types/node@20.19.16)(terser@5.44.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -11428,8 +12316,9 @@ snapshots: optionalDependencies: '@types/node': 20.19.16 fsevents: 2.3.3 + terser: 5.44.1 - vite@5.4.14(@types/node@20.19.9): + vite@5.4.14(@types/node@20.19.9)(terser@5.44.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -11437,11 +12326,22 @@ snapshots: optionalDependencies: '@types/node': 20.19.9 fsevents: 2.3.3 + terser: 5.44.1 + + vite@5.4.14(@types/node@22.19.1)(terser@5.44.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.35.0 + optionalDependencies: + '@types/node': 22.19.1 + fsevents: 2.3.3 + terser: 5.44.1 - vitest@2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3)): + vitest@2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(vite@5.4.14(@types/node@20.10.5)) + '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.3.3))(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -11457,8 +12357,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.10.5) - vite-node: 2.1.9(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) + vite-node: 2.1.9(@types/node@20.10.5)(terser@5.44.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.10.5 @@ -11473,10 +12373,10 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4)): + vitest@2.1.9(@types/node@20.10.5)(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(vite@5.4.14(@types/node@20.10.5)) + '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.10.5)(typescript@5.4.4))(vite@5.4.14(@types/node@20.10.5)(terser@5.44.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -11492,8 +12392,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.10.5) - vite-node: 2.1.9(@types/node@20.10.5) + vite: 5.4.14(@types/node@20.10.5)(terser@5.44.1) + vite-node: 2.1.9(@types/node@20.10.5)(terser@5.44.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.10.5 @@ -11508,10 +12408,10 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@20.19.16)(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4)): + vitest@2.1.9(@types/node@20.19.16)(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.16)) + '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.19.16)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.16)(terser@5.44.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -11527,8 +12427,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.19.16) - vite-node: 2.1.9(@types/node@20.19.16) + vite: 5.4.14(@types/node@20.19.16)(terser@5.44.1) + vite-node: 2.1.9(@types/node@20.19.16)(terser@5.44.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.16 @@ -11543,10 +12443,10 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@20.19.9)(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4)): + vitest@2.1.9(@types/node@20.19.9)(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.9)) + '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@20.19.9)(typescript@5.4.4))(vite@5.4.14(@types/node@20.19.9)(terser@5.44.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -11562,8 +12462,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@20.19.9) - vite-node: 2.1.9(@types/node@20.19.9) + vite: 5.4.14(@types/node@20.19.9)(terser@5.44.1) + vite-node: 2.1.9(@types/node@20.19.9)(terser@5.44.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.9 @@ -11578,6 +12478,41 @@ snapshots: - supports-color - terser + vitest@2.1.9(@types/node@22.19.1)(msw@2.6.6(@types/node@22.19.1)(typescript@5.5.4))(terser@5.44.1): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(msw@2.6.6(@types/node@22.19.1)(typescript@5.5.4))(vite@5.4.14(@types/node@22.19.1)(terser@5.44.1)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.2.0 + debug: 4.4.3 + expect-type: 1.2.0 + magic-string: 0.30.19 + pathe: 1.1.2 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.14(@types/node@22.19.1)(terser@5.44.1) + vite-node: 2.1.9(@types/node@22.19.1)(terser@5.44.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.1 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vscode-oniguruma@1.7.0: {} vscode-textmate@8.0.0: {} @@ -11596,12 +12531,51 @@ snapshots: dependencies: makeerror: 1.0.12 + watchpack@2.5.0: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + web-streams-polyfill@4.0.0-beta.3: {} webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} + webpack-sources@3.3.3: {} + + webpack@5.104.1(@swc/core@1.15.8): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.8)(webpack@5.104.1(@swc/core@1.15.8)) + watchpack: 2.5.0 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -11710,6 +12684,9 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.2: {}