diff --git a/AGENTS.md b/AGENTS.md index 1a0f440..02da61e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,7 +20,7 @@ ## Tech Stack -Bun 1.2+, TypeScript 5.9, Effect 3.21, React 19, Vite 8, Vitest 4, Tailwind CSS +Bun 1.2+, TypeScript 5.9, Effect 4-beta, React 19, Vite 8, Vitest 4, Tailwind CSS 4, Biome 2.4 ## Code Style @@ -68,7 +68,7 @@ commits in these repos to ensure the LLM references current code: If any of the folders are missing (they are git ignored), clone them into `reference/`: -- `https://github.com/Effect-TS/effect.git` -> `.reference/effect/` +- `https://github.com/Effect-TS/effect-smol.git` -> `.reference/effect/` - `https://github.com/Effect-TS/effect-atom.git` -> `.reference/effect-atom/` --- diff --git a/README.md b/README.md index 1cd195a..2804007 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ bun format bun lint # Type check -bun type-check +bun run type-check ``` ### Testing diff --git a/apps/client/README.md b/apps/client/README.md index e86772c..0bb9f77 100644 --- a/apps/client/README.md +++ b/apps/client/README.md @@ -6,9 +6,9 @@ React frontend built with Vite and TypeScript, part of the ## Stack - **React 19** - UI framework -- **Vite** - Build tool and dev server +- **Vite 8** - Build tool and dev server - **TypeScript** - Type safety -- **Effect** - Functional programming utilities +- **Effect 4-beta** - Functional programming utilities - **@repo/domain** - Shared types and schemas ## Getting Started diff --git a/apps/client/package.json b/apps/client/package.json index 0bc7a18..5b7931c 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -13,17 +13,14 @@ }, "dependencies": { "@base-ui/react": "^1.5.0", - "@effect-atom/atom-react": "^0.5.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-browser": "^0.76.0", - "@effect/rpc": "^0.75.1", "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@effect/atom-react": "4.0.0-beta.47", + "@effect/platform-browser": "4.0.0-beta.47", "@repo/domain": "workspace:*", "@tailwindcss/vite": "^4.3.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "effect": "3.21.2", + "effect": "4.0.0-beta.47", "lucide-react": "^1.16.0", "radix-ui": "^1.4.3", "react": "^19.2.6", diff --git a/apps/client/src/app.test.tsx b/apps/client/src/app.test.tsx index 59922a7..7d815e2 100644 --- a/apps/client/src/app.test.tsx +++ b/apps/client/src/app.test.tsx @@ -2,38 +2,37 @@ import { describe, expect, test, vi } from "vitest"; import { render } from "vitest-browser-react"; import App from "./app"; -// Mock the atom hooks to avoid real API calls -vi.mock("@effect-atom/atom-react", () => ({ - Result: { +// Mock the atom hooks (v4: @effect/atom-react) +vi.mock("@effect/atom-react", () => ({ + useAtom: vi.fn(() => [{ _tag: "Initial" }, vi.fn()]), + useAtomSet: vi.fn(() => vi.fn()), +})); + +// Mock AsyncResult from effect/unstable/reactivity +vi.mock("effect/unstable/reactivity", () => ({ + AsyncResult: { getOrElse: vi.fn((_result: unknown, fallback: () => unknown) => { return fallback(); }), - match: vi.fn( - (_result: unknown, handlers: Record unknown>) => { - return handlers["onInitial"] ? handlers["onInitial"]() : null; - }, - ), builder: vi.fn(() => ({ onSuccess: vi.fn().mockReturnThis(), onFailure: vi.fn().mockReturnThis(), onInitial: vi.fn().mockReturnThis(), orNull: vi.fn(() => null), })), + match: vi.fn((_result: unknown, _handlers: unknown) => null), isSuccess: vi.fn(() => false), isInitial: vi.fn(() => true), isFailure: vi.fn(() => false), isWaiting: vi.fn(() => false), }, - useAtom: vi.fn(() => [{ _tag: "Initial" }, vi.fn()]), - useAtomSet: vi.fn(() => vi.fn()), })); vi.mock("./lib/atom", () => ({ + runtime: { fn: vi.fn(() => vi.fn()) }, helloAtom: vi.fn(), tickAtom: vi.fn(), - runtime: { - fn: vi.fn(() => vi.fn()), - }, + chatAtom: vi.fn(), })); vi.mock("./lib/web-socket-client", () => ({ diff --git a/apps/client/src/components/chat-box.tsx b/apps/client/src/components/chat-box.tsx index 65ad185..c26464a 100644 --- a/apps/client/src/components/chat-box.tsx +++ b/apps/client/src/components/chat-box.tsx @@ -1,5 +1,6 @@ -import { Result, useAtom } from "@effect-atom/atom-react"; +import { useAtom } from "@effect/atom-react"; import type { ChatResponse, MessageSegment } from "@repo/domain/Chat"; +import { AsyncResult } from "effect/unstable/reactivity"; import { AlertCircle, Loader2, Send } from "lucide-react"; import { type FC, useEffect, useMemo, useRef, useState } from "react"; import { chatAtom } from "@/lib/atoms/chat-atom"; @@ -46,7 +47,7 @@ export function ChatBox() { const readinessAttemptRef = useRef(0); const lastCompletionKeyRef = useRef(null); - const currentResult: ChatResponse = Result.getOrElse( + const currentResult: ChatResponse = AsyncResult.getOrElse( result, () => ({ _tag: "initial" }) as const, ); @@ -54,8 +55,8 @@ export function ChatBox() { const currentSegments = currentResult._tag === "initial" ? [] : currentResult.segments; - const isWaiting = Result.isWaiting(result); - const isFailure = Result.isFailure(result); + const isWaiting = AsyncResult.isWaiting(result); + const isFailure = AsyncResult.isFailure(result); const isStreaming = currentResult._tag === "streaming"; const sendMessages = ( messages: Array<{ @@ -341,7 +342,7 @@ const historyToMessages = (messages: Message[]) => }); const ErrorDisplay: FC<{ - result: Result.Failure; + result: AsyncResult.Failure; }> = ({ result }) => { return (
diff --git a/apps/client/src/components/presence-panel.tsx b/apps/client/src/components/presence-panel.tsx index 1265491..0a9e6a6 100644 --- a/apps/client/src/components/presence-panel.tsx +++ b/apps/client/src/components/presence-panel.tsx @@ -1,10 +1,11 @@ -import { Result, useAtom, useAtomSet } from "@effect-atom/atom-react"; +import { useAtom, useAtomSet } from "@effect/atom-react"; import type { ClientId, ClientInfo, ClientStatus, WebSocketEvent, } from "@repo/domain/WebSocket"; +import { AsyncResult } from "effect/unstable/reactivity"; import { useEffect, useMemo } from "react"; import { Badge } from "@/components/ui/badge"; import { @@ -78,7 +79,7 @@ export function PresencePanel({ className }: { className?: string }) { startSubscription(); }, [startSubscription]); - const events = Result.getOrElse( + const events = AsyncResult.getOrElse( eventsResult, () => [] as readonly WebSocketEvent[], ); @@ -115,9 +116,9 @@ export function PresencePanel({ className }: { className?: string }) { } }; - const isConnected = Result.isSuccess(eventsResult); - const isConnecting = Result.isInitial(eventsResult); - const hasError = Result.isFailure(eventsResult); + const isConnected = AsyncResult.isSuccess(eventsResult); + const isConnecting = AsyncResult.isInitial(eventsResult); + const hasError = AsyncResult.isFailure(eventsResult); return ( @@ -149,7 +150,7 @@ export function PresencePanel({ className }: { className?: string }) { {/* Error Display */} {hasError && - Result.match(eventsResult, { + AsyncResult.match(eventsResult, { onInitial: () => null, onSuccess: () => null, onFailure: (error) => ( diff --git a/apps/client/src/components/rest-card.tsx b/apps/client/src/components/rest-card.tsx index 411b001..997530c 100644 --- a/apps/client/src/components/rest-card.tsx +++ b/apps/client/src/components/rest-card.tsx @@ -1,4 +1,5 @@ -import { Result, useAtom } from "@effect-atom/atom-react"; +import { useAtom } from "@effect/atom-react"; +import { AsyncResult } from "effect/unstable/reactivity"; import { helloAtom } from "@/lib/atoms/hello-atom"; import { Button } from "./ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "./ui/card"; @@ -22,7 +23,7 @@ export const RestCard = () => { - {Result.builder(response) + {AsyncResult.builder(response) .onSuccess((data) => ( { className="flex-1" >
-              
-                Error: {error._tag}
-                {"\n"}
-                Details: {JSON.stringify(error ?? {}, null, 2)}
-              
+              Error: {JSON.stringify(error, null, 2)}
             
)) diff --git a/apps/client/src/components/rpc-card.tsx b/apps/client/src/components/rpc-card.tsx index d57d6cb..aed2a38 100644 --- a/apps/client/src/components/rpc-card.tsx +++ b/apps/client/src/components/rpc-card.tsx @@ -1,4 +1,5 @@ -import { Result, useAtom } from "@effect-atom/atom-react"; +import { useAtom } from "@effect/atom-react"; +import { AsyncResult } from "effect/unstable/reactivity"; import { tickAtom } from "@/lib/atoms/tick-atom"; import { Button } from "./ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "./ui/card"; @@ -6,7 +7,7 @@ import { ResponseCard } from "./ui/response-card"; export const RpcCard = () => { const [result, search] = useAtom(tickAtom); - const event = Result.getOrElse(result, () => null); + const event = AsyncResult.getOrElse(result, () => null); const handleSearch = () => { search({ abort: false }); diff --git a/apps/client/src/lib/atom.ts b/apps/client/src/lib/atom.ts index 086cbd1..2c85b96 100644 --- a/apps/client/src/lib/atom.ts +++ b/apps/client/src/lib/atom.ts @@ -1,12 +1,12 @@ -import { DevTools } from "@effect/experimental"; -import { Atom } from "@effect-atom/atom-react"; import { Layer } from "effect"; +import { DevTools } from "effect/unstable/devtools"; +import { Atom } from "effect/unstable/reactivity"; import { RpcClient } from "./rpc-client"; const ENABLE_DEVTOOLS = import.meta.env.VITE_ENABLE_DEVTOOLS === "true"; export const runtime = Atom.runtime( - RpcClient.Default.pipe( + RpcClient.layer.pipe( Layer.provideMerge(ENABLE_DEVTOOLS ? DevTools.layer() : Layer.empty), ), ); diff --git a/apps/client/src/lib/atoms/chat-atom.ts b/apps/client/src/lib/atoms/chat-atom.ts index 69a6303..beb0226 100644 --- a/apps/client/src/lib/atoms/chat-atom.ts +++ b/apps/client/src/lib/atoms/chat-atom.ts @@ -1,6 +1,6 @@ -import type { Atom } from "@effect-atom/atom-react"; import type { ChatMessage, ChatResponse, ToolCall } from "@repo/domain/Chat"; import { Effect, Stream } from "effect"; +import type { Atom } from "effect/unstable/reactivity"; import { runtime } from "../atom"; import { RpcClient } from "../rpc-client"; @@ -242,7 +242,7 @@ export const chatAtom: Atom.AtomResultFn< }, ), Stream.drop(1), - Stream.catchAll((error: unknown) => { + Stream.catch((error: unknown) => { console.error("[chatAtom] Caught unhandled stream error:", error); const errorMessage = error instanceof Error diff --git a/apps/client/src/lib/atoms/hello-atom.ts b/apps/client/src/lib/atoms/hello-atom.ts index e395d58..c905c81 100644 --- a/apps/client/src/lib/atoms/hello-atom.ts +++ b/apps/client/src/lib/atoms/hello-atom.ts @@ -1,16 +1,12 @@ -import { FetchHttpClient, HttpApiClient } from "@effect/platform"; -import type { Atom } from "@effect-atom/atom-react"; -import { Api, type ApiResponse } from "@repo/domain/Api"; +import { Api } from "@repo/domain/Api"; import { Effect } from "effect"; +import { FetchHttpClient } from "effect/unstable/http"; +import { HttpApiClient } from "effect/unstable/httpapi"; import { runtime } from "../atom"; const SERVER_URL = import.meta.env.VITE_SERVER_URL || "http://localhost:9000"; -export const helloAtom: Atom.AtomResultFn< - void, - typeof ApiResponse.Type, - unknown -> = runtime.fn(() => +export const helloAtom = runtime.fn(() => Effect.gen(function* () { const client = yield* HttpApiClient.make(Api, { baseUrl: SERVER_URL, diff --git a/apps/client/src/lib/atoms/tick-atom.ts b/apps/client/src/lib/atoms/tick-atom.ts index e831037..da0513e 100644 --- a/apps/client/src/lib/atoms/tick-atom.ts +++ b/apps/client/src/lib/atoms/tick-atom.ts @@ -1,6 +1,6 @@ -import type { Atom } from "@effect-atom/atom-react"; import type { TickEvent } from "@repo/domain/Rpc"; import { Effect, Stream } from "effect"; +import type { Atom } from "effect/unstable/reactivity"; import { runtime } from "../atom"; import { RpcClient } from "../rpc-client"; @@ -8,43 +8,42 @@ export const tickAtom: Atom.AtomResultFn< { readonly abort?: boolean }, { text: string; event: typeof TickEvent.Type }, unknown -> = runtime.fn(({ abort = false }: { readonly abort?: boolean }) => - Stream.unwrap( +> = runtime.fn(({ abort = false }: { readonly abort?: boolean }) => { + if (abort) { + return Stream.empty; + } + + return Stream.unwrap( Effect.gen(function* () { yield* Effect.logDebug("Starting Tick Atom Stream"); const rpc = yield* RpcClient; return rpc.client.tick({ ticks: 10 }); - }).pipe((self) => (abort ? Effect.interrupt : self)), - ).pipe( - Stream.catchTags({ - RpcClientError: Effect.die, }), + ).pipe( Stream.mapAccum( - { acc: "" }, + () => ({ acc: "" }), ( state, event, ): readonly [ { acc: string }, - { text: string; event: typeof TickEvent.Type }, + readonly [{ text: string; event: typeof TickEvent.Type }], ] => { switch (event._tag) { case "starting": { const startAcc = "Start"; - return [{ acc: startAcc }, { text: startAcc, event }] as const; + return [{ acc: startAcc }, [{ text: startAcc, event }]] as const; } case "tick": { const tickAcc = `${state.acc}.`; - return [{ acc: tickAcc }, { text: tickAcc, event }] as const; + return [{ acc: tickAcc }, [{ text: tickAcc, event }]] as const; } case "end": { const endAcc = `${state.acc} End`; - return [{ acc: endAcc }, { text: endAcc, event }] as const; + return [{ acc: endAcc }, [{ text: endAcc, event }]] as const; } - default: - return [state, { text: state.acc, event }] as const; } }, ), - ), -); + ); +}); diff --git a/apps/client/src/lib/rpc-client.ts b/apps/client/src/lib/rpc-client.ts index 6eb2118..f45a79d 100644 --- a/apps/client/src/lib/rpc-client.ts +++ b/apps/client/src/lib/rpc-client.ts @@ -1,7 +1,10 @@ -import { FetchHttpClient } from "@effect/platform"; -import { RpcClient as EffectRpcClient, RpcSerialization } from "@effect/rpc"; import { EventRpc } from "@repo/domain/Rpc"; -import { Effect, Layer } from "effect"; +import { Context, Effect, Layer } from "effect"; +import { FetchHttpClient } from "effect/unstable/http"; +import { + RpcClient as EffectRpcClient, + RpcSerialization, +} from "effect/unstable/rpc"; const SERVER_URL = import.meta.env.VITE_SERVER_URL || "http://localhost:9000"; @@ -12,11 +15,14 @@ const ProtocolLive = EffectRpcClient.layerProtocolHttp({ Layer.provide(RpcSerialization.layerNdjson), ); -export class RpcClient extends Effect.Service()("RpcClient", { - dependencies: [ProtocolLive], - scoped: Effect.gen(function* () { +export class RpcClient extends Context.Service()("RpcClient", { + make: Effect.gen(function* () { return { client: yield* EffectRpcClient.make(EventRpc), } as const; }), -}) {} +}) { + static layer = Layer.effect(RpcClient)(RpcClient.make).pipe( + Layer.provide(ProtocolLive), + ); +} diff --git a/apps/client/src/lib/web-socket-client.ts b/apps/client/src/lib/web-socket-client.ts index 5675213..a31618d 100644 --- a/apps/client/src/lib/web-socket-client.ts +++ b/apps/client/src/lib/web-socket-client.ts @@ -1,14 +1,17 @@ import { BrowserSocket } from "@effect/platform-browser"; -import { RpcClient, RpcSerialization } from "@effect/rpc"; -import type { RpcClientError } from "@effect/rpc/RpcClientError"; -import { type Atom, AtomRpc } from "@effect-atom/atom-react"; import type { WebSocketEvent } from "@repo/domain/WebSocket"; import { WebSocketRpc } from "@repo/domain/WebSocket"; import { type Cause, Effect, Layer, Stream } from "effect"; +import { type Atom, AtomRpc } from "effect/unstable/reactivity"; +import { + RpcClient, + type RpcClientError, + RpcSerialization, +} from "effect/unstable/rpc"; const WS_URL = import.meta.env.VITE_WS_URL || "ws://localhost:9000/ws"; -export class WebSocketClient extends AtomRpc.Tag()( +export class WebSocketClient extends AtomRpc.Service()( "WebSocketClient", { group: WebSocketRpc, @@ -24,12 +27,13 @@ export class WebSocketClient extends AtomRpc.Tag()( export const presenceSubscriptionAtom: Atom.AtomResultFn< void, readonly WebSocketEvent[], - RpcClientError | Cause.NoSuchElementException + RpcClientError.RpcClientError | Cause.NoSuchElementError > = WebSocketClient.runtime.fn(() => Effect.gen(function* () { yield* Effect.logDebug("Starting presence subscription stream"); const client = yield* WebSocketClient; - return client("subscribe", {}); + // biome-ignore lint/suspicious/noConfusingVoidType: RPC with no payload requires void argument + return client("subscribe", undefined as void); }).pipe( Effect.map((stream) => stream.pipe( diff --git a/apps/server-mcp/README.md b/apps/server-mcp/README.md index c3a2661..03add60 100644 --- a/apps/server-mcp/README.md +++ b/apps/server-mcp/README.md @@ -23,7 +23,7 @@ From the monorepo root: bun dev --filter=server-mcp # Build for production -bun build --filter=server-mcp +bun run build --filter=server-mcp # Test MCP server functionality (MCPJam Inspector) bun --filter=server-mcp run inspector diff --git a/apps/server-mcp/package.json b/apps/server-mcp/package.json index 6311d80..2c757f4 100644 --- a/apps/server-mcp/package.json +++ b/apps/server-mcp/package.json @@ -13,17 +13,14 @@ "clean": "git clean -xdf .cache .turbo dist node_modules" }, "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-bun": "^0.89.0", + "@effect/platform-bun": "4.0.0-beta.47", "@repo/domain": "workspace:*", "@repo/observability": "workspace:*", - "effect": "3.21.2" + "effect": "4.0.0-beta.47" }, "devDependencies": { - "@effect/language-service": "^0.86.1", - "@effect/vitest": "^0.29.0", + "@effect/language-service": "^0.85.1", + "@effect/vitest": "4.0.0-beta.47", "@repo/config-typescript": "workspace:*", "@types/bun": "1.3.14", "vitest": "^4.1.6" diff --git a/apps/server-mcp/src/index.ts b/apps/server-mcp/src/index.ts index 069d619..61bf8db 100644 --- a/apps/server-mcp/src/index.ts +++ b/apps/server-mcp/src/index.ts @@ -1,9 +1,9 @@ -import { McpServer, Tool, Toolkit } from "@effect/ai"; -import { DevTools } from "@effect/experimental"; -import { HttpLayerRouter, HttpServer } from "@effect/platform"; import { BunHttpServer, BunRuntime } from "@effect/platform-bun"; import { ObservabilityLive } from "@repo/observability"; import { Config, Effect, Layer, Schema } from "effect"; +import { McpServer, Tool, Toolkit } from "effect/unstable/ai"; +import { DevTools } from "effect/unstable/devtools"; +import { HttpRouter, HttpServer } from "effect/unstable/http"; // Define Resources const ResourceLayer = Layer.mergeAll( @@ -23,9 +23,9 @@ const PromptLayer = Layer.mergeAll( McpServer.prompt({ name: "Hello Prompt", description: "A simple greeting prompt", - parameters: Schema.Struct({ + parameters: { name: Schema.String, - }), + }, content: ({ name }) => Effect.succeed( `Hello, ${name}! Welcome to the MCP server demonstration.`, @@ -40,26 +40,24 @@ class AiTools extends Toolkit.make( description: "Get a hilarious dad joke from the ICanHazDadJoke API", success: Schema.String, failure: Schema.Never, - parameters: { - searchTerm: Schema.String.annotations({ + parameters: Schema.Struct({ + searchTerm: Schema.String.annotate({ description: "The search term to use to find dad jokes", }), - }, + }), }), // You can add more tools here ) {} const ToolLayer = McpServer.toolkit(AiTools).pipe( Layer.provide( - AiTools.toLayer( - Effect.succeed({ - GetDadJoke: ({ searchTerm }) => - Effect.succeed( - `Here's a dad joke about ${searchTerm}: Why don't ${searchTerm}s ever get lost? Because they always follow the map!`, - ), - // add implementation for more tools here - }), - ), + AiTools.toLayer({ + GetDadJoke: (params) => + Effect.succeed( + `Here's a dad joke about ${params.searchTerm}: Why don't ${params.searchTerm}s ever get lost? Because they always follow the map!`, + ), + // add implementation for more tools here + }), ), ); @@ -71,14 +69,14 @@ const ServerConfig = Config.all({ enableDevTools: Config.boolean("DEVTOOLS").pipe(Config.withDefault(false)), }); -const McpRouter = McpServer.layerHttpRouter({ +const McpRouter = McpServer.layerHttp({ name: "BEVR MCP Server", version: "0.1.0", path: "/mcp", }).pipe( Layer.provideMerge(McpLive), Layer.provide( - HttpLayerRouter.cors({ + HttpRouter.cors({ allowedOrigins: ["*"], allowedMethods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], allowedHeaders: ["Content-Type", "Authorization", "mcp-protocol-version"], @@ -94,9 +92,9 @@ const DevToolsLive = Effect.gen(function* () { } yield* Effect.logInfo("Enabling DevTools Layer"); return DevTools.layer(); -}).pipe(Layer.unwrapEffect); +}).pipe(Layer.unwrap); -const HttpLive = HttpLayerRouter.serve(McpRouter).pipe( +const HttpLive = HttpRouter.serve(McpRouter).pipe( HttpServer.withLogAddress, Layer.provideMerge(DevToolsLive), Layer.provideMerge(ObservabilityLive), diff --git a/apps/server/README.md b/apps/server/README.md index 68e667c..004b124 100644 --- a/apps/server/README.md +++ b/apps/server/README.md @@ -19,7 +19,7 @@ From the monorepo root: bun dev --filter=server # Build for production -bun build --filter=server +bun run build --filter=server ``` The API runs on `http://localhost:9000` in development. diff --git a/apps/server/package.json b/apps/server/package.json index 800fdf4..829249c 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -12,20 +12,16 @@ "clean": "git clean -xdf .cache .turbo dist node_modules" }, "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-bun": "^0.89.0", - "@effect/rpc": "^0.75.1", + "@effect/platform-bun": "4.0.0-beta.47", "@repo/ai": "workspace:*", "@repo/presence": "workspace:*", "@repo/domain": "workspace:*", "@repo/observability": "workspace:*", - "effect": "3.21.2" + "effect": "4.0.0-beta.47" }, "devDependencies": { - "@effect/language-service": "^0.86.1", - "@effect/vitest": "^0.29.0", + "@effect/language-service": "^0.85.1", + "@effect/vitest": "4.0.0-beta.47", "@repo/config-typescript": "workspace:*", "@types/bun": "1.3.14", "vitest": "^4.1.6" diff --git a/apps/server/src/Api/Health.ts b/apps/server/src/Api/Health.ts index cdaf1e5..ec4cb6c 100644 --- a/apps/server/src/Api/Health.ts +++ b/apps/server/src/Api/Health.ts @@ -1,7 +1,6 @@ -import { HttpApiBuilder } from "@effect/platform"; import { Api } from "@repo/domain/Api"; import { Effect } from "effect"; - +import { HttpApiBuilder } from "effect/unstable/httpapi"; export const HealthGroupLive = HttpApiBuilder.group(Api, "health", (handlers) => handlers.handle("get", () => Effect.succeed("Hello Effect!")), ); diff --git a/apps/server/src/Api/Hello.ts b/apps/server/src/Api/Hello.ts index 927d25b..e9c12a6 100644 --- a/apps/server/src/Api/Hello.ts +++ b/apps/server/src/Api/Hello.ts @@ -1,6 +1,6 @@ -import { HttpApiBuilder } from "@effect/platform"; import { Api, type ApiResponse } from "@repo/domain/Api"; import { Effect } from "effect"; +import { HttpApiBuilder } from "effect/unstable/httpapi"; export const HelloGroupLive = HttpApiBuilder.group(Api, "hello", (handlers) => handlers.handle("get", () => { diff --git a/apps/server/src/Rpc/Event.ts b/apps/server/src/Rpc/Event.ts index b375677..db581c9 100644 --- a/apps/server/src/Rpc/Event.ts +++ b/apps/server/src/Rpc/Event.ts @@ -1,29 +1,29 @@ -import { Prompt } from "@effect/ai"; import { ChatService } from "@repo/ai"; import { EventRpc, type TickEvent } from "@repo/domain/Rpc"; -import { Effect, Mailbox } from "effect"; +import { Effect, Queue } from "effect"; +import { Prompt } from "effect/unstable/ai"; export const EventRpcLive = EventRpc.toLayer( Effect.gen(function* () { const bot = yield* ChatService; yield* Effect.logInfo("Starting Event RPC Live Implementation"); - return { + return EventRpc.of({ tick: Effect.fn(function* (payload) { yield* Effect.logDebug("Creating new tick stream"); - const mailbox = yield* Mailbox.make(); + const queue = yield* Queue.unbounded(); yield* Effect.forkScoped( Effect.gen(function* () { - yield* mailbox.offer({ _tag: "starting" }); + yield* Queue.offer(queue, { _tag: "starting" }); yield* Effect.sleep("3 seconds"); for (let i = 0; i < payload.ticks; i++) { yield* Effect.sleep("1 second"); - yield* mailbox.offer({ _tag: "tick" }); + yield* Queue.offer(queue, { _tag: "tick" }); } - yield* mailbox.offer({ _tag: "end" }); + yield* Queue.offer(queue, { _tag: "end" }); yield* Effect.logDebug("End event sent"); - }).pipe(Effect.ensuring(mailbox.end)), + }).pipe(Effect.ensuring(Queue.shutdown(queue))), ); - return mailbox; + return queue; }), chat: ({ messages }) => bot.chat( @@ -38,6 +38,6 @@ export const EventRpcLive = EventRpc.toLayer( }); }), ), - }; + }); }), ); diff --git a/apps/server/src/Rpc/Presence.ts b/apps/server/src/Rpc/Presence.ts index fd5edf9..30efd31 100644 --- a/apps/server/src/Rpc/Presence.ts +++ b/apps/server/src/Rpc/Presence.ts @@ -3,19 +3,20 @@ import { type WebSocketEvent, WebSocketRpc, } from "@repo/domain/WebSocket"; -import { PresenceService } from "@repo/presence"; -import { DateTime, Effect, Mailbox, Queue, Stream } from "effect"; +import { ClientGenerator, PresenceService } from "@repo/presence"; +import { DateTime, Effect, Layer, Queue, Stream } from "effect"; export const PresenceRpcLive = WebSocketRpc.toLayer( Effect.gen(function* () { const presence = yield* PresenceService; + const gen = yield* ClientGenerator; yield* Effect.logInfo("Starting Presence RPC Live Implementation"); - return { + return WebSocketRpc.of({ subscribe: Effect.fn(function* () { yield* Effect.logDebug("New presence subscription"); - const clientId = presence.generateClientId(); + const clientId = yield* gen.generateClientId(); const connectedAt = yield* DateTime.now; const clientInfo: ClientInfo = { clientId, @@ -23,14 +24,11 @@ export const PresenceRpcLive = WebSocketRpc.toLayer( connectedAt, }; - const mailbox = yield* Mailbox.make(); - - // CRITICAL: Subscribe to PubSub FIRST to ensure we don't miss any events - const subscription = yield* presence.subscribe(); + const queue = yield* Queue.unbounded(); // Fork the stream consumer to handle incoming PubSub events yield* Effect.forkScoped( - Stream.fromQueue(subscription).pipe( + presence.subscribe.pipe( Stream.tap((event) => Effect.gen(function* () { // Filter out our own user_joined event since we send "connected" instead @@ -40,15 +38,14 @@ export const PresenceRpcLive = WebSocketRpc.toLayer( ) { return; } - yield* mailbox.offer(event); + yield* Queue.offer(queue, event); }), ), Stream.runDrain, Effect.ensuring( Effect.gen(function* () { - yield* Queue.shutdown(subscription); yield* presence.removeClient(clientId); - yield* mailbox.end; + yield* Queue.shutdown(queue); yield* Effect.logDebug( `Presence subscription ended for ${clientId}`, ); @@ -58,13 +55,13 @@ export const PresenceRpcLive = WebSocketRpc.toLayer( ); // Get existing clients BEFORE adding ourselves - const existingClients = yield* presence.getClients(); + const existingClients = presence.getClients(); // Now add ourselves - this publishes user_joined to PubSub for other clients yield* presence.addClient(clientId, clientInfo); // Send our own connected event (not user_joined since we're the one connecting) - yield* mailbox.offer({ + yield* Queue.offer(queue, { _tag: "connected", clientId, connectedAt, @@ -72,13 +69,13 @@ export const PresenceRpcLive = WebSocketRpc.toLayer( // Send existing clients as user_joined events so we know who's already here for (const client of existingClients) { - yield* mailbox.offer({ + yield* Queue.offer(queue, { _tag: "user_joined", client, }); } - return mailbox; + return queue; }), setStatus: Effect.fn(function* (payload) { @@ -90,10 +87,13 @@ export const PresenceRpcLive = WebSocketRpc.toLayer( }), getPresence: Effect.fn(function* () { - const clients = yield* presence.getClients(); + const clients = presence.getClients(); yield* Effect.logDebug(`Returning ${clients.length} clients`); return { clients: [...clients] }; }), - }; + }); }), +).pipe( + Layer.provide(PresenceService.layer), + Layer.provide(ClientGenerator.layer), ); diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index 74cebab..eade570 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -1,7 +1,4 @@ -import { DevTools } from "@effect/experimental"; -import { HttpLayerRouter, HttpServer } from "@effect/platform"; import { BunHttpServer, BunRuntime } from "@effect/platform-bun"; -import { RpcSerialization, RpcServer } from "@effect/rpc"; import { ChatService, FastModelLive, SampleToolkitLive } from "@repo/ai"; import { Api } from "@repo/domain/Api"; import { EventRpc } from "@repo/domain/Rpc"; @@ -9,6 +6,10 @@ import { WebSocketRpc } from "@repo/domain/WebSocket"; import { ObservabilityLive } from "@repo/observability"; import { PresenceService } from "@repo/presence"; import { Config, Effect, Layer } from "effect"; +import { DevTools } from "effect/unstable/devtools"; +import { HttpRouter, HttpServer } from "effect/unstable/http"; +import { HttpApiBuilder } from "effect/unstable/httpapi"; +import { RpcSerialization, RpcServer } from "effect/unstable/rpc"; import { HealthGroupLive } from "./Api/Health"; import { HelloGroupLive } from "./Api/Hello"; import { EventRpcLive } from "./Rpc/Event"; @@ -21,6 +22,7 @@ import { PresenceRpcLive } from "./Rpc/Presence"; const ServerConfig = Config.all({ port: Config.number("PORT").pipe(Config.withDefault(9000)), hostname: Config.string("HOST").pipe(Config.withDefault("0.0.0.0")), + idleTimeout: Config.number("IDLE_TIMEOUT").pipe(Config.withDefault(120)), // seconds (Bun default is 10) allowedOrigins: Config.string("ALLOWED_ORIGINS").pipe( Config.withDefault("http://localhost:3000"), ), @@ -32,26 +34,26 @@ const ServerConfig = Config.all({ // ============================================================================ // HTTP API Router -const ApiRouter = HttpLayerRouter.addHttpApi(Api).pipe( - Layer.provide(Layer.merge(HealthGroupLive, HelloGroupLive)), +const ApiRouter = HttpApiBuilder.layer(Api).pipe( + Layer.provide([HealthGroupLive, HelloGroupLive]), ); // HTTP RPC Router (for EventRpc - streaming over HTTP) -const HttpRpcRouter = RpcServer.layerHttpRouter({ +const HttpRpcRouter = RpcServer.layerHttp({ group: EventRpc, path: "/rpc", protocol: "http", // Use HTTP for EventRpc spanPrefix: "rpc", }).pipe( Layer.provide(EventRpcLive), - Layer.provide(ChatService.Default), + Layer.provide(ChatService.layer), Layer.provide(SampleToolkitLive), Layer.provide(FastModelLive), Layer.provide(RpcSerialization.layerNdjson), ); // WebSocket RPC Router (for PresenceRpc - real-time presence) -const WebSocketRpcRouter = RpcServer.layerHttpRouter({ +const WebSocketRpcRouter = RpcServer.layerHttp({ group: WebSocketRpc, path: "/ws", protocol: "websocket", // Use WebSocket for PresenceRpc! @@ -59,7 +61,7 @@ const WebSocketRpcRouter = RpcServer.layerHttpRouter({ disableFatalDefects: true, }).pipe( Layer.provide(PresenceRpcLive), - Layer.provide(PresenceService.Default), + Layer.provide(PresenceService.layer), Layer.provide(RpcSerialization.layerNdjson), ); @@ -74,7 +76,7 @@ const DevToolsLive = Effect.gen(function* () { } yield* Effect.logInfo("Enabling DevTools Layer"); return DevTools.layer(); -}).pipe(Layer.unwrapEffect); +}).pipe(Layer.unwrap); const HttpLive = Effect.gen(function* () { const config = yield* ServerConfig; @@ -92,7 +94,7 @@ const HttpLive = Effect.gen(function* () { WebSocketRpcRouter, ).pipe( Layer.provide( - HttpLayerRouter.cors({ + HttpRouter.cors({ allowedOrigins, allowedMethods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], allowedHeaders: ["Content-Type", "Authorization", "B3", "traceparent"], @@ -101,12 +103,12 @@ const HttpLive = Effect.gen(function* () { ), ); - return HttpLayerRouter.serve(AllRouters).pipe( + return HttpRouter.serve(AllRouters).pipe( HttpServer.withLogAddress, Layer.provideMerge(DevToolsLive), Layer.provideMerge(ObservabilityLive), Layer.provideMerge(BunHttpServer.layerConfig(ServerConfig)), ); -}).pipe(Layer.unwrapEffect, Layer.launch); +}).pipe(Layer.unwrap, Layer.launch); BunRuntime.runMain(HttpLive); diff --git a/bun.lock b/bun.lock index 14355d0..e8c90c8 100644 --- a/bun.lock +++ b/bun.lock @@ -19,17 +19,14 @@ "version": "0.0.0", "dependencies": { "@base-ui/react": "^1.5.0", - "@effect-atom/atom-react": "^0.5.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-browser": "^0.76.0", - "@effect/rpc": "^0.75.1", + "@effect/atom-react": "4.0.0-beta.47", + "@effect/platform-browser": "4.0.0-beta.47", "@fontsource-variable/jetbrains-mono": "^5.2.8", "@repo/domain": "workspace:*", "@tailwindcss/vite": "^4.3.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "effect": "3.21.2", + "effect": "4.0.0-beta.47", "lucide-react": "^1.16.0", "radix-ui": "^1.4.3", "react": "^19.2.6", @@ -62,20 +59,16 @@ "name": "server", "version": "0.0.1", "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-bun": "^0.89.0", - "@effect/rpc": "^0.75.1", + "@effect/platform-bun": "4.0.0-beta.47", "@repo/ai": "workspace:*", "@repo/domain": "workspace:*", "@repo/observability": "workspace:*", "@repo/presence": "workspace:*", - "effect": "3.21.2", + "effect": "4.0.0-beta.47", }, "devDependencies": { - "@effect/language-service": "^0.86.1", - "@effect/vitest": "^0.29.0", + "@effect/language-service": "^0.85.1", + "@effect/vitest": "4.0.0-beta.47", "@repo/config-typescript": "workspace:*", "@types/bun": "1.3.14", "vitest": "^4.1.6", @@ -85,17 +78,14 @@ "name": "server-mcp", "version": "0.0.1", "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/experimental": "^0.60.0", - "@effect/platform": "^0.96.1", - "@effect/platform-bun": "^0.89.0", + "@effect/platform-bun": "4.0.0-beta.47", "@repo/domain": "workspace:*", "@repo/observability": "workspace:*", - "effect": "3.21.2", + "effect": "4.0.0-beta.47", }, "devDependencies": { - "@effect/language-service": "^0.86.1", - "@effect/vitest": "^0.29.0", + "@effect/language-service": "^0.85.1", + "@effect/vitest": "4.0.0-beta.47", "@repo/config-typescript": "workspace:*", "@types/bun": "1.3.14", "vitest": "^4.1.6", @@ -105,11 +95,9 @@ "name": "@repo/ai", "version": "0.0.0", "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/ai-anthropic": "^0.25.0", - "@effect/platform": "^0.96.1", + "@effect/ai-anthropic": "4.0.0-beta.47", "@repo/domain": "workspace:*", - "effect": "^3.21.2", + "effect": "4.0.0-beta.47", }, "devDependencies": { "@repo/config-typescript": "workspace:*", @@ -123,9 +111,7 @@ "name": "@repo/domain", "version": "0.0.0", "dependencies": { - "@effect/platform": "^0.96.1", - "@effect/rpc": "^0.75.1", - "effect": "^3.21.2", + "effect": "4.0.0-beta.47", }, "devDependencies": { "@repo/config-typescript": "workspace:*", @@ -135,12 +121,12 @@ "name": "@repo/observability", "version": "0.0.0", "dependencies": { - "@effect/opentelemetry": "^0.63.0", - "@effect/platform": "^0.96.1", - "@effect/rpc": "^0.75.1", - "@opentelemetry/exporter-trace-otlp-http": "^0.218.0", - "@opentelemetry/sdk-trace-base": "^2.7.1", - "effect": "^3.21.2", + "@effect/opentelemetry": "4.0.0-beta.47", + "@opentelemetry/exporter-trace-otlp-http": "^0.214.0", + "@opentelemetry/sdk-trace-base": "^2.6.1", + "@opentelemetry/sdk-trace-node": "^2.6.1", + "@opentelemetry/sdk-trace-web": "^2.6.1", + "effect": "4.0.0-beta.47", }, "devDependencies": { "@repo/config-typescript": "workspace:*", @@ -151,7 +137,7 @@ "version": "0.0.0", "dependencies": { "@repo/domain": "workspace:*", - "effect": "^3.21.2", + "effect": "4.0.0-beta.47", }, "devDependencies": { "@repo/config-typescript": "workspace:*", @@ -162,11 +148,9 @@ "packages": { "@adobe/css-tools": ["@adobe/css-tools@4.4.4", "", {}, "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg=="], - "@anthropic-ai/tokenizer": ["@anthropic-ai/tokenizer@0.0.4", "", { "dependencies": { "@types/node": "^18.11.18", "tiktoken": "^1.0.10" } }, "sha512-EHRKbxlxlc8W4KCBEseByJ7YwyYCmgu9OyN59H9+IYIGPoKv8tXyQXinkeGDI+cI8Tiuz9wk2jZb/kK7AyvL7g=="], - "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], - "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="], + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], @@ -176,7 +160,7 @@ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA=="], + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], @@ -202,7 +186,7 @@ "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], - "@babel/parser": ["@babel/parser@7.29.3", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA=="], + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], @@ -246,41 +230,25 @@ "@blazediff/core": ["@blazediff/core@1.9.1", "", {}, "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA=="], - "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.66.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.4", "which": "^4.0.0", "yocto-spinner": "^1.1.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-qlQFhHUjhRDybrinqLAD0MClVZDOrsq80O8eD5iSjz3Qa/4f3Jg7SQrOaSobrRyP1QaWIYLGtGpj2c7H0D8NUw=="], + "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.62.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.4", "which": "^4.0.0", "yocto-spinner": "^1.1.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-dHMoiNqIyLnDxbsy16Zr55qN6a52dyocvOiVV4+ptjRIWNrBItbCNjazcv+hwKZGa7+WSKDHLTlyxzpK5yhxaQ=="], "@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="], - "@effect-atom/atom": ["@effect-atom/atom@0.5.3", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.2", "@effect/rpc": "^0.73.0", "effect": "^3.19.15" } }, "sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA=="], - - "@effect-atom/atom-react": ["@effect-atom/atom-react@0.5.0", "", { "dependencies": { "@effect-atom/atom": "^0.5.0" }, "peerDependencies": { "effect": "^3.19", "react": ">=18 <20", "scheduler": "*" } }, "sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw=="], - - "@effect/ai": ["@effect/ai@0.35.0", "", { "dependencies": { "find-my-way-ts": "^0.1.6" }, "peerDependencies": { "@effect/experimental": "^0.60.0", "@effect/platform": "^0.96.0", "@effect/rpc": "^0.75.0", "effect": "^3.21.0" } }, "sha512-VOYFBN/TpHC0sB5AhUGOEJzOTEnuo2bbDtQcDDsU7ffHaE8ZbqZj1CuSHgifbmqMaY9+xofsKMazQZ3jlZfPSw=="], - - "@effect/ai-anthropic": ["@effect/ai-anthropic@0.25.0", "", { "dependencies": { "@anthropic-ai/tokenizer": "^0.0.4" }, "peerDependencies": { "@effect/ai": "^0.35.0", "@effect/experimental": "^0.60.0", "@effect/platform": "^0.96.0", "effect": "^3.21.0" } }, "sha512-Qac2WUmi7qBHppu6uUdyA8Xa441IYXxfBirxe6YSibqVeMVam9uKqvTl0GnSaymHpPc/b0aXdbKUiFfMm3d2Ug=="], + "@effect/ai-anthropic": ["@effect/ai-anthropic@4.0.0-beta.47", "", { "peerDependencies": { "effect": "^4.0.0-beta.47" } }, "sha512-xWhG9lR2PV4obEB3B7CjSJZqdwXAWpRQPfKjcQfYtTmKzPk0y0yzVh7tOktXzEwXXlk8XtB2q3a6flAtvmOxbg=="], - "@effect/cluster": ["@effect/cluster@0.58.2", "", { "dependencies": { "kubernetes-types": "^1.30.0" }, "peerDependencies": { "@effect/platform": "^0.96.1", "@effect/rpc": "^0.75.1", "@effect/sql": "^0.51.1", "@effect/workflow": "^0.18.0", "effect": "^3.21.2" } }, "sha512-oxQ3zUhXq0mJA7Y4TliALMP39Bx0LtAIxcqOW1Bdjh6uk+nG7kul/Puw80SwlcYGv3ul50SG+gvSRUTXB8d3JQ=="], - - "@effect/experimental": ["@effect/experimental@0.60.0", "", { "dependencies": { "uuid": "^11.0.3" }, "peerDependencies": { "@effect/platform": "^0.96.0", "effect": "^3.21.0", "ioredis": "^5", "lmdb": "^3" }, "optionalPeers": ["ioredis", "lmdb"] }, "sha512-i5zIg7Xup2KgHyqHlYtkgqSE1bNzCL0GbbTQxrpIzKF0q/ebknOk/ox8B/gIq2vImjoEE81h/oxU+6i1NH210g=="], + "@effect/atom-react": ["@effect/atom-react@4.0.0-beta.47", "", { "peerDependencies": { "effect": "^4.0.0-beta.47", "react": "^19.2.4", "scheduler": "*" } }, "sha512-jCMf5/TvgVHsd+pzfb5UCvtlxZLN/hokLj5x9yzGe6YAztR7zteDEki/Qm6f4Gn6E5PKsmaoi0WlwzZG4rsD7A=="], "@effect/language-service": ["@effect/language-service@0.86.1", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-jfUuFdtNPKRZ4ZSrgTnfMHPIVq8L9cM+YGEylQ1lhIgNY23ZvfdPg0cUlWESd4q9aGvOWSA8E79AS0qe3j4ROw=="], - "@effect/opentelemetry": ["@effect/opentelemetry@0.63.0", "", { "peerDependencies": { "@effect/platform": "^0.96.0", "@opentelemetry/api": "^1.9", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-logs": ">=0.203.0 <0.300.0", "@opentelemetry/sdk-metrics": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", "@opentelemetry/sdk-trace-web": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.33.0", "effect": "^3.21.0" } }, "sha512-2yUG2QWNATi1uKP0kwhaP5eLp+c5NDzAL3EOpIcGLBAC0cbXZrx4n9Qw/QwUKxpuV+pbhrBUPCiByyWAFKfuCw=="], - - "@effect/platform": ["@effect/platform@0.96.1", "", { "dependencies": { "find-my-way-ts": "^0.1.6", "msgpackr": "^1.11.10", "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^3.21.2" } }, "sha512-cjB1QZZYEP8JXCFNGvBLVi0T6YUBQTmOVEUA3SDbiQ6RUO+p6CE3eyD2vMWmrz5nE8yY5QSAuOV9v0boEcUv+A=="], - - "@effect/platform-browser": ["@effect/platform-browser@0.76.0", "", { "dependencies": { "multipasta": "^0.2.7" }, "peerDependencies": { "@effect/platform": "^0.96.0", "effect": "^3.21.0" } }, "sha512-cUyBpcLstrP/HiNsIePMBAI6R1+u6aRFlAUZb4wf08y1d1Vqf/Dmxsq14ZjBfnSYiqBPrCeYf1ZI+qMGQQL0RA=="], - - "@effect/platform-bun": ["@effect/platform-bun@0.89.0", "", { "dependencies": { "@effect/platform-node-shared": "^0.59.0", "multipasta": "^0.2.7" }, "peerDependencies": { "@effect/cluster": "^0.58.0", "@effect/platform": "^0.96.0", "@effect/rpc": "^0.75.0", "@effect/sql": "^0.51.0", "effect": "^3.21.0" } }, "sha512-ReT5f2vujJfffMOBexrgwJd2RLxgfr2G0c1FyCsoflcjdQJ7RZE3cwHDp1M3hAzmG67wWAssMHqLsX6H/n27sQ=="], - - "@effect/platform-node-shared": ["@effect/platform-node-shared@0.59.0", "", { "dependencies": { "@parcel/watcher": "^2.5.1", "multipasta": "^0.2.7", "ws": "^8.18.2" }, "peerDependencies": { "@effect/cluster": "^0.58.0", "@effect/platform": "^0.96.0", "@effect/rpc": "^0.75.0", "@effect/sql": "^0.51.0", "effect": "^3.21.0" } }, "sha512-3bq2YKKfLY7UFauZSxqZUneCXoA3SMSls82V+0RKunvRlfPuPQW0hVn6t1RkvEdh0PDoygWG2mZXYQa6Iqgp9A=="], + "@effect/opentelemetry": ["@effect/opentelemetry@4.0.0-beta.47", "", { "peerDependencies": { "@opentelemetry/api": "^1.9", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-logs": ">=0.203.0 <0.300.0", "@opentelemetry/sdk-metrics": "^2.0.0", "@opentelemetry/sdk-trace-base": "^2.0.0", "@opentelemetry/sdk-trace-node": "^2.0.0", "@opentelemetry/sdk-trace-web": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.33.0", "effect": "^4.0.0-beta.47" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/resources", "@opentelemetry/sdk-logs", "@opentelemetry/sdk-metrics", "@opentelemetry/sdk-trace-base", "@opentelemetry/sdk-trace-node", "@opentelemetry/sdk-trace-web"] }, "sha512-kuleUnR8GgBMeTB+feYW8XcAWM97njkibpJl7Ew+2utApJC1vHAfnZODprN4atyncFwlMnSqExw8eWkpBE+8Rg=="], - "@effect/rpc": ["@effect/rpc@0.75.1", "", { "dependencies": { "msgpackr": "^1.11.10" }, "peerDependencies": { "@effect/platform": "^0.96.1", "effect": "^3.21.2" } }, "sha512-8yxF8+mMGGEbF8BUCp34HjdJj7CvTpGeZxBcpsDF6v7zPiGbJL1UDLzA8ZqYjmcngBHhPecbmeONTk/LiLAaEg=="], + "@effect/platform-browser": ["@effect/platform-browser@4.0.0-beta.47", "", { "dependencies": { "multipasta": "^0.2.7" }, "peerDependencies": { "effect": "^4.0.0-beta.47" } }, "sha512-1SG/4QwP1ritpBQ+Q7wh8eQDaRF710tKcujIKQyaxwGkFe0idtbGgRMOspb7c1WDpOeSBKFrK9rxXMDAJPrA0g=="], - "@effect/sql": ["@effect/sql@0.51.1", "", { "dependencies": { "uuid": "^11.0.3" }, "peerDependencies": { "@effect/experimental": "^0.60.0", "@effect/platform": "^0.96.1", "effect": "^3.21.2" } }, "sha512-iPDAefrJcI0HcTk9keP9Gq8Pg08K1HmpnmZZt85AqyTcvorhoNsXDFiKBbPldfV2CortwVkacX8KjO9GPpSYCA=="], + "@effect/platform-bun": ["@effect/platform-bun@4.0.0-beta.47", "", { "dependencies": { "@effect/platform-node-shared": "^4.0.0-beta.47" }, "peerDependencies": { "effect": "^4.0.0-beta.47" } }, "sha512-GzX7mqkDaILwXUjubJBH3/kZUBT9a87T37lhopprb07NUu1EF3ViyfYJzcL4npKpcf/8oPAnIVPjnY3fcKRcJw=="], - "@effect/vitest": ["@effect/vitest@0.29.0", "", { "peerDependencies": { "effect": "^3.21.0", "vitest": "^3.2.0" } }, "sha512-DvWr1aeEcaZ8mtu8hNVb4e3rEYvGEwQSr7wsNrW53t6nKYjkmjRICcvVEsXUhjoCblRHSxRsRV0TOt0+UmcvaQ=="], + "@effect/platform-node-shared": ["@effect/platform-node-shared@4.0.0-beta.57", "", { "dependencies": { "@types/ws": "^8.18.1", "ws": "^8.20.0" }, "peerDependencies": { "effect": "^4.0.0-beta.57" } }, "sha512-C976X6f+qHUtLSqcqImuCrjhAHnJV17NC2RvvybsAuDfkyIWU4MyiO2XwgiBeijeNupyr1M/KPKnyjtkNxV9Hw=="], - "@effect/workflow": ["@effect/workflow@0.18.1", "", { "peerDependencies": { "@effect/experimental": "^0.60.0", "@effect/platform": "^0.96.1", "@effect/rpc": "^0.75.1", "effect": "^3.21.2" } }, "sha512-FxsUxkyvd7CyN7tw4bQgmAJv8tf8hUwy72bwGYzKGpeuiEObiUKgO1pg8xM49gB6EtwOdVRJhytwcFc8eM/6ow=="], + "@effect/vitest": ["@effect/vitest@4.0.0-beta.47", "", { "peerDependencies": { "effect": "^4.0.0-beta.47", "vitest": "^3.0.0 || ^4.0.0" } }, "sha512-1KdMUseTTLP+OeEmWwN3PzyMrhHBy47tHol2lotl+GkrmGameXhtD8xFfiO4BIj92jKMY3RBTkIemVBWaG8UyA=="], "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], @@ -302,9 +270,9 @@ "@inquirer/ansi": ["@inquirer/ansi@2.0.5", "", {}, "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw=="], - "@inquirer/confirm": ["@inquirer/confirm@6.0.13", "", { "dependencies": { "@inquirer/core": "^11.1.10", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-wkGPC7yJ5WJk1DJ5SX7fzk+gfj4BM8cf5dDDi71B/551xHrdsZVRJOC0WyikXd0pEsb/9cLniuE4atbsMqmFkw=="], + "@inquirer/confirm": ["@inquirer/confirm@6.0.12", "", { "dependencies": { "@inquirer/core": "^11.1.9", "@inquirer/type": "^4.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og=="], - "@inquirer/core": ["@inquirer/core@11.1.10", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A=="], + "@inquirer/core": ["@inquirer/core@11.1.9", "", { "dependencies": { "@inquirer/ansi": "^2.0.5", "@inquirer/figures": "^2.0.5", "@inquirer/type": "^4.0.5", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg=="], "@inquirer/figures": ["@inquirer/figures@2.0.5", "", {}, "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ=="], @@ -334,7 +302,7 @@ "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], - "@mswjs/interceptors": ["@mswjs/interceptors@0.41.9", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w=="], + "@mswjs/interceptors": ["@mswjs/interceptors@0.41.5", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-Fa2HztoLlZxRN6wVC2KB7q0SvRTKjfP0328NVnSit03+0nzm62syxyT46KGbgq3Vr1A/mmLeQwu3GprB0lNTjw=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], @@ -358,65 +326,57 @@ "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], - "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.218.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw=="], + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.214.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.7.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OPFBYuXEn1E4ja3Y6eeA7O+ZnLBNcXTV5Cgsn1VaqBZ6hC5FnpZPLBNme1LJY8ZtF4aOujPKFoeWN4ik487KuQ=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.7.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-MWXggArM+Y11mPS8VOrqxOj+YMGQSRuvhM91eSBX4xFpJa05mpkeVvM8pPux5ElkEjV5RMgrkisrlP/R83SpBQ=="], - "@opentelemetry/core": ["@opentelemetry/core@2.7.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw=="], + "@opentelemetry/core": ["@opentelemetry/core@2.6.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g=="], - "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.218.0", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/otlp-exporter-base": "0.218.0", "@opentelemetry/otlp-transformer": "0.218.0", "@opentelemetry/resources": "2.7.1", "@opentelemetry/sdk-trace-base": "2.7.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-8dqezsmPhtKitIK/eTipZhYl9EX2/gNQ5zUMhaz3uxEURwfkNf8IPvo6yNfrzbxdtpAOybS/+h7wmIWYqFSpiw=="], + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.214.0", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-exporter-base": "0.214.0", "@opentelemetry/otlp-transformer": "0.214.0", "@opentelemetry/resources": "2.6.1", "@opentelemetry/sdk-trace-base": "2.6.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kIN8nTBMgV2hXzV/a20BCFilPZdAIMYYJGSgfMMRm/Xa+07y5hRDS2Vm12A/z8Cdu3Sq++ZvJfElokX2rkgGgw=="], - "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.218.0", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/otlp-transformer": "0.218.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ZwqpkNL5W7RyGJPDZ9g06DvKp8KFTWPJPN12anpMQYSKpTSU0z3EIZuPq9vPGpS8siFyOqDYDAuCwlNO9FqgbA=="], + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.214.0", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/otlp-transformer": "0.214.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-u1Gdv0/E9wP+apqWf7Wv2npXmgJtxsW2XL0TEv9FZloTZRuMBKmu8cYVXwS4Hm3q/f/3FuCnPTgiwYvIqRSpRg=="], - "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.218.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.218.0", "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1", "@opentelemetry/sdk-logs": "0.218.0", "@opentelemetry/sdk-metrics": "2.7.1", "@opentelemetry/sdk-trace-base": "2.7.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-CFaKH87WAzjuJ4awowTTLzUvMfaRfiOFG5+qm5S5ncyalRtN4ecQ+YmuANJSCrVPuvZFEkUgKhBPBndxi3rHsQ=="], + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.214.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.214.0", "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/sdk-logs": "0.214.0", "@opentelemetry/sdk-metrics": "2.6.1", "@opentelemetry/sdk-trace-base": "2.6.1", "protobufjs": "^7.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-DSaYcuBRh6uozfsWN3R8HsN0yDhCuWP7tOFdkUOVaWD1KVJg8m4qiLUsg/tNhTLS9HUYUcwNpwL2eroLtsZZ/w=="], - "@opentelemetry/resources": ["@opentelemetry/resources@2.7.1", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ=="], + "@opentelemetry/resources": ["@opentelemetry/resources@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA=="], - "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.218.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.218.0", "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag=="], + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.214.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.214.0", "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-zf6acnScjhsaBUU22zXZ/sLWim1dfhUAbGXdMmHmNG3LfBnQ3DKsOCITb2IZwoUsNNMTogqFKBnlIPPftUgGwA=="], - "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.7.1", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ=="], + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ=="], - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.7.1", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/resources": "2.7.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw=="], + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.7.0", "", { "dependencies": { "@opentelemetry/core": "2.7.0", "@opentelemetry/resources": "2.7.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-Yg9zEXJB50DLVLpsKPk7NmNqlPlS+OvqhJGh0A8oawIOTPOwlm4eXs9BMJV7L79lvEwI+dWtAj+YjTyddV336A=="], - "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.7.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.7.1", "@opentelemetry/core": "2.7.1", "@opentelemetry/sdk-trace-base": "2.7.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pCpQxU68lV+I9s9svqMyVu5iHdDDUnqUpSxqwyCU8A9ejEsSnMPCbearwsUO4yk08ZJzAIUCFuReMdVQvHrdvg=="], + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.7.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.7.0", "@opentelemetry/core": "2.7.0", "@opentelemetry/sdk-trace-base": "2.7.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-RrFHOXw0IYp/OThew6QORdybnnLitUAUMCJKcQNBYS0hDkCYarO2vTkVxfrGxCIqd5XHSMvbCpBd/T8ZMw8oSg=="], - "@opentelemetry/sdk-trace-web": ["@opentelemetry/sdk-trace-web@2.7.1", "", { "dependencies": { "@opentelemetry/core": "2.7.1", "@opentelemetry/sdk-trace-base": "2.7.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-K806OouCSOjMd8Nr7+ZCq3QT22tdAzzS/7h8vprfiKjkgFQ99/dvwU8d12WJANA6D5Qtme65hyBAqAu9CkQuxQ=="], + "@opentelemetry/sdk-trace-web": ["@opentelemetry/sdk-trace-web@2.7.0", "", { "dependencies": { "@opentelemetry/core": "2.7.0", "@opentelemetry/sdk-trace-base": "2.7.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-WehQSom/hQO0uDVtYQV5O+UaTQU6UFMevYs0uE33bK/4abEyRHrIZF+3DGMmTaz08jQkCfaa0xTOpR873WKn1g=="], - "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], "@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="], - "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], - - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], - - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], - - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], + "@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], - "@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="], - - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], @@ -632,7 +592,7 @@ "@turbo/windows-arm64": ["@turbo/windows-arm64@2.9.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-fVdCsnmYoKICsycbWuuGp6Jvi51/3G/UluFWuAUCvR8PIW5IJkAk5BM9UF8PSm0Q2IphWHFZjYEgjHsh3B9y/g=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], @@ -642,7 +602,7 @@ "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], @@ -666,33 +626,35 @@ "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="], - "@vitest/browser": ["@vitest/browser@4.1.6", "", { "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.6", "@vitest/utils": "4.1.6", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", "tinyrainbow": "^3.1.0", "ws": "^8.19.0" }, "peerDependencies": { "vitest": "4.1.6" } }, "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA=="], + "@vitest/browser": ["@vitest/browser@4.1.7", "", { "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.7", "@vitest/utils": "4.1.7", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", "tinyrainbow": "^3.1.0", "ws": "^8.19.0" }, "peerDependencies": { "vitest": "4.1.7" } }, "sha512-N2JFGfXoEGVAut+kHeru9dD4BUMq/q5xDvBARNl0tUsly3m5KglLOu8VO/6MkDfOlgxXTycojkt6gBKsuyR+IQ=="], - "@vitest/browser-playwright": ["@vitest/browser-playwright@4.1.6", "", { "dependencies": { "@vitest/browser": "4.1.6", "@vitest/mocker": "4.1.6", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "playwright": "*", "vitest": "4.1.6" } }, "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw=="], + "@vitest/browser-playwright": ["@vitest/browser-playwright@4.1.7", "", { "dependencies": { "@vitest/browser": "4.1.7", "@vitest/mocker": "4.1.7", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "playwright": "*", "vitest": "4.1.7" } }, "sha512-OlTlJej7YN6VwV7zJJoNeaCsctF+JXpzpZ4oBHUbrQFfIq+0KW2f07rprCLh9N/zRIZ0v4Mchn1QDDmWMUhPKw=="], - "@vitest/expect": ["@vitest/expect@4.1.6", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.6", "@vitest/utils": "4.1.6", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg=="], + "@vitest/expect": ["@vitest/expect@4.1.7", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w=="], - "@vitest/mocker": ["@vitest/mocker@4.1.6", "", { "dependencies": { "@vitest/spy": "4.1.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ=="], + "@vitest/mocker": ["@vitest/mocker@4.1.7", "", { "dependencies": { "@vitest/spy": "4.1.7", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA=="], - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.6", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.1.7", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw=="], - "@vitest/runner": ["@vitest/runner@4.1.6", "", { "dependencies": { "@vitest/utils": "4.1.6", "pathe": "^2.0.3" } }, "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA=="], + "@vitest/runner": ["@vitest/runner@4.1.7", "", { "dependencies": { "@vitest/utils": "4.1.7", "pathe": "^2.0.3" } }, "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw=="], - "@vitest/snapshot": ["@vitest/snapshot@4.1.6", "", { "dependencies": { "@vitest/pretty-format": "4.1.6", "@vitest/utils": "4.1.6", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw=="], + "@vitest/snapshot": ["@vitest/snapshot@4.1.7", "", { "dependencies": { "@vitest/pretty-format": "4.1.7", "@vitest/utils": "4.1.7", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw=="], - "@vitest/spy": ["@vitest/spy@4.1.6", "", {}, "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg=="], + "@vitest/spy": ["@vitest/spy@4.1.7", "", {}, "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="], - "@vitest/utils": ["@vitest/utils@4.1.6", "", { "dependencies": { "@vitest/pretty-format": "4.1.6", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ=="], + "@vitest/utils": ["@vitest/utils@4.1.7", "", { "dependencies": { "@vitest/pretty-format": "4.1.7", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw=="], "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], @@ -714,11 +676,11 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.31", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.21", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA=="], "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], - "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], + "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -736,7 +698,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001790", "", {}, "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -836,15 +798,15 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "effect": ["effect@3.21.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg=="], + "effect": ["effect@4.0.0-beta.47", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.5.3", "find-my-way-ts": "^0.1.6", "ini": "^6.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^1.11.8", "multipasta": "^0.2.7", "toml": "^3.0.0", "uuid": "^13.0.0", "yaml": "^2.8.2" } }, "sha512-MRrAO6Oof5TTgEo0Tb37d5G+vSRHopBhEImYiGjMDEpuBzHr4nKg5BeAwQGV1kdjZ9/DhxKVuFZKsF4Uw+KJog=="], - "electron-to-chromium": ["electron-to-chromium@1.5.359", "", {}, "sha512-8lPELWuYZIWk7NDvCNthtmMw/7Q5Wu25NpM4djFMHBmk8DubPAtL4YTOp7ou0e7HyJtwkVlWv8XMLURnrtgJQw=="], + "electron-to-chromium": ["electron-to-chromium@1.5.344", "", {}, "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg=="], "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - "enhanced-resolve": ["enhanced-resolve@5.21.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-mLCNbrQli11K1ySUmuNt4ZUB3OpGIDq4q2vTBTf5cL2lpsRjI9QKqSD0ndjW8FyvcW/Jj46gMe9syyHAsvMa/A=="], + "enhanced-resolve": ["enhanced-resolve@5.21.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], @@ -854,7 +816,7 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="], + "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], @@ -882,11 +844,11 @@ "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], - "express-rate-limit": ["express-rate-limit@8.5.2", "", { "dependencies": { "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A=="], + "express-rate-limit": ["express-rate-limit@8.4.0", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-gDK8yiqKxrGta+3WtON59arrrw6GLmadA1qoFgYXzdcch8fmKDID2XqO8itsi3f1wufXYPT51387dN6cvVBS3Q=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + "fast-check": ["fast-check@4.7.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -896,9 +858,9 @@ "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], - "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="], + "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -920,7 +882,7 @@ "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], - "fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], + "fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -932,7 +894,7 @@ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -950,7 +912,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "graphql": ["graphql@16.14.0", "", {}, "sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q=="], + "graphql": ["graphql@16.13.2", "", {}, "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig=="], "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], @@ -968,7 +930,7 @@ "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], - "hono": ["hono@4.12.21", "", {}, "sha512-uV63apnb0kyPtAUwoWgaGh9HyIFcv8lgmzPZSiTBQAFOFGIzka5EZ1dZocmGnn0XdX0+XTqJ6Tqv7selMuGLRQ=="], + "hono": ["hono@4.12.15", "", {}, "sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg=="], "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], @@ -988,9 +950,11 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], - "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], + "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -1038,9 +1002,9 @@ "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], - "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], - "jose": ["jose@6.2.3", "", {}, "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="], + "jose": ["jose@6.2.2", "", {}, "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -1090,6 +1054,8 @@ "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], "lowlight": ["lowlight@3.3.0", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", "highlight.js": "~11.11.0" } }, "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ=="], @@ -1218,11 +1184,11 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "msgpackr": ["msgpackr@1.11.12", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg=="], + "msgpackr": ["msgpackr@1.11.10", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA=="], "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], - "msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="], + "msw": ["msw@2.13.5", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.7", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-LuJem+CbqbywJtafv4zh5kcCQNmZnKwfJgJ/LcNYjeG3CU/xJLepJM1CNZcbp+oV8tXFGvUfswPGru34Mx7QGQ=="], "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], @@ -1232,15 +1198,13 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - "node-releases": ["node-releases@2.0.44", "", {}, "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ=="], + "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], @@ -1306,11 +1270,13 @@ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + "protobufjs": ["protobufjs@7.5.5", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg=="], + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="], - "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], + "qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], @@ -1350,13 +1316,13 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "reselect": ["reselect@5.2.0", "", {}, "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw=="], + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], - "rettime": ["rettime@0.11.11", "", {}, "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ=="], + "rettime": ["rettime@0.11.8", "", {}, "sha512-0fERGXktJTyJ+h8fBEiPxHPEFOu0h15JY7JtwrOVqR5K+vb99ho6IyOo7ekLS3h4sJCzIDy4VWKIbZUfe9njmg=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -1450,26 +1416,26 @@ "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "tiktoken": ["tiktoken@1.0.22", "", {}, "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA=="], - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - "tinyexec": ["tinyexec@1.1.2", "", {}, "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA=="], + "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], - "tldts": ["tldts@7.0.30", "", { "dependencies": { "tldts-core": "^7.0.30" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw=="], + "tldts": ["tldts@7.0.28", "", { "dependencies": { "tldts-core": "^7.0.28" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw=="], - "tldts-core": ["tldts-core@7.0.30", "", {}, "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q=="], + "tldts-core": ["tldts-core@7.0.28", "", {}, "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], @@ -1490,7 +1456,7 @@ "type-fest": ["type-fest@5.6.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA=="], - "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], @@ -1528,7 +1494,7 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "uuid": ["uuid@11.1.1", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ=="], + "uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], @@ -1540,7 +1506,7 @@ "vite": ["vite@8.0.13", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.1", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw=="], - "vitest": ["vitest@4.1.6", "", { "dependencies": { "@vitest/expect": "4.1.6", "@vitest/mocker": "4.1.6", "@vitest/pretty-format": "4.1.6", "@vitest/runner": "4.1.6", "@vitest/snapshot": "4.1.6", "@vitest/spy": "4.1.6", "@vitest/utils": "4.1.6", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.6", "@vitest/browser-preview": "4.1.6", "@vitest/browser-webdriverio": "4.1.6", "@vitest/coverage-istanbul": "4.1.6", "@vitest/coverage-v8": "4.1.6", "@vitest/ui": "4.1.6", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ=="], + "vitest": ["vitest@4.1.7", "", { "dependencies": { "@vitest/expect": "4.1.7", "@vitest/mocker": "4.1.7", "@vitest/pretty-format": "4.1.7", "@vitest/runner": "4.1.7", "@vitest/snapshot": "4.1.7", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.7", "@vitest/browser-preview": "4.1.7", "@vitest/browser-webdriverio": "4.1.7", "@vitest/coverage-istanbul": "4.1.7", "@vitest/coverage-v8": "4.1.7", "@vitest/ui": "4.1.7", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA=="], "vitest-browser-react": ["vitest-browser-react@2.2.0", "", { "peerDependencies": { "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "vitest": "^4.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oY3KM6305kwJMa6nHo92vVtkOsih7mjEf12dLKuphaF+9ywWPEc+qanIBd394SZ6m5LadVEaG6dicvvizOzmjA=="], @@ -1554,7 +1520,7 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], @@ -1562,11 +1528,13 @@ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "yocto-spinner": ["yocto-spinner@1.2.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw=="], + "yocto-spinner": ["yocto-spinner@1.1.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA=="], "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], @@ -1576,14 +1544,24 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@anthropic-ai/tokenizer/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="], + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.6.1", "", { "dependencies": { "@opentelemetry/core": "2.6.1", "@opentelemetry/resources": "2.6.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw=="], + + "@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@2.7.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ=="], + + "@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@2.7.0", "", { "dependencies": { "@opentelemetry/core": "2.7.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A=="], + + "@opentelemetry/sdk-trace-node/@opentelemetry/core": ["@opentelemetry/core@2.7.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ=="], + + "@opentelemetry/sdk-trace-web/@opentelemetry/core": ["@opentelemetry/core@2.7.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], @@ -1592,10 +1570,14 @@ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@types/set-cookie-parser/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@types/ws/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1616,11 +1598,17 @@ "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + "protobufjs/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], - "type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="], + "server/@effect/language-service": ["@effect/language-service@0.85.1", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw=="], + + "server-mcp/@effect/language-service": ["@effect/language-service@0.85.1", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-EXnJjIy6zQ3nUO/MZ+ynWUb8B895KZPotd1++oTs9JjDkplwM7cb6zo8Zq2zU6piwq+KflO7amXbEfj1UMpHkw=="], + + "shadcn/postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="], "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1628,8 +1616,6 @@ "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "@anthropic-ai/tokenizer/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -1642,12 +1628,20 @@ "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "@types/set-cookie-parser/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@types/ws/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "protobufjs/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "shadcn/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/packages/ai/package.json b/packages/ai/package.json index 36a9351..f63f412 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -13,11 +13,9 @@ "clean": "git clean -xdf .cache .turbo dist node_modules tsconfig.tsbuildinfo" }, "dependencies": { - "@effect/ai": "^0.35.0", - "@effect/ai-anthropic": "^0.25.0", - "@effect/platform": "^0.96.1", + "@effect/ai-anthropic": "4.0.0-beta.47", "@repo/domain": "workspace:*", - "effect": "^3.21.2" + "effect": "4.0.0-beta.47" }, "devDependencies": { "@repo/config-typescript": "workspace:*" diff --git a/packages/ai/src/LanguageModel.ts b/packages/ai/src/LanguageModel.ts index 6a6f7b2..26cf901 100644 --- a/packages/ai/src/LanguageModel.ts +++ b/packages/ai/src/LanguageModel.ts @@ -1,6 +1,6 @@ import { AnthropicClient, AnthropicLanguageModel } from "@effect/ai-anthropic"; -import { FetchHttpClient } from "@effect/platform"; import { Config, Layer } from "effect"; +import { FetchHttpClient } from "effect/unstable/http"; const AnthropicLive = AnthropicClient.layerConfig({ apiKey: Config.redacted("ANTHROPIC_API_KEY"), diff --git a/packages/ai/src/services/ChatService.ts b/packages/ai/src/services/ChatService.ts index 3f3949f..c251c91 100644 --- a/packages/ai/src/services/ChatService.ts +++ b/packages/ai/src/services/ChatService.ts @@ -1,64 +1,58 @@ -import { Chat, Prompt, Toolkit } from "@effect/ai"; import type { ChatStreamPart } from "@repo/domain/Chat"; -import { Cause, Effect, Mailbox, String } from "effect"; +import { Cause, Context, Effect, Layer, Queue, String } from "effect"; +import { Chat, Prompt } from "effect/unstable/ai"; import { SampleToolkit } from "../toolkits/SampleToolkit"; import { runAgenticLoop } from "../workflow/AgenticLoop"; -export class ChatService extends Effect.Service()("ChatService", { - scoped: Effect.gen(function* () { - const chat = Effect.fn("craftsman")(function* ( - history: Array, - ) { - // Create mailbox for streaming events - const mailbox = yield* Mailbox.make(); +export class ChatService extends Context.Service()("ChatService", { + make: Effect.gen(function* () { + const chat = Effect.fn("chat")(function* (history: Array) { + const queue = yield* Queue.make(); - // Fork the agentic loop to run in background yield* Effect.forkScoped( Effect.gen(function* () { yield* Effect.logInfo( `[craftsman] Creating chat with ${1 + history.length} messages`, ); + const systemMessage = String.stripMargin(` |You are a helpful general assistant. |You have access to tools and should use them when appropriate. |Be concise and direct in your responses. `); - const session = yield* Chat.fromPrompt( - Prompt.make(history).pipe(Prompt.setSystem(systemMessage)), - ); - - yield* Effect.logTrace( - Prompt.make(history).pipe(Prompt.setSystem(systemMessage)), + const prompt = Prompt.make(history).pipe( + Prompt.setSystem(systemMessage), ); - yield* Effect.logTrace(yield* session.exportJson); + const session = yield* Chat.fromPrompt(prompt); - const toolkit = yield* Toolkit.merge(SampleToolkit); + const toolkit = yield* SampleToolkit; yield* runAgenticLoop({ chat: session, - mailbox, + queue, toolkit, }); }).pipe( - Effect.ensuring(mailbox.end), - Effect.catchAllCause((cause) => + Effect.catchCause((cause) => Effect.gen(function* () { - yield* Effect.logError(`Agentic loop error: ${cause}`); - yield* mailbox.offer({ + yield* Effect.logError(`Chat error: ${cause}`); + yield* Queue.offer(queue, { _tag: "error", message: `System error: ${Cause.pretty(cause)}`, recoverable: false, }); - yield* mailbox.end; }), ), + Effect.ensuring(Queue.end(queue)), ), ); - return mailbox; + return queue; }); return { chat } as const; }), -}) {} +}) { + static layer = Layer.effect(ChatService)(ChatService.make); +} diff --git a/packages/ai/src/toolkits/SampleToolkit.ts b/packages/ai/src/toolkits/SampleToolkit.ts index 03997c7..74e97a5 100644 --- a/packages/ai/src/toolkits/SampleToolkit.ts +++ b/packages/ai/src/toolkits/SampleToolkit.ts @@ -1,5 +1,9 @@ -import { Tool, Toolkit } from "@effect/ai"; -import { DateTime, Effect, Schema } from "effect"; +import { Data, DateTime, Effect, Schema } from "effect"; +import { Tool, Toolkit } from "effect/unstable/ai"; + +class CalculatorError extends Data.TaggedError("CalculatorError")<{ + readonly message: string; +}> {} /** * Calculator Tool - Safely evaluates mathematical expressions @@ -7,8 +11,10 @@ import { DateTime, Effect, Schema } from "effect"; const calculatorTool = Tool.make("calculate", { description: "Evaluate a mathematical expression safely. Supports basic arithmetic operations (+, -, *, /), exponentiation (^), and common functions (sin, cos, sqrt, etc). Example: calculate(expression: '2 + 2 * 10')", -}).setParameters({ - expression: Schema.String, + parameters: Schema.Struct({ + expression: Schema.String, + }), + success: Schema.String, }); /** @@ -17,8 +23,10 @@ const calculatorTool = Tool.make("calculate", { const echoTool = Tool.make("echo", { description: "Echo back a message. Useful for testing tool calling. Example: echo(message: 'Hello, World!')", -}).setParameters({ - message: Schema.String, + parameters: Schema.Struct({ + message: Schema.String, + }), + success: Schema.String, }); /** @@ -26,9 +34,9 @@ const echoTool = Tool.make("echo", { */ const getCurrentTimeTool = Tool.make("getCurrentTime", { description: - "Get the current date and time in UTC. No parameters required. Example: getCurrentTime()", -}).setParameters({ - message: Schema.String, + "Get the current date and time in a given timezone. Example: getCurrentTime(timezone: 'UTC')", + parameters: Tool.EmptyParams, + success: Schema.String, }); export const SampleToolkit = Toolkit.make( @@ -58,14 +66,18 @@ export const SampleToolkitLive = SampleToolkit.toLayer( try: () => { const value = Function(`"use strict"; return (${sanitized})`)(); if (typeof value !== "number" || Number.isNaN(value)) { - throw new Error("Result is not a valid number"); + throw new CalculatorError({ + message: "Result is not a valid number", + }); } return `${params.expression} = ${value}`; }, catch: (error) => - `Invalid expression: ${error instanceof Error ? error.message : String(error)}`, + new CalculatorError({ + message: `Invalid expression: ${error instanceof Error ? error.message : String(error)}`, + }), }).pipe( - Effect.catchAll((error) => Effect.succeed(`Error: ${error}`)), + Effect.catch((error) => Effect.succeed(`Error: ${error.message}`)), ); }), diff --git a/packages/ai/src/workflow/AgenticLoop.ts b/packages/ai/src/workflow/AgenticLoop.ts index 12506f3..40c441a 100644 --- a/packages/ai/src/workflow/AgenticLoop.ts +++ b/packages/ai/src/workflow/AgenticLoop.ts @@ -1,239 +1,248 @@ -import type { Chat, Tool, Toolkit } from "@effect/ai"; import type { ChatStreamPart } from "@repo/domain/Chat"; -import { Effect, Inspectable, type Mailbox, Ref, Schema, Stream } from "effect"; +import { + type Cause, + Effect, + Inspectable, + type Queue, + Ref, + Schema, + SchemaGetter, + Stream, +} from "effect"; +import type { Chat, Tool, Toolkit } from "effect/unstable/ai"; import { createMailboxEvents } from "./MailboxEvents"; -export const ToolParamsSchema = Schema.parseJson( - Schema.Record({ key: Schema.String, value: Schema.Unknown }), +export const AgenticLoopState = Schema.Struct({ + finishReason: Schema.String, + iteration: Schema.Number, +}); + +export const ToolParamsSchema = Schema.fromJsonString( + Schema.Record(Schema.String, Schema.Unknown), ); -const loop = >({ +const stringifyJson = (value: unknown) => + Schema.encodeUnknownEffect( + Schema.String.pipe( + Schema.decodeTo(Schema.Unknown, { + decode: SchemaGetter.parseJson({}), + encode: SchemaGetter.stringifyJson({ space: 2 }), + }), + ), + )(value).pipe( + Effect.orElseSucceed(() => Inspectable.toStringUnknown(value, 2)), + ); + +const loop = Effect.fn("loop")(function* < + Tools extends Record, +>({ chat, - mailbox, + queue, toolkit, }: { chat: Chat.Service; - mailbox: Mailbox.Mailbox; - toolkit: Toolkit.WithHandler; -}) => - Effect.gen(function* () { - const events = createMailboxEvents(mailbox); - const finishReasonRef = yield* Ref.make("stop"); - const toolParamsRef = yield* Ref.make( - new Map< - string, - { - id: string; - name: string; - params: string; - } - >(), - ); - - yield* chat - .streamText({ - prompt: [], - toolkit, - }) - .pipe( - Stream.runForEach((part) => - Effect.gen(function* () { - switch (part.type) { - case "text-delta": - yield* events.textDelta(part.delta); - break; - - case "tool-params-start": - yield* Effect.logInfo(`Selected tool: ${part.name}`); - - yield* Ref.update(toolParamsRef, (map) => { - const newMap = new Map(map); - newMap.set(part.id, { - id: part.id, - name: part.name, - params: "", - }); - return newMap; - }); - - yield* events.toolCallStart(part.id, { + queue: Queue.Queue; + toolkit: Toolkit.WithHandler; +}) { + const events = createMailboxEvents(queue); + const finishReasonRef = yield* Ref.make("stop"); + const toolParamsRef = yield* Ref.make( + new Map< + string, + { + id: string; + name: string; + params: string; + } + >(), + ); + + yield* chat + .streamText({ + prompt: [], + toolkit, + }) + .pipe( + Stream.runForEach((part) => + Effect.gen(function* () { + switch (part.type) { + case "text-delta": + yield* events.textDelta(part.delta); + break; + + case "tool-params-start": + yield* Effect.logInfo(`Selected tool: ${part.name}`); + + yield* Ref.update(toolParamsRef, (map) => { + const newMap = new Map(map); + newMap.set(part.id, { + id: part.id, name: part.name, + params: "", }); - break; + return newMap; + }); - case "tool-params-delta": { - const toolParamsMap = yield* Ref.get(toolParamsRef); - const existing = toolParamsMap.get(part.id); - - if (!existing) { - yield* Effect.logError( - `Received tool-params-delta for unknown tool: ${part.id}`, - ); - break; - } - - yield* Ref.update(toolParamsRef, (map) => { - const newMap = new Map(map); - newMap.set(part.id, { - ...existing, - params: existing.params + part.delta, - }); - return newMap; - }); + yield* events.toolCallStart(part.id, { + name: part.name, + }); + break; - yield* events.toolCallDelta(part.id, { - argumentsDelta: part.delta, - }); - break; - } + case "tool-params-delta": { + const toolParamsMap = yield* Ref.get(toolParamsRef); + const existing = toolParamsMap.get(part.id); - case "tool-params-end": { - const toolParamsMap = yield* Ref.get(toolParamsRef); - const toolCall = toolParamsMap.get(part.id); - - if (!toolCall) { - yield* Effect.logError( - `Received tool-params-end for unknown tool: ${part.id}`, - ); - break; - } - - const parsedParams = yield* Schema.decodeUnknown( - ToolParamsSchema, - )(toolCall.params?.trim() || "{}").pipe( - Effect.tapError((error) => - Effect.logError( - `Failed to parse tool arguments for ${toolCall.name}: ${Inspectable.toStringUnknown(error, 2)}`, - ), - ), - Effect.orElseSucceed(() => ({})), + if (!existing) { + yield* Effect.logError( + `Received tool-params-delta for unknown tool: ${part.id}`, ); - - yield* events.toolCallComplete(toolCall.id, { - name: toolCall.name, - arguments: parsedParams, - }); - - yield* events.toolExecutionStart(toolCall.id, { - name: toolCall.name, - }); break; } - case "tool-result": { - const resultText = - part.isFailure || typeof part.result === "string" - ? part.result - : yield* Effect.orElseSucceed( - Schema.encode(Schema.parseJson({ space: 2 }))( - part.result, - ), - () => Inspectable.toStringUnknown(part.result, 2), - ); - - if (part.isFailure) { - yield* Effect.logError( - `⚠️ Tool ${part.name}(${part.id}) failed: ${resultText}`, - ); - } - - yield* events.toolExecutionComplete(part.id, { - name: part.name, - result: resultText, - success: !part.isFailure, + yield* Ref.update(toolParamsRef, (map) => { + const newMap = new Map(map); + newMap.set(part.id, { + ...existing, + params: existing.params + part.delta, }); + return newMap; + }); + + yield* events.toolCallDelta(part.id, { + argumentsDelta: part.delta, + }); + break; + } + + case "tool-params-end": { + const toolParamsMap = yield* Ref.get(toolParamsRef); + const toolCall = toolParamsMap.get(part.id); + + if (!toolCall) { + yield* Effect.logError( + `Received tool-params-end for unknown tool: ${part.id}`, + ); break; } - case "finish": - yield* Ref.set(finishReasonRef, part.reason); - if (part.reason !== "tool-calls") { - yield* events.finish(part.reason, { - promptTokens: part.usage.inputTokens ?? 0, - completionTokens: part.usage.outputTokens ?? 0, - totalTokens: part.usage.totalTokens ?? 0, - }); - } - break; + const parsedParams = yield* Schema.decodeUnknownEffect( + ToolParamsSchema, + )(toolCall.params?.trim() || "{}").pipe( + Effect.tapError((error) => + Effect.logError( + `Failed to parse tool arguments for ${toolCall.name}: ${Inspectable.toStringUnknown(error, 2)}`, + ), + ), + Effect.orElseSucceed(() => ({})), + ); + + yield* events.toolCallComplete(toolCall.id, { + name: toolCall.name, + arguments: parsedParams, + }); + + yield* events.toolExecutionStart(toolCall.id, { + name: toolCall.name, + }); + break; + } + + case "tool-result": { + const resultText = + typeof part.result === "string" + ? part.result + : yield* stringifyJson(part.result); - case "error": - yield* events.error( - typeof part.error === "string" - ? part.error - : yield* Effect.orElseSucceed( - Schema.encode(Schema.parseJson({ space: 2 }))( - part.error, - ), - () => Inspectable.toStringUnknown(part.error, 2), - ), - false, + if (part.isFailure) { + yield* Effect.logError( + `Tool ${part.name}(${part.id}) failed: ${resultText}`, ); - break; + } - default: - // Ignore other part types (reasoning, files, etc.) - break; + yield* events.toolExecutionComplete(part.id, { + name: part.name, + result: resultText, + success: !part.isFailure, + }); + break; } - }), - ), - Stream.runDrain, - ); - return yield* Ref.get(finishReasonRef); - }); + case "finish": + yield* Ref.set(finishReasonRef, part.reason); + if (part.reason !== "tool-calls") { + yield* events.finish(part.reason, { + promptTokens: part.usage.inputTokens.total ?? 0, + completionTokens: part.usage.outputTokens.total ?? 0, + totalTokens: + (part.usage.inputTokens.total ?? 0) + + (part.usage.outputTokens.total ?? 0), + }); + } + break; + + case "error": + yield* events.error( + typeof part.error === "string" + ? part.error + : yield* stringifyJson(part.error), + false, + ); + break; + + default: + break; + } + }), + ), + ); + + return yield* Ref.get(finishReasonRef); +}); -export const runAgenticLoop = >({ +export const runAgenticLoop = Effect.fn("runAgenticLoop")(function* < + Tools extends Record, +>({ chat, - mailbox, + queue, toolkit, maxIterations = 12, }: { chat: Chat.Service; - mailbox: Mailbox.Mailbox; - toolkit: Toolkit.WithHandler; + queue: Queue.Queue; + toolkit: Toolkit.WithHandler; maxIterations?: number; -}) => - Effect.gen(function* () { - const events = createMailboxEvents(mailbox); +}) { + const events = createMailboxEvents(queue); - const finalState = yield* Effect.iterate( - { - finishReason: "tool-calls", - iteration: 0, - }, - { - while: (state) => - state.finishReason === "tool-calls" && - state.iteration < maxIterations, - body: (state) => - Effect.gen(function* () { - const iteration = state.iteration + 1; - - yield* events.iterationStart(iteration); - - const finishReason = yield* loop({ chat, mailbox, toolkit }); - - yield* Effect.logDebug( - `Iteration ${iteration} completed with finishReason: ${finishReason}`, - ); - - return { - finishReason, - iteration, - }; - }), - }, + let state = { finishReason: "tool-calls", iteration: 0 }; + + while ( + state.finishReason === "tool-calls" && + state.iteration < maxIterations + ) { + const iteration = state.iteration + 1; + + yield* events.iterationStart(iteration); + + const finishReason = yield* loop({ chat, queue, toolkit }); + + yield* Effect.logDebug( + `Iteration ${iteration} completed with finishReason: ${finishReason}`, + ); + + state = { finishReason, iteration }; + } + + const finalState = state; + + if ( + finalState.finishReason === "tool-calls" && + finalState.iteration >= maxIterations + ) { + yield* events.thinking( + `Reached maximum iterations (${maxIterations}). Stopping here.`, ); + } - // Handle max iterations case - if ( - finalState.finishReason === "tool-calls" && - finalState.iteration >= maxIterations - ) { - yield* events.thinking( - `Reached maximum iterations (${maxIterations}). Stopping here.`, - ); - } - - return finalState; - }); + return finalState; +}); diff --git a/packages/ai/src/workflow/MailboxEvents.ts b/packages/ai/src/workflow/MailboxEvents.ts index 9c538de..421f927 100644 --- a/packages/ai/src/workflow/MailboxEvents.ts +++ b/packages/ai/src/workflow/MailboxEvents.ts @@ -1,57 +1,19 @@ import type { ChatStreamPart } from "@repo/domain/Chat"; -import { Effect, Inspectable, type Mailbox, Schema } from "effect"; +import { type Cause, Effect, Queue } from "effect"; -/** - * MailboxEvents - Typed event emitter for ChatStreamPart - * Provides high-level methods for common event patterns to eliminate boilerplate - */ export const createMailboxEvents = ( - mailbox: Mailbox.Mailbox, + queue: Queue.Queue, ) => ({ - thinking: (message: string) => mailbox.offer({ _tag: "thinking", message }), + thinking: (message: string) => + Queue.offer(queue, { _tag: "thinking", message }), iterationStart: (iteration: number) => - mailbox.offer({ _tag: "iteration-start", iteration }), + Queue.offer(queue, { _tag: "iteration-start", iteration }), iterationEnd: (iteration: number) => - mailbox.offer({ _tag: "iteration-end", iteration }), - textDelta: (delta: string) => mailbox.offer({ _tag: "text-delta", delta }), - textComplete: () => mailbox.offer({ _tag: "text-complete" }), - toolCall: ( - id: string, - params: { - name: string; - description?: string; - arguments: unknown; - }, - ) => - Effect.gen(function* () { - // Start - yield* mailbox.offer({ - _tag: "tool-call-start", - id, - name: params.name, - description: params.description, - }); - - // Delta (stream arguments as JSON) - const argsJson = yield* Effect.orElseSucceed( - Schema.encode(Schema.parseJson({ space: 2 }))(params.arguments), - () => Inspectable.toStringUnknown(params.arguments, 2), - ); - yield* mailbox.offer({ - _tag: "tool-call-delta", - id, - argumentsDelta: argsJson, - }); - - // Complete - yield* mailbox.offer({ - _tag: "tool-call-complete", - id, - name: params.name, - arguments: params.arguments, - }); - }), + Queue.offer(queue, { _tag: "iteration-end", iteration }), + textDelta: (delta: string) => + Queue.offer(queue, { _tag: "text-delta", delta }), + textComplete: () => Queue.offer(queue, { _tag: "text-complete" }), toolCallStart: ( id: string, params: { @@ -59,14 +21,14 @@ export const createMailboxEvents = ( description?: string; }, ) => - mailbox.offer({ + Queue.offer(queue, { _tag: "tool-call-start", id, name: params.name, description: params.description, }), toolCallDelta: (id: string, params: { argumentsDelta: string }) => - mailbox.offer({ + Queue.offer(queue, { _tag: "tool-call-delta", id, argumentsDelta: params.argumentsDelta, @@ -78,7 +40,7 @@ export const createMailboxEvents = ( arguments: unknown; }, ) => - mailbox.offer({ + Queue.offer(queue, { _tag: "tool-call-complete", id, name: params.name, @@ -93,13 +55,13 @@ export const createMailboxEvents = ( }, ) => Effect.gen(function* () { - yield* mailbox.offer({ + yield* Queue.offer(queue, { _tag: "tool-execution-start", id, name: params.name, }); - yield* mailbox.offer({ + yield* Queue.offer(queue, { _tag: "tool-execution-complete", id, name: params.name, @@ -108,7 +70,7 @@ export const createMailboxEvents = ( }); }), toolExecutionStart: (id: string, params: { name: string }) => - mailbox.offer({ + Queue.offer(queue, { _tag: "tool-execution-start", id, name: params.name, @@ -121,7 +83,7 @@ export const createMailboxEvents = ( success: boolean; }, ) => - mailbox.offer({ + Queue.offer(queue, { _tag: "tool-execution-complete", id, name: params.name, @@ -136,12 +98,12 @@ export const createMailboxEvents = ( totalTokens: number; }, ) => - mailbox.offer({ + Queue.offer(queue, { _tag: "finish", finishReason, usage, }), error: (message: string, recoverable = false) => - mailbox.offer({ _tag: "error", message, recoverable }), - end: mailbox.end, + Queue.offer(queue, { _tag: "error", message, recoverable }), + end: Queue.end(queue), }) as const; diff --git a/packages/domain/README.md b/packages/domain/README.md index 7aac9e2..20e4155 100644 --- a/packages/domain/README.md +++ b/packages/domain/README.md @@ -18,7 +18,7 @@ generation. ## Usage -Import types and schemas in your apps: +Import schemas in your apps: ```typescript // In client or server diff --git a/packages/domain/package.json b/packages/domain/package.json index 199f9c7..ebe2257 100644 --- a/packages/domain/package.json +++ b/packages/domain/package.json @@ -17,9 +17,7 @@ "clean": "git clean -xdf .cache .turbo dist node_modules tsconfig.tsbuildinfo" }, "dependencies": { - "@effect/platform": "^0.96.1", - "@effect/rpc": "^0.75.1", - "effect": "^3.21.2" + "effect": "4.0.0-beta.47" }, "devDependencies": { "@repo/config-typescript": "workspace:*" diff --git a/packages/domain/src/Api.ts b/packages/domain/src/Api.ts index 5c581b2..6f425d7 100644 --- a/packages/domain/src/Api.ts +++ b/packages/domain/src/Api.ts @@ -1,5 +1,9 @@ -import { HttpApi, HttpApiEndpoint, HttpApiGroup } from "@effect/platform"; import { Schema } from "effect"; +import { + HttpApi, + HttpApiEndpoint, + HttpApiGroup, +} from "effect/unstable/httpapi"; export const ApiResponse = Schema.Struct({ message: Schema.String, @@ -8,11 +12,11 @@ export const ApiResponse = Schema.Struct({ // Define Domain of API export class HealthGroup extends HttpApiGroup.make("health") - .add(HttpApiEndpoint.get("get", "/").addSuccess(Schema.String)) + .add(HttpApiEndpoint.get("get", "/", { success: Schema.String })) .prefix("/") {} export class HelloGroup extends HttpApiGroup.make("hello") - .add(HttpApiEndpoint.get("get", "/").addSuccess(ApiResponse)) + .add(HttpApiEndpoint.get("get", "/", { success: ApiResponse })) .prefix("/hello") {} export const Api = HttpApi.make("Api").add(HealthGroup).add(HelloGroup); diff --git a/packages/domain/src/Chat.ts b/packages/domain/src/Chat.ts index d846dbf..3b5f9bd 100644 --- a/packages/domain/src/Chat.ts +++ b/packages/domain/src/Chat.ts @@ -4,7 +4,7 @@ import { Schema } from "effect"; // Wire Protocol: ChatStreamPart // ============================================================================ -export const ChatStreamPart = Schema.Union( +export const ChatStreamPart = Schema.Union([ // Text generation Schema.TaggedStruct("text-delta", { delta: Schema.String, @@ -67,7 +67,7 @@ export const ChatStreamPart = Schema.Union( message: Schema.String, recoverable: Schema.Boolean, }), -); +]); export type ChatStreamPart = Schema.Schema.Type; @@ -76,7 +76,7 @@ export type ChatStreamPart = Schema.Schema.Type; // ============================================================================ export const ChatMessage = Schema.Struct({ - role: Schema.Literal("user", "assistant", "system"), + role: Schema.Literals(["user", "assistant", "system"]), content: Schema.String, }); @@ -91,14 +91,14 @@ export const ToolCall = Schema.Struct({ name: Schema.String, arguments: Schema.Unknown, argumentsText: Schema.String, - status: Schema.Literal("proposed", "executing", "complete", "failed"), + status: Schema.Literals(["proposed", "executing", "complete", "failed"]), result: Schema.optional(Schema.String), success: Schema.optional(Schema.Boolean), }); export type ToolCall = Schema.Schema.Type; -export const MessageSegment = Schema.Union( +export const MessageSegment = Schema.Union([ Schema.TaggedStruct("text", { content: Schema.String, isComplete: Schema.Boolean, @@ -106,7 +106,7 @@ export const MessageSegment = Schema.Union( Schema.TaggedStruct("tool-call", { tool: ToolCall, }), -); +]); export type MessageSegment = Schema.Schema.Type; @@ -125,7 +125,7 @@ export const ErrorMetadata = Schema.Struct({ export type ErrorMetadata = Schema.Schema.Type; -export const ChatResponse = Schema.Union( +export const ChatResponse = Schema.Union([ Schema.TaggedStruct("initial", {}), Schema.TaggedStruct("streaming", { segments: Schema.Array(MessageSegment), @@ -141,6 +141,6 @@ export const ChatResponse = Schema.Union( segments: Schema.Array(MessageSegment), error: ErrorMetadata, }), -); +]); export type ChatResponse = Schema.Schema.Type; diff --git a/packages/domain/src/Rpc.ts b/packages/domain/src/Rpc.ts index 069c5cc..6742dc9 100644 --- a/packages/domain/src/Rpc.ts +++ b/packages/domain/src/Rpc.ts @@ -1,18 +1,20 @@ -import { Rpc, RpcGroup } from "@effect/rpc"; import { Schema } from "effect"; +import { Rpc, RpcGroup } from "effect/unstable/rpc"; import { ChatMessage, ChatStreamPart } from "./Chat"; -export const TickEvent = Schema.Union( +// Define Event RPC + +export const TickEvent = Schema.Union([ Schema.TaggedStruct("starting", {}), Schema.TaggedStruct("tick", {}), Schema.TaggedStruct("end", {}), -); +]); export class EventRpc extends RpcGroup.make( Rpc.make("tick", { - payload: Schema.Struct({ + payload: { ticks: Schema.Number, - }), + }, success: TickEvent, stream: true, }), diff --git a/packages/domain/src/WebSocket.ts b/packages/domain/src/WebSocket.ts index a90168c..3ca44f8 100644 --- a/packages/domain/src/WebSocket.ts +++ b/packages/domain/src/WebSocket.ts @@ -1,23 +1,23 @@ -import { Rpc, RpcGroup } from "@effect/rpc"; import { Schema } from "effect"; +import { Rpc, RpcGroup } from "effect/unstable/rpc"; export const ClientId = Schema.String.pipe(Schema.brand("ClientId")); -export const ClientStatus = Schema.Literal("online", "away", "busy"); +export const ClientStatus = Schema.Literals(["online", "away", "busy"]); export type ClientStatus = Schema.Schema.Type; export const ClientInfo = Schema.Struct({ clientId: ClientId, status: ClientStatus, - connectedAt: Schema.DateTimeUtcFromNumber, + connectedAt: Schema.DateTimeUtcFromMillis, }); export type ClientInfo = Schema.Schema.Type; -export const WebSocketEvent = Schema.Union( +export const WebSocketEvent = Schema.Union([ // Initial connection acknowledgment with assigned ClientId Schema.TaggedStruct("connected", { clientId: ClientId, - connectedAt: Schema.DateTimeUtcFromNumber, + connectedAt: Schema.DateTimeUtcFromMillis, }), // Broadcast when a user joins Schema.TaggedStruct("user_joined", { @@ -27,30 +27,29 @@ export const WebSocketEvent = Schema.Union( Schema.TaggedStruct("status_changed", { clientId: ClientId, status: ClientStatus, - changedAt: Schema.DateTimeUtcFromNumber, + changedAt: Schema.DateTimeUtcFromMillis, }), // Broadcast when a user disconnects Schema.TaggedStruct("user_left", { clientId: ClientId, - disconnectedAt: Schema.DateTimeUtcFromNumber, + disconnectedAt: Schema.DateTimeUtcFromMillis, }), -); +]); export type WebSocketEvent = Schema.Schema.Type; export class WebSocketRpc extends RpcGroup.make( // Subscribe to presence events - returns a stream of events Rpc.make("subscribe", { - payload: Schema.Struct({}), success: WebSocketEvent, stream: true, // This makes it a streaming RPC over WebSocket }), // Set your presence status (requires clientId from subscribe) Rpc.make("setStatus", { - payload: Schema.Struct({ + payload: { clientId: ClientId, status: ClientStatus, - }), + }, success: Schema.Struct({ success: Schema.Boolean, }), @@ -58,7 +57,6 @@ export class WebSocketRpc extends RpcGroup.make( // Get current list of connected clients Rpc.make("getPresence", { - payload: Schema.Struct({}), success: Schema.Struct({ clients: Schema.Array(ClientInfo), }), diff --git a/packages/observability/package.json b/packages/observability/package.json index d03069e..4c1cb56 100644 --- a/packages/observability/package.json +++ b/packages/observability/package.json @@ -13,12 +13,12 @@ "clean": "git clean -xdf .cache .turbo dist node_modules tsconfig.tsbuildinfo" }, "dependencies": { - "@effect/platform": "^0.96.1", - "@effect/opentelemetry": "^0.63.0", - "@effect/rpc": "^0.75.1", - "@opentelemetry/exporter-trace-otlp-http": "^0.218.0", - "@opentelemetry/sdk-trace-base": "^2.7.1", - "effect": "^3.21.2" + "@effect/opentelemetry": "4.0.0-beta.47", + "@opentelemetry/exporter-trace-otlp-http": "^0.214.0", + "@opentelemetry/sdk-trace-base": "^2.6.1", + "@opentelemetry/sdk-trace-node": "^2.6.1", + "@opentelemetry/sdk-trace-web": "^2.6.1", + "effect": "4.0.0-beta.47" }, "devDependencies": { "@repo/config-typescript": "workspace:*" diff --git a/packages/observability/src/index.ts b/packages/observability/src/index.ts index f54217b..b3dcd74 100644 --- a/packages/observability/src/index.ts +++ b/packages/observability/src/index.ts @@ -1,54 +1,26 @@ import { NodeSdk } from "@effect/opentelemetry"; import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base"; -import { Config, Effect, Layer, Logger, LogLevel, Option } from "effect"; +import { Config, Effect, Layer, Option, References } from "effect"; -const parseLogLevel = (value: string) => { - switch (value.trim().toLowerCase()) { - case "all": - return LogLevel.All; - case "trace": - return LogLevel.Trace; - case "debug": - return LogLevel.Debug; - case "info": - return LogLevel.Info; - case "warn": - case "warning": - return LogLevel.Warning; - case "error": - return LogLevel.Error; - case "fatal": - return LogLevel.Fatal; - case "none": - return LogLevel.None; - default: - throw new Error( - `Invalid LOG_LEVEL: ${value}. Expected one of All, Trace, Debug, Info, Warning, Error, Fatal, None.`, - ); - } -}; +export const Observability = NodeSdk; -const RuntimeLogLevelConfig = Config.string("LOG_LEVEL").pipe( +const LogLevelConfig = Config.logLevel("LOG_LEVEL").pipe( Config.withDefault("Info"), - Config.mapAttempt(parseLogLevel), ); +export const LogLevelLive = Effect.gen(function* () { + const logLevel = yield* LogLevelConfig; + return Layer.succeed(References.MinimumLogLevel, logLevel); +}).pipe(Layer.unwrap); + const TracingConfig = Config.all({ exporterEndpoint: Config.option(Config.string("OTEL_EXPORTER_OTLP_ENDPOINT")), serviceName: Config.option(Config.string("OTEL_SERVICE_NAME")), }); -export const Observability = NodeSdk; - -export const LogLevelLive = Effect.gen(function* () { - const logLevel = yield* RuntimeLogLevelConfig; - return Logger.minimumLogLevel(logLevel); -}).pipe(Layer.unwrapEffect); - const TracingLive = Effect.gen(function* () { - const logLevel = yield* RuntimeLogLevelConfig; - const logWithConfiguredLevel = Logger.withMinimumLogLevel(logLevel); + const logLevel = yield* LogLevelConfig; const tracing = yield* TracingConfig; const endpoint = Option.getOrUndefined(tracing.exporterEndpoint); const serviceName = Option.getOrUndefined(tracing.serviceName); @@ -56,19 +28,19 @@ const TracingLive = Effect.gen(function* () { if (!endpoint || !serviceName) { yield* Effect.logInfo( "OTEL tracing disabled (set OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_SERVICE_NAME to enable)", - ).pipe(logWithConfiguredLevel); + ).pipe(Effect.provideService(References.MinimumLogLevel, logLevel)); return Layer.empty; } yield* Effect.logInfo( `OTEL tracing enabled: ${serviceName} -> ${endpoint}`, - ).pipe(logWithConfiguredLevel); + ).pipe(Effect.provideService(References.MinimumLogLevel, logLevel)); return NodeSdk.layer(() => ({ resource: { serviceName }, spanProcessor: new BatchSpanProcessor( new OTLPTraceExporter({ url: endpoint }), ), })); -}).pipe(Layer.unwrapEffect); +}).pipe(Layer.unwrap); export const ObservabilityLive = Layer.mergeAll(LogLevelLive, TracingLive); diff --git a/packages/presence/README.md b/packages/presence/README.md index e6b8bc0..981f21e 100644 --- a/packages/presence/README.md +++ b/packages/presence/README.md @@ -11,12 +11,14 @@ status updates, and publishes events through a PubSub. ## Usage ```typescript -import { PresenceService } from "@repo/presence"; +import { PresenceService, ClientGenerator } from "@repo/presence"; import { Effect } from "effect"; const program = Effect.gen(function* () { const presence = yield* PresenceService; - const clientId = presence.generateClientId(); + const client = yield* ClientGenerator; + + const clientId = yield* client.generateClientId(); yield* presence.addClient(clientId, { clientId, status: "online", diff --git a/packages/presence/package.json b/packages/presence/package.json index cb0e9ba..3a1ad97 100644 --- a/packages/presence/package.json +++ b/packages/presence/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@repo/domain": "workspace:*", - "effect": "^3.21.2" + "effect": "4.0.0-beta.47" }, "devDependencies": { "@repo/config-typescript": "workspace:*", diff --git a/packages/presence/src/index.ts b/packages/presence/src/index.ts index 82300c4..90dafb6 100644 --- a/packages/presence/src/index.ts +++ b/packages/presence/src/index.ts @@ -1 +1,2 @@ +export * from "./services/ClientGenerator"; export * from "./services/PresenceService"; diff --git a/packages/presence/src/services/ClientGenerator.ts b/packages/presence/src/services/ClientGenerator.ts new file mode 100644 index 0000000..cf1f5ec --- /dev/null +++ b/packages/presence/src/services/ClientGenerator.ts @@ -0,0 +1,16 @@ +import { ClientId } from "@repo/domain/WebSocket"; +import { Context, Effect, Layer, Random } from "effect"; + +export class ClientGenerator extends Context.Service()( + "ClientGenerator", + { + make: Effect.succeed({ + generateClientId: Effect.fn("generateClientId")(function* () { + const uuid = yield* Random.nextUUIDv4; + return ClientId.make(uuid); + }), + }), + }, +) { + static layer = Layer.effect(ClientGenerator)(ClientGenerator.make); +} diff --git a/packages/presence/src/services/PresenceService.ts b/packages/presence/src/services/PresenceService.ts index 91a3173..cb8a0f9 100644 --- a/packages/presence/src/services/PresenceService.ts +++ b/packages/presence/src/services/PresenceService.ts @@ -1,119 +1,99 @@ -import { +import type { ClientId, - type ClientInfo, - type ClientStatus, - type WebSocketEvent, + ClientInfo, + ClientStatus, + WebSocketEvent, } from "@repo/domain/WebSocket"; -import { DateTime, Effect, PubSub, Ref } from "effect"; +import { Context, DateTime, Effect, Layer, PubSub, Stream } from "effect"; export type PresenceEventType = typeof WebSocketEvent.Type; -export class PresenceService extends Effect.Service()( +export class PresenceService extends Context.Service()( "PresenceService", { - effect: Effect.gen(function* () { + make: Effect.gen(function* () { yield* Effect.logInfo("Initializing PresenceService"); - const clientsRef = yield* Ref.make( - new Map(), - ); - const pubsub = yield* PubSub.sliding(1000); - - const generateClientId = () => ClientId.make(crypto.randomUUID()); + const clientsMap = new Map(); - const addClient = (clientId: typeof ClientId.Type, info: ClientInfo) => - Effect.gen(function* () { - yield* Ref.update(clientsRef, (clients) => { - const newClients = new Map(clients); - newClients.set(clientId, info); - return newClients; - }); + const pubsub = yield* PubSub.sliding(1000); - yield* PubSub.publish(pubsub, { - _tag: "user_joined", - client: info, - }); + const addClient = Effect.fn("PresenceService.addClient")(function* ( + clientId: typeof ClientId.Type, + info: ClientInfo, + ) { + clientsMap.set(clientId, info); - yield* Effect.logDebug(`Client added: ${clientId}`); + yield* PubSub.publish(pubsub, { + _tag: "user_joined", + client: info, }); - const removeClient = (clientId: typeof ClientId.Type) => - Effect.gen(function* () { - const clients = yield* Ref.get(clientsRef); - const client = clients.get(clientId); + yield* Effect.logDebug(`Client added: ${clientId}`); + }); - if (client) { - const disconnectedAt = yield* DateTime.now; + const removeClient = Effect.fn("PresenceService.removeClient")(function* ( + clientId: typeof ClientId.Type, + ) { + const client = clientsMap.get(clientId); - yield* Ref.update(clientsRef, (clients) => { - const newClients = new Map(clients); - newClients.delete(clientId); - return newClients; - }); + if (client) { + const disconnectedAt = yield* DateTime.now; - yield* PubSub.publish(pubsub, { - _tag: "user_left", - clientId, - disconnectedAt, - }); + clientsMap.delete(clientId); - yield* Effect.logDebug(`Client removed: ${clientId}`); - } - }); + yield* PubSub.publish(pubsub, { + _tag: "user_left", + clientId, + disconnectedAt, + }); + + yield* Effect.logDebug(`Client removed: ${clientId}`); + } + }); - const setStatus = ( + const setStatus = Effect.fn("PresenceService.setStatus")(function* ( clientId: typeof ClientId.Type, status: ClientStatus, - ) => - Effect.gen(function* () { - const clients = yield* Ref.get(clientsRef); - const client = clients.get(clientId); - - if (client) { - const changedAt = yield* DateTime.now; - - const updatedClient: ClientInfo = { - ...client, - status, - }; - - yield* Ref.update(clientsRef, (clients) => { - const newClients = new Map(clients); - newClients.set(clientId, updatedClient); - return newClients; - }); - - // Broadcast status_changed to all clients - yield* PubSub.publish(pubsub, { - _tag: "status_changed", - clientId, - status, - changedAt, - }); - - yield* Effect.logDebug( - `Client ${clientId} status changed to ${status}`, - ); - } - }); + ) { + const client = clientsMap.get(clientId); - const getClients = () => - Effect.gen(function* () { - const clients = yield* Ref.get(clientsRef); - return Array.from(clients.values()); - }); + if (client) { + const changedAt = yield* DateTime.now; + const updatedClient: ClientInfo = { + ...client, + status, + }; + + clientsMap.set(clientId, updatedClient); + + yield* PubSub.publish(pubsub, { + _tag: "status_changed", + clientId, + status, + changedAt, + }); + + yield* Effect.logDebug( + `Client ${clientId} status changed to ${status}`, + ); + } + }); + + const getClients = () => Array.from(clientsMap.values()); - const subscribe = () => PubSub.subscribe(pubsub); + const subscribe = Stream.fromPubSub(pubsub); return { pubsub, - generateClientId, addClient, removeClient, setStatus, getClients, subscribe, - }; + } as const; }), }, -) {} +) { + static layer = Layer.effect(PresenceService)(PresenceService.make); +}