From 2948ee032ec3441916c841447449cd86aba4e05c Mon Sep 17 00:00:00 2001 From: tarik02 Date: Fri, 19 Jun 2026 07:35:44 +0300 Subject: [PATCH 1/5] reuse client runtime for rpc connections --- .changeset/runtime-prepared-connection.md | 5 + package.json | 2 + pnpm-lock.yaml | 96 +++++++++++++ pnpm-workspace.yaml | 8 ++ src/auth/error.ts | 9 +- src/auth/transport.ts | 166 ++++++---------------- src/connection/layer.ts | 7 +- src/connection/prepared.ts | 91 ++++++++++++ src/rpc/error.ts | 2 +- src/rpc/index.ts | 1 - src/rpc/layer.ts | 60 ++------ src/runtime/layer.ts | 9 +- upstream-t3code | 2 +- 13 files changed, 273 insertions(+), 185 deletions(-) create mode 100644 .changeset/runtime-prepared-connection.md create mode 100644 src/connection/prepared.ts diff --git a/.changeset/runtime-prepared-connection.md b/.changeset/runtime-prepared-connection.md new file mode 100644 index 0000000..91e93eb --- /dev/null +++ b/.changeset/runtime-prepared-connection.md @@ -0,0 +1,5 @@ +--- +"t3code-cli": minor +--- + +Reuse upstream client-runtime authorization and RPC session creation for CLI connections. diff --git a/package.json b/package.json index 8910be4..1f31b4d 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,9 @@ "devDependencies": { "@changesets/cli": "^2.31.0", "@effect/vitest": "catalog:", + "@t3tools/client-runtime": "workspace:*", "@t3tools/contracts": "workspace:*", + "@t3tools/shared": "workspace:*", "@total-typescript/shoehorn": "^0.1.2", "@types/node": "^25.9.1", "typescript": "^6.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aee3aad..371909f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,15 +6,33 @@ settings: catalogs: default: + '@effect/platform-node': + specifier: 4.0.0-beta.78 + version: 4.0.0-beta.78 '@effect/vitest': specifier: 4.0.0-beta.78 version: 4.0.0-beta.78 + '@noble/curves': + specifier: 1.9.1 + version: 1.9.1 + '@noble/hashes': + specifier: 1.8.0 + version: 1.8.0 + '@types/node': + specifier: ^25.9.1 + version: 25.9.1 effect: specifier: 4.0.0-beta.78 version: 4.0.0-beta.78 + jose: + specifier: 6.2.2 + version: 6.2.2 vite-plus: specifier: 0.1.24 version: 0.1.24 + yaml: + specifier: ^2.9.0 + version: 2.9.0 patchedDependencies: '@effect/vitest@4.0.0-beta.78': @@ -38,9 +56,15 @@ importers: '@effect/vitest': specifier: 'catalog:' version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + '@t3tools/client-runtime': + specifier: workspace:* + version: link:upstream-t3code/packages/client-runtime '@t3tools/contracts': specifier: workspace:* version: link:upstream-t3code/packages/contracts + '@t3tools/shared': + specifier: workspace:* + version: link:upstream-t3code/packages/shared '@total-typescript/shoehorn': specifier: ^0.1.2 version: 0.1.2 @@ -54,6 +78,25 @@ importers: specifier: ^0.1.24 version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + upstream-t3code/packages/client-runtime: + dependencies: + '@t3tools/contracts': + specifier: workspace:* + version: link:../contracts + '@t3tools/shared': + specifier: workspace:* + version: link:../shared + effect: + specifier: 'catalog:' + version: 4.0.0-beta.78 + devDependencies: + '@effect/vitest': + specifier: 'catalog:' + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + vite-plus: + specifier: 'catalog:' + version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + upstream-t3code/packages/contracts: dependencies: effect: @@ -67,6 +110,40 @@ importers: specifier: 'catalog:' version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + upstream-t3code/packages/shared: + dependencies: + '@noble/curves': + specifier: 'catalog:' + version: 1.9.1 + '@noble/hashes': + specifier: 'catalog:' + version: 1.8.0 + '@t3tools/contracts': + specifier: workspace:* + version: link:../contracts + effect: + specifier: 'catalog:' + version: 4.0.0-beta.78 + jose: + specifier: 'catalog:' + version: 6.2.2 + yaml: + specifier: 'catalog:' + version: 2.9.0 + devDependencies: + '@effect/platform-node': + specifier: 'catalog:' + version: 4.0.0-beta.78(effect@4.0.0-beta.78)(ioredis@5.10.1) + '@effect/vitest': + specifier: 'catalog:' + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + '@types/node': + specifier: 'catalog:' + version: 25.9.1 + vite-plus: + specifier: 'catalog:' + version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + packages: '@babel/runtime@7.29.7': @@ -213,6 +290,14 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1015,6 +1100,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jose@6.2.2: + resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -1771,6 +1859,12 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2304,6 +2398,8 @@ snapshots: isexe@2.0.0: {} + jose@6.2.2: {} + js-yaml@3.14.2: dependencies: argparse: 1.0.10 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7263bf7..76e67bd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,13 +1,21 @@ packages: - . + - upstream-t3code/packages/client-runtime - upstream-t3code/packages/contracts + - upstream-t3code/packages/shared catalog: + "@effect/platform-node": 4.0.0-beta.78 "@effect/vitest": 4.0.0-beta.78 + "@noble/curves": 1.9.1 + "@noble/hashes": 1.8.0 + "@types/node": ^25.9.1 effect: 4.0.0-beta.78 + jose: 6.2.2 vite-plus: 0.1.24 vite: npm:@voidzero-dev/vite-plus-core@0.1.24 vitest: npm:@voidzero-dev/vite-plus-test@0.1.24 + yaml: ^2.9.0 patchedDependencies: "@effect/vitest@4.0.0-beta.78": patches/@effect__vitest@4.0.0-beta.78.patch diff --git a/src/auth/error.ts b/src/auth/error.ts index 019bb11..4fbf3fe 100644 --- a/src/auth/error.ts +++ b/src/auth/error.ts @@ -1,7 +1,6 @@ import * as Cause from "effect/Cause"; import * as Schema from "effect/Schema"; import { PlatformError } from "effect/PlatformError"; -import { HttpClientError } from "effect/unstable/http"; import { ConfigError, UrlError } from "../config/error.ts"; @@ -22,13 +21,7 @@ export class AuthTransportError extends Schema.TaggedErrorClass()("t3cli/T3AuthTransport") {} const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { - const client = HttpClient.filterStatusOk(yield* HttpClient.HttpClient); + const httpClient = yield* HttpClient.HttpClient; + const provideHttpClient = (effect: Effect.Effect) => + effect.pipe(Effect.provideService(HttpClient.HttpClient, httpClient)); const bootstrapBearer = Effect.fn("AuthTransport.bootstrapBearer")(function* (input: { readonly baseUrl: string; readonly credential: string; }) { - const url = yield* makeHttpEndpointUrl(input.baseUrl, "/oauth/token"); - const request = HttpClientRequest.post(url).pipe( - HttpClientRequest.acceptJson, - HttpClientRequest.bodyUrlParams({ - grant_type: AuthTokenExchangeGrantType, - subject_token: input.credential, - subject_token_type: AuthEnvironmentBootstrapTokenType, - requested_token_type: AuthAccessTokenType, + const result = yield* provideHttpClient( + bootstrapRemoteBearerSession({ + httpBaseUrl: input.baseUrl, + credential: input.credential, }), - ); - const response = yield* client.execute(request).pipe( - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - }), - ); - const result = yield* response.json.pipe( - Effect.flatMap(decodeAuthAccessTokenResult), - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - SchemaError: (error) => - Effect.fail( - new AuthTransportError({ message: "auth response decode failed", cause: error }), - ), - }), - ); + ).pipe(Effect.mapError(toTransportError("auth request failed"))); const now = yield* DateTime.now; return { authenticated: true, - role: result.scope.split(/\s+/u).includes("access:write") ? "owner" : "client", + role: inferRole(result.scope), sessionMethod: "bearer-access-token", expiresAt: DateTime.formatIso(DateTime.add(now, { seconds: result.expires_in })), sessionToken: result.access_token, @@ -98,89 +65,50 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { const getSession = Effect.fn("AuthTransport.getSession")(function* ( connection: AuthTransportConnection, ) { - const url = yield* makeHttpEndpointUrl(connection.url, "/api/auth/session"); - const request = HttpClientRequest.get(url).pipe(authenticatedRequest(connection)); - const response = yield* client.execute(request).pipe( - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - }), - ); - return yield* response.json.pipe( - Effect.flatMap(decodeAuthSessionState), - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - SchemaError: (error) => - Effect.fail( - new AuthTransportError({ message: "auth response decode failed", cause: error }), - ), + const result = yield* provideHttpClient( + fetchRemoteSessionState({ + httpBaseUrl: connection.url, + bearerToken: connection.token, }), - ); + ).pipe(Effect.mapError(toTransportError("auth request failed"))); + return { + authenticated: result.authenticated, + ...(result.scopes !== undefined ? { role: inferRole(result.scopes.join(" ")) } : {}), + ...(result.sessionMethod !== undefined ? { sessionMethod: result.sessionMethod } : {}), + ...(result.expiresAt !== undefined + ? { expiresAt: DateTime.formatIso(result.expiresAt) } + : {}), + } satisfies AuthSessionState; }); - const issueWebSocketTicket = Effect.fn("AuthTransport.issueWebSocketTicket")(function* ( - connection: AuthTransportConnection, - ) { - const url = yield* makeHttpEndpointUrl(connection.url, "/api/auth/websocket-ticket"); - const request = HttpClientRequest.post(url).pipe(authenticatedRequest(connection)); - const response = yield* client.execute(request).pipe( - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - }), - ); - return yield* response.json.pipe( - Effect.flatMap(decodeAuthWebSocketTicketResult), - Effect.catchTags({ - HttpClientError: (error) => - Effect.fail( - new AuthTransportError({ - message: "auth request failed", - cause: HttpClientError.HttpClientErrorSchema.fromHttpClientError(error), - }), - ), - SchemaError: (error) => - Effect.fail( - new AuthTransportError({ message: "auth response decode failed", cause: error }), - ), - }), - ); - }); + const issueWebSocketTicketForConnection = Effect.fn("AuthTransport.issueWebSocketTicket")( + function* (connection: AuthTransportConnection) { + const result = yield* provideHttpClient( + issueRemoteWebSocketTicket({ + httpBaseUrl: connection.url, + bearerToken: connection.token, + }), + ).pipe(Effect.mapError(toTransportError("auth request failed"))); + return { + ticket: result.ticket, + expiresAt: DateTime.formatIso(result.expiresAt), + } satisfies AuthWebSocketTicketResult; + }, + ); return { bootstrapBearer, getSession, - issueWebSocketTicket, + issueWebSocketTicket: issueWebSocketTicketForConnection, }; }); export const T3AuthTransportLive = Layer.effect(T3AuthTransport, makeT3AuthTransport()); -const authenticatedRequest = - (connection: AuthTransportConnection) => (request: HttpClientRequest.HttpClientRequest) => - request.pipe(HttpClientRequest.acceptJson, HttpClientRequest.bearerToken(connection.token)); +function inferRole(scope: string): AuthBearerBootstrapResult["role"] { + return scope.split(/\s+/u).includes("access:write") ? "owner" : "client"; +} -function makeHttpEndpointUrl(baseUrl: string, path: string) { - return toHttpEndpointUrl(baseUrl, path).pipe( - Effect.catchTags({ - UrlError: (error) => - Effect.fail(new AuthTransportError({ message: "auth request failed", cause: error })), - }), - ); +function toTransportError(message: string) { + return (error: unknown) => new AuthTransportError({ message, cause: error }); } diff --git a/src/connection/layer.ts b/src/connection/layer.ts index b7cffc6..30decd0 100644 --- a/src/connection/layer.ts +++ b/src/connection/layer.ts @@ -1,10 +1,13 @@ +import { rpcSessionFactoryLayer } from "@t3tools/client-runtime/rpc"; import * as Layer from "effect/Layer"; -import { T3AuthTransportLive } from "../auth/transport.ts"; +import { T3PreparedConnectionProviderLive } from "./prepared.ts"; import { T3RpcLive } from "../rpc/layer.ts"; export function makeT3CodeRpcLayer() { - return T3RpcLive.pipe(Layer.provide(T3AuthTransportLive)); + return T3RpcLive.pipe( + Layer.provide(Layer.mergeAll(T3PreparedConnectionProviderLive, rpcSessionFactoryLayer)), + ); } export const T3CodeRpcLayer = makeT3CodeRpcLayer(); diff --git a/src/connection/prepared.ts b/src/connection/prepared.ts new file mode 100644 index 0000000..6194cec --- /dev/null +++ b/src/connection/prepared.ts @@ -0,0 +1,91 @@ +import { + resolveRemoteWebSocketConnectionUrl, + type RemoteEnvironmentAuthError, +} from "@t3tools/client-runtime/authorization"; +import { + BearerConnectionTarget, + type PreparedConnection, +} from "@t3tools/client-runtime/connection"; +import { fetchRemoteEnvironmentDescriptor } from "@t3tools/client-runtime/environment"; +import * as Context from "effect/Context"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import { HttpClient } from "effect/unstable/http"; + +import { toWebSocketEndpointUrl } from "../config/url.ts"; +import { T3CodeConnectionError } from "./error.ts"; +import { T3CodeConnectionProvider } from "./service.ts"; +import type { T3CodeConnection } from "./type.ts"; + +export class T3PreparedConnectionProvider extends Context.Service< + T3PreparedConnectionProvider, + { + readonly get: Effect.Effect; + } +>()("t3cli/T3PreparedConnectionProvider") {} + +export const makePreparedConnection = Effect.fn("makePreparedConnection")(function* ( + connection: T3CodeConnection, +) { + const httpBaseUrl = connection.origin.url; + const wsBaseUrl = yield* toWebSocketEndpointUrl(httpBaseUrl, "/ws").pipe( + Effect.mapError( + (error) => + new T3CodeConnectionError({ + message: "failed to resolve websocket endpoint", + cause: error, + }), + ), + ); + const descriptor = yield* fetchRemoteEnvironmentDescriptor({ httpBaseUrl }).pipe( + Effect.mapError((error) => + mapRemoteConnectionError("failed to fetch environment descriptor", error), + ), + ); + const socketUrl = yield* resolveRemoteWebSocketConnectionUrl({ + httpBaseUrl, + wsBaseUrl, + bearerToken: connection.auth.token, + }).pipe( + Effect.mapError((error) => mapRemoteConnectionError("failed to authorize websocket", error)), + ); + + return { + environmentId: descriptor.environmentId, + label: descriptor.label, + httpBaseUrl, + socketUrl, + httpAuthorization: { + _tag: "Bearer" as const, + token: connection.auth.token, + }, + target: new BearerConnectionTarget({ + environmentId: descriptor.environmentId, + label: descriptor.label, + connectionId: descriptor.environmentId, + }), + } satisfies PreparedConnection; +}); + +export const T3PreparedConnectionProviderLive = Layer.effect( + T3PreparedConnectionProvider, + Effect.gen(function* () { + const connectionProvider = yield* T3CodeConnectionProvider; + const httpClient = yield* HttpClient.HttpClient; + const get = connectionProvider.get.pipe( + Effect.flatMap((connection) => + makePreparedConnection(connection).pipe( + Effect.provideService(HttpClient.HttpClient, httpClient), + ), + ), + ); + return T3PreparedConnectionProvider.of({ get }); + }), +); + +function mapRemoteConnectionError( + message: string, + error: RemoteEnvironmentAuthError, +): T3CodeConnectionError { + return new T3CodeConnectionError({ message, cause: error }); +} diff --git a/src/rpc/error.ts b/src/rpc/error.ts index c123e9f..e187eda 100644 --- a/src/rpc/error.ts +++ b/src/rpc/error.ts @@ -40,7 +40,7 @@ export type RpcKnownCause = Schema.Schema.Type; export class RpcError extends Schema.TaggedErrorClass()("RpcError", { message: Schema.String, method: Schema.optionalKey(Schema.String), - cause: Schema.optionalKey(RpcErrorCauseSchema), + cause: Schema.optionalKey(Schema.Unknown), }) {} export type OrchestrationError = RpcError; diff --git a/src/rpc/index.ts b/src/rpc/index.ts index 1acd42e..a03248a 100644 --- a/src/rpc/index.ts +++ b/src/rpc/index.ts @@ -1,5 +1,4 @@ export { RpcError, type OrchestrationError } from "./error.ts"; -export { makeT3RpcLayer, T3RpcLive } from "./layer.ts"; export { T3RpcOperations, T3RpcOperationsLive, makeT3RpcOperations } from "./operation.ts"; export type { T3RpcOperationsService } from "./operation.ts"; export { T3Rpc } from "./service.ts"; diff --git a/src/rpc/layer.ts b/src/rpc/layer.ts index 84573ae..ebaa980 100644 --- a/src/rpc/layer.ts +++ b/src/rpc/layer.ts @@ -1,3 +1,4 @@ +import { RpcSessionFactory } from "@t3tools/client-runtime/rpc"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; @@ -6,18 +7,11 @@ import * as Option from "effect/Option"; import * as Schedule from "effect/Schedule"; import * as Scope from "effect/Scope"; import * as SynchronizedRef from "effect/SynchronizedRef"; -import { HttpClientRequest } from "effect/unstable/http"; -import { RpcClient, RpcSerialization } from "effect/unstable/rpc"; -import * as Socket from "effect/unstable/socket/Socket"; -import { T3AuthTransport } from "../auth/transport.ts"; -import { T3CodeConnectionProvider } from "../connection/service.ts"; -import { normalizeHttpBaseUrl, toWebSocketEndpointUrl } from "../config/url.ts"; -import { CliWsRpcGroup } from "./ws-group.ts"; +import { T3PreparedConnectionProvider } from "../connection/prepared.ts"; import { RpcError } from "./error.ts"; import { T3Rpc, type WsClient } from "./service.ts"; -const makeClient = RpcClient.make(CliWsRpcGroup); const connectionRetrySchedule = Schedule.exponential("100 millis").pipe(Schedule.take(4)); type Connection = { @@ -26,23 +20,19 @@ type Connection = { }; export const makeT3RpcLayer = Effect.fn("makeT3RpcLayer")(function* () { - const connectionProvider = yield* T3CodeConnectionProvider; - const authTransport = yield* T3AuthTransport; - const webSocketConstructor = yield* Socket.WebSocketConstructor; + const preparedConnectionProvider = yield* T3PreparedConnectionProvider; + const sessions = yield* RpcSessionFactory; const parentScope = yield* Scope.Scope; const connection = yield* SynchronizedRef.make(Option.none()); const openConnection = Effect.fn("T3RpcLive.openConnection")(function* () { const scope = yield* Scope.fork(parentScope); return yield* Effect.gen(function* () { - const url = yield* makeWsUrl({ authTransport, connectionProvider }); - const protocol = yield* Layer.buildWithScope( - makeProtocolLayer(url, webSocketConstructor), - scope, - ); - const client = yield* makeClient.pipe( - Effect.provide(protocol), - Effect.provideService(Scope.Scope, scope), - ); + const prepared = yield* preparedConnectionProvider.get; + const session = yield* sessions + .connect(prepared) + .pipe(Effect.provideService(Scope.Scope, scope)); + yield* session.ready; + const client: WsClient = session.client; return { scope, client } satisfies Connection; }).pipe( Effect.retry(connectionRetrySchedule), @@ -74,36 +64,6 @@ export const makeT3RpcLayer = Effect.fn("makeT3RpcLayer")(function* () { }; }); -const makeWsUrl = Effect.fn("makeWsUrl")(function* (input: { - readonly authTransport: T3AuthTransport["Service"]; - readonly connectionProvider: T3CodeConnectionProvider["Service"]; -}) { - const connection = yield* input.connectionProvider.get; - const origin = yield* normalizeHttpBaseUrl(connection.origin.url); - const wsTicket = yield* input.authTransport.issueWebSocketTicket({ - url: origin, - token: connection.auth.token, - }); - const wsUrl = yield* toWebSocketEndpointUrl(origin, "/ws"); - const request = HttpClientRequest.get(wsUrl).pipe( - HttpClientRequest.setUrlParam("wsTicket", wsTicket.ticket), - ); - return Option.getOrThrow(HttpClientRequest.toUrl(request)).toString(); -}); - -function makeProtocolLayer( - url: string, - webSocketConstructor: Socket.WebSocketConstructor["Service"], -) { - const socketLayer = Socket.layerWebSocket(url).pipe( - Layer.provide(Layer.succeed(Socket.WebSocketConstructor, webSocketConstructor)), - ); - return RpcClient.layerProtocolSocket({ retryTransientErrors: true }).pipe( - Layer.provide(socketLayer), - Layer.provide(RpcSerialization.layerJson), - ); -} - export const T3RpcLive = Layer.effectContext( makeT3RpcLayer().pipe(Effect.map((rpc) => Context.make(T3Rpc, rpc))), ); diff --git a/src/runtime/layer.ts b/src/runtime/layer.ts index 33ace43..b356cf3 100644 --- a/src/runtime/layer.ts +++ b/src/runtime/layer.ts @@ -1,3 +1,4 @@ +import { rpcSessionFactoryLayer } from "@t3tools/client-runtime/rpc"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient"; @@ -13,6 +14,7 @@ import { T3AuthTransportLive } from "../auth/transport.ts"; import { T3ConfigLive } from "../config/layer.ts"; import { T3Config } from "../config/service.ts"; import { T3CodeConnectionError } from "../connection/error.ts"; +import { T3PreparedConnectionProviderLive } from "../connection/prepared.ts"; import { T3CodeConnectionProvider, makeT3CodeConnectionProvider } from "../connection/service.ts"; import { T3OrchestrationLive } from "../orchestration/layer.ts"; import { T3RpcLive } from "../rpc/layer.ts"; @@ -61,9 +63,10 @@ const T3ConfigConnectionProviderLayer = Layer.effect( const T3RpcLayer = T3RpcLive.pipe( Layer.provide( Layer.mergeAll( - T3ConfigConnectionProviderLayer, - T3AuthTransportLayer, - NodeSocket.layerWebSocketConstructor, + T3PreparedConnectionProviderLive.pipe( + Layer.provide(Layer.mergeAll(T3ConfigConnectionProviderLayer, NodeHttpClient.layerUndici)), + ), + rpcSessionFactoryLayer.pipe(Layer.provide(NodeSocket.layerWebSocketConstructor)), ), ), ); diff --git a/upstream-t3code b/upstream-t3code index 3ea6adf..e95b57d 160000 --- a/upstream-t3code +++ b/upstream-t3code @@ -1 +1 @@ -Subproject commit 3ea6adf17d5528d9c90ed53b6dead650d5931941 +Subproject commit e95b57dc268471c882f734546fdcd92e9a833e45 From 051543160fbae4410870302eed16c281cc8cf0d6 Mon Sep 17 00:00:00 2001 From: Tarik02 Date: Tue, 28 Jul 2026 10:03:30 +0300 Subject: [PATCH 2/5] update t3code submodule and handle synchronization markers --- src/application/thread-wait.ts | 4 ++++ src/orchestration/layer.ts | 3 ++- upstream-t3code | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/application/thread-wait.ts b/src/application/thread-wait.ts index 50a6182..13e66ec 100644 --- a/src/application/thread-wait.ts +++ b/src/application/thread-wait.ts @@ -42,6 +42,10 @@ export function watchThread(input: { readonly threadId: string }) { return Stream.fromIterable(events); } + if (item.kind === "synchronized") { + return Stream.empty; + } + if (current === undefined || currentMessages === undefined) { return Stream.fail( new ThreadSessionError({ diff --git a/src/orchestration/layer.ts b/src/orchestration/layer.ts index 0840ac9..9816249 100644 --- a/src/orchestration/layer.ts +++ b/src/orchestration/layer.ts @@ -25,7 +25,8 @@ export const makeT3Orchestration = Effect.fn("makeT3Orchestration")(function* () client[ORCHESTRATION_WS_METHODS.subscribeShell]({}), ) .pipe( - Stream.map((item: OrchestrationShellStreamItem) => + Stream.filter((item: OrchestrationShellStreamItem) => item.kind !== "synchronized"), + Stream.map((item) => item.kind === "snapshot" ? item.snapshot.snapshotSequence : item.sequence, ), ); diff --git a/upstream-t3code b/upstream-t3code index fda6486..8b8da91 160000 --- a/upstream-t3code +++ b/upstream-t3code @@ -1 +1 @@ -Subproject commit fda6486233e0b2f07ecfea166e1a94533cb923c4 +Subproject commit 8b8da9193c710ffdbb156f57fc0ec24d06479eff From d3f06e3db14c38c8b3c9c53c735e5cddbb22441a Mon Sep 17 00:00:00 2001 From: Tarik02 Date: Tue, 28 Jul 2026 10:15:53 +0300 Subject: [PATCH 3/5] update pnpm dependencies --- package.json | 10 +- pnpm-lock.yaml | 1543 ++++++++++++++++++++++++++++--------------- pnpm-workspace.yaml | 12 +- 3 files changed, 1036 insertions(+), 529 deletions(-) diff --git a/package.json b/package.json index 9596ba4..a4bb9c2 100644 --- a/package.json +++ b/package.json @@ -111,19 +111,19 @@ "effect": "4.0.0-beta.78", "marked": "^15.0.12", "marked-terminal": "^7.3.0", - "string-width": "^8.2.1", + "string-width": "^8.2.2", "wrap-ansi": "^10.0.0" }, "devDependencies": { - "@changesets/cli": "^2.31.0", + "@changesets/cli": "^2.31.1", "@effect/vitest": "catalog:", "@t3tools/client-runtime": "workspace:*", "@t3tools/contracts": "workspace:*", "@t3tools/shared": "workspace:*", "@total-typescript/shoehorn": "^0.1.2", - "@types/node": "^25.9.1", - "typescript": "^6.0.3", - "vite-plus": "^0.1.24" + "@types/node": "^26.1.2", + "typescript": "^7.0.2", + "vite-plus": "^0.2.6" }, "engines": { "node": ">=24.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5e8b5e..8127a1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,23 +13,23 @@ catalogs: specifier: 4.0.0-beta.78 version: 4.0.0-beta.78 '@noble/curves': - specifier: 1.9.1 - version: 1.9.1 + specifier: 2.2.0 + version: 2.2.0 '@noble/hashes': - specifier: 1.8.0 - version: 1.8.0 + specifier: 2.2.0 + version: 2.2.0 '@types/node': - specifier: ^25.9.1 - version: 25.9.1 + specifier: ^26.1.2 + version: 26.1.2 effect: specifier: 4.0.0-beta.78 version: 4.0.0-beta.78 jose: - specifier: 6.2.2 - version: 6.2.2 + specifier: 6.2.4 + version: 6.2.4 vite-plus: - specifier: 0.1.24 - version: 0.1.24 + specifier: 0.2.6 + version: 0.2.6 yaml: specifier: ^2.9.0 version: 2.9.0 @@ -59,18 +59,18 @@ importers: specifier: ^7.3.0 version: 7.3.0(marked@15.0.12) string-width: - specifier: ^8.2.1 - version: 8.2.1 + specifier: ^8.2.2 + version: 8.2.2 wrap-ansi: specifier: ^10.0.0 version: 10.0.0 devDependencies: '@changesets/cli': - specifier: ^2.31.0 - version: 2.31.0(@types/node@25.9.1) + specifier: ^2.31.1 + version: 2.31.1(@types/node@26.1.2) '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10) '@t3tools/client-runtime': specifier: workspace:* version: link:upstream-t3code/packages/client-runtime @@ -84,14 +84,14 @@ importers: specifier: ^0.1.2 version: 0.1.2 '@types/node': - specifier: ^25.9.1 - version: 25.9.1 + specifier: ^26.1.2 + version: 26.1.2 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vite-plus: - specifier: ^0.1.24 - version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + specifier: ^0.2.6 + version: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) upstream-t3code/packages/client-runtime: dependencies: @@ -107,10 +107,10 @@ importers: devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10) vite-plus: specifier: 'catalog:' - version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + version: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) upstream-t3code/packages/contracts: dependencies: @@ -120,19 +120,19 @@ importers: devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10) vite-plus: specifier: 'catalog:' - version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + version: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) upstream-t3code/packages/shared: dependencies: '@noble/curves': specifier: 'catalog:' - version: 1.9.1 + version: 2.2.0 '@noble/hashes': specifier: 'catalog:' - version: 1.8.0 + version: 2.2.0 '@t3tools/contracts': specifier: workspace:* version: link:../contracts @@ -141,7 +141,7 @@ importers: version: 4.0.0-beta.78 jose: specifier: 'catalog:' - version: 6.2.2 + version: 6.2.4 yaml: specifier: 'catalog:' version: 2.9.0 @@ -151,20 +151,31 @@ importers: version: 4.0.0-beta.78(effect@4.0.0-beta.78)(ioredis@5.10.1) '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))) + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10) '@types/node': specifier: 'catalog:' - version: 25.9.1 + version: 26.1.2 vite-plus: specifier: 'catalog:' - version: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + version: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} + '@blazediff/core@1.9.1': + resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -174,8 +185,8 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.31.0': - resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} + '@changesets/cli@2.31.1': + resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} hasBin: true '@changesets/config@3.1.4': @@ -390,13 +401,13 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} - engines: {node: ^14.21.3 || >=16} + '@noble/curves@2.2.0': + resolution: {integrity: sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==} + engines: {node: '>= 20.19.0'} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + engines: {node: '>= 20.19.0'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -410,292 +421,292 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/runtime@0.133.0': - resolution: {integrity: sha512-PkvjA1Lq5++V5S1E6Patr92ZVcieE6EalDr1VJTqv4BnjZdOUC4W3p8k1wMXSd5/2aFP4b/A6N5sg2Bkzcr9vQ==} + '@oxc-project/runtime@0.141.0': + resolution: {integrity: sha512-Z/6jQ0dyvE2fVjMUO7GoD4h+3q0G4lI4BWQNjaPhC4RPxaS4hF1b7/QYKB/Tl+KAQwqqKgMF54ukR/VvV5FILg==} engines: {node: ^20.19.0 || >=22.12.0} '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.141.0': + resolution: {integrity: sha512-S4as7z0j0xQkXcJlyY5ehntwK8/wRkQb9Cyqw+J/N2rkWGQGK0SxD6X6DhQTc7qsxVTBxXbxZtBJh3mr3PtIzQ==} - '@oxfmt/binding-android-arm-eabi@0.52.0': - resolution: {integrity: sha512-17EMSJnQ9g+upVHrAUYDMfH5lvRKQ9Nvg8WtEoH72oDr1VpWz+7/o3tD97U1EToen2YAQ/68JmtDYkQUi20dfQ==} + '@oxfmt/binding-android-arm-eabi@0.60.0': + resolution: {integrity: sha512-1q4q4Jc8FlOMVojEisyFAVyl8h1yawNv6phjgmhGVEDeyeOdsSnSr9x0+D4mOnEKvpO5L4mxKZ/DP9X6U3A/Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.52.0': - resolution: {integrity: sha512-A2G1IdwGEW2lLJkIxcvuirRH1CzSl/e0NX11zTlW1gvxJThfwbI/BEoaKrTNpm7M2FchvIf6guvIQU7d5iz+OQ==} + '@oxfmt/binding-android-arm64@0.60.0': + resolution: {integrity: sha512-tD41I6nCt9k8SQXft0CSjjU9jg6SwG7uMu7PxodSEHXl+GDW0868oy6tTtoJkyUze8YKFgTpz/k5LuPUnFiGLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.52.0': - resolution: {integrity: sha512-f9+bLvOYxy7NttCLFTvQ7afmqDOWY4wIP9xdvfj5trQ1qj6f2UFAGwZESlfsMjvJNTyRpXfIlOanCI9FOvoeQA==} + '@oxfmt/binding-darwin-arm64@0.60.0': + resolution: {integrity: sha512-TTpzPug96Zxdyb46KvTyIUQDdsqbumXh2TKG9C23PCT0kF7JkW56Z/quPuG9rqOFKQIi1gpRNZ7DX18LwxXPnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.52.0': - resolution: {integrity: sha512-YSTB9sJ5nnQd/Q0ddHkgof0ZCHPAnWZT1IW2SJ8omz7CP7KluJhO1fNHrpqdxCtpztJwSs4hY1uAee35wKxxaw==} + '@oxfmt/binding-darwin-x64@0.60.0': + resolution: {integrity: sha512-CnOoWgQ7L+JL/YQaRJ+NyATciSfcftncm7y3kqyte1cGtFEGnStaCd1TAyrinkfQ7nRBfHrTs1/vTwUJr3WF2Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.52.0': - resolution: {integrity: sha512-NIrRNTTPCs4UbmVs0bxLSCDlLCtIRMJIXklNKaXa5Oj2/K1UIMBvgE8+uPVo01Io3N9HF0+GAX+aAHjUgZS7vA==} + '@oxfmt/binding-freebsd-x64@0.60.0': + resolution: {integrity: sha512-ychJo7S3hZxdO6eDZ9zM6F2lM9fpJS3EKS5CAUSWyprdLYxTu4gbaUKV/VBPTcMJwQa2Bpo+643y3OJ537pihA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.52.0': - resolution: {integrity: sha512-JXUCde8mn3GpgQouz2PXUokgy/uT1QrRJBL2s983VWcSQp62wTFYiNXgTKdeo1Jgbr0IgUnKKvzIk/YBlj/nVQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': + resolution: {integrity: sha512-36IH5o55T2Fx7E0feDttt+mifxN6yk9pWv4KfhAIsP0dFnUq27331OwbpOsZdoXF9soOLWm7mQUz5+UUmyec4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.52.0': - resolution: {integrity: sha512-psbUXaRZ+V8DaXz10Qf7LSHtdtdKAmC8fxXgeU608jjzrmWK4quamZMOpl6sf+dikoFHA85uE93Q0BqxrCdQrQ==} + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': + resolution: {integrity: sha512-G1Ve7lAa6sFBolVI2LWHfEAqy0YKh4vnioH8uYO9kAEdgM7mR40IksIx9/Zk4+vbYew/sGa4J9Q4tZ3n9gXDHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.52.0': - resolution: {integrity: sha512-Jw7MgWUU9lcLCcy82updISP3EthTlfvAwR6gWNxPzqly7+fLvOi2gHQE9xXQjpqaVLm/8P+gOzlv9ODuoVlaaw==} + '@oxfmt/binding-linux-arm64-gnu@0.60.0': + resolution: {integrity: sha512-LTQdRBf6uzj/h7Xk6lKzbGD2hrF/fK4YI9LIN1c0509tPUn8wRa3mCmrFQpEWJPLYGFrLFFMTYW1Ljj6VqW2Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.52.0': - resolution: {integrity: sha512-wZg6bLjDvh2KibyI3QFUYo8GTXneIFsd0JvehtvJiUmQ8WRPERgxd/VM4ctWb86U5FT1FkqgS8/wZKVB+AZScg==} + '@oxfmt/binding-linux-arm64-musl@0.60.0': + resolution: {integrity: sha512-2JMo3XPxMPx3hiqddSZYyaH+fKJm6cz0u8n1naYjP/CdOQOZW34i8lKBUfmbWiuFvd6KoYXLmhAyBuvojsYS7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.52.0': - resolution: {integrity: sha512-IngE8uxhNvxcMrLjZNDo9xNLY7rEK33AKnaMd2B46he1e/mz2CfcW6If/U1wUjdRZddm1QzQaciqZkuMkdh1FA==} + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': + resolution: {integrity: sha512-L3C+nBD13lr306tr/PjM3RMll+BVqgFrIgUyoeHuai5oueJrRLgO3j+GO5/Cbhtkf5PSlHYTI1JY7iqBd1qa6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.52.0': - resolution: {integrity: sha512-H3+DdFMv/efN3Efmhsv18jDrpiWWqKG7wsfAlQBqAt6z/E2Bx+TwEj2Nowe51CPOWB8/mFBC2dAMSgVFLvvowA==} + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': + resolution: {integrity: sha512-M4MsmvqlxFiPtSRGyBYQSZxchEf463AOyd+Dh4/9xDpjWBsRtDUTDMFN5EdHinjVK1/eDJQ8MLpcYjpYayaCnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.52.0': - resolution: {integrity: sha512-zji+1kb7lJKohSDjzC1IsS+K/cKRs1hdVf0ZH0VbdbiakmtLvN9twBoXo/k8VdjFax7kfo+DyPxS7vv52br1aw==} + '@oxfmt/binding-linux-riscv64-musl@0.60.0': + resolution: {integrity: sha512-OH+9UskYuxRB+GxqdGkVN8f5UpwhqG8YscNo1wl8+KJ62cd7wZdGga6iGLJIf8kibF1WBwvlfDUx3cez/VXwFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.52.0': - resolution: {integrity: sha512-hcLBYedpCy7ToUvvBidWk7+11Yhg1oAZ4+6hKPic/mQI6NaqXJSXMps5nFlwUuX2ewhtLZZDPg63TI042qGKBg==} + '@oxfmt/binding-linux-s390x-gnu@0.60.0': + resolution: {integrity: sha512-y7AAFutt9wFWBFOAn6+BHaV39usZmcr3YYH2385f+NHgPNpIF9HpqKp0jgUxPaUOCyG3oaX5VhJduL1Nw164rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.52.0': - resolution: {integrity: sha512-IDO2loXK2OtTOhSPchU9MW25mWL2QCDGdJbjN8MXKZVS80qXe5gMTwQWu/gMJ3juoBHbkuUZNB2N1LHzNT7DoA==} + '@oxfmt/binding-linux-x64-gnu@0.60.0': + resolution: {integrity: sha512-yKZ9+CXAI+1RO5nH/4Z/9M6DAsfOzd5bw/gtWk81KB4mpalMaRRSXfouc5/tHxazDmBek55HNPepNYBgaCew0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.52.0': - resolution: {integrity: sha512-mAV2Hjn0SatJ+KoAzKUC3eJhdJ8wv+3m1KyuS0dTsbF0c5weq+QrCt/DRZZM+uj/XiKzCDEUKYsBF30e2qkcyw==} + '@oxfmt/binding-linux-x64-musl@0.60.0': + resolution: {integrity: sha512-bCUGaF6hJOYnQzLJdHLZbvGsOd5oSvGAyJhPAKum2uyLYUuXmP8vqg690DWi2hqcnIoYpqSqCrjzE5aiUAgwQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.52.0': - resolution: {integrity: sha512-vd4npaUIwChxp7XzkqmepBWTT9YMcSe/NBApVGPC30/lLyOVaV3dvma1SKo03t8O73BPRAG7EyJzGlN5cJM5hQ==} + '@oxfmt/binding-openharmony-arm64@0.60.0': + resolution: {integrity: sha512-GrUeZOvzP30ExxfCuQiyofuUGI+OmvAgFwOO5w5p9mGPlxcyuqI+6Sy9fAKFFfLQrqKYWFgc5sYA2Unj/29nPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.52.0': - resolution: {integrity: sha512-k2sz6gWQdMfh5HPpIS+Bw/0UEV/kaK2xuqJRrWL233sEHx9WLlsmvlPFM4HUNThkYbSN0U0vPW7LVKZWDS8hPQ==} + '@oxfmt/binding-win32-arm64-msvc@0.60.0': + resolution: {integrity: sha512-WD4Q954kUl2TDJV/6q7UnE2rlKk047kXLJsr4bJ2mXRaAqNXcmV3nwKUsGCc3mz/jYDBnXtJEaBErJEybK8iQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.52.0': - resolution: {integrity: sha512-rhke69GTcArodLHpjMTfNnvjTEBryDeZcUCKK/VjXDMtfTULl6QRh0ymX5/hbCUv2WjYm9h/QbW++q2vE15gWQ==} + '@oxfmt/binding-win32-ia32-msvc@0.60.0': + resolution: {integrity: sha512-HqDekjr8JXzVDUP1YthDZ1Y3CBEcuZT4WX3B+1kaxj8CvZA8Y2YhcEsXqoSop3tVsgjACxjnFQFDkBo0r/jq1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.52.0': - resolution: {integrity: sha512-q5xL7oeXkZdEtNZWBdvehJcmt+GRu9l2bK40yJs1jJXlqq+r0Hygb1rTjq+FM2o/2xyt4cufH6KRplHp3Jjsvw==} + '@oxfmt/binding-win32-x64-msvc@0.60.0': + resolution: {integrity: sha512-tz78yhmGPKboTMHCHSaUqXK8JrmoSejgDcWeqAtg2s07ZGKQ3rH5Jn8NuXPGNG33CDbY2e9NoQWXIVEmKO21Rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.23.0': - resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} + '@oxlint-tsgolint/darwin-arm64@7.0.2001': + resolution: {integrity: sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.23.0': - resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} + '@oxlint-tsgolint/darwin-x64@7.0.2001': + resolution: {integrity: sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.23.0': - resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} + '@oxlint-tsgolint/linux-arm64@7.0.2001': + resolution: {integrity: sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.23.0': - resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} + '@oxlint-tsgolint/linux-x64@7.0.2001': + resolution: {integrity: sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.23.0': - resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} + '@oxlint-tsgolint/win32-arm64@7.0.2001': + resolution: {integrity: sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.23.0': - resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} + '@oxlint-tsgolint/win32-x64@7.0.2001': + resolution: {integrity: sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.67.0': - resolution: {integrity: sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw==} + '@oxlint/binding-android-arm-eabi@1.75.0': + resolution: {integrity: sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.67.0': - resolution: {integrity: sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ==} + '@oxlint/binding-android-arm64@1.75.0': + resolution: {integrity: sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.67.0': - resolution: {integrity: sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg==} + '@oxlint/binding-darwin-arm64@1.75.0': + resolution: {integrity: sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.67.0': - resolution: {integrity: sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg==} + '@oxlint/binding-darwin-x64@1.75.0': + resolution: {integrity: sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.67.0': - resolution: {integrity: sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg==} + '@oxlint/binding-freebsd-x64@1.75.0': + resolution: {integrity: sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.67.0': - resolution: {integrity: sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g==} + '@oxlint/binding-linux-arm-gnueabihf@1.75.0': + resolution: {integrity: sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.67.0': - resolution: {integrity: sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw==} + '@oxlint/binding-linux-arm-musleabihf@1.75.0': + resolution: {integrity: sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.67.0': - resolution: {integrity: sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg==} + '@oxlint/binding-linux-arm64-gnu@1.75.0': + resolution: {integrity: sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.67.0': - resolution: {integrity: sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w==} + '@oxlint/binding-linux-arm64-musl@1.75.0': + resolution: {integrity: sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.67.0': - resolution: {integrity: sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug==} + '@oxlint/binding-linux-ppc64-gnu@1.75.0': + resolution: {integrity: sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.67.0': - resolution: {integrity: sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ==} + '@oxlint/binding-linux-riscv64-gnu@1.75.0': + resolution: {integrity: sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.67.0': - resolution: {integrity: sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA==} + '@oxlint/binding-linux-riscv64-musl@1.75.0': + resolution: {integrity: sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.67.0': - resolution: {integrity: sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q==} + '@oxlint/binding-linux-s390x-gnu@1.75.0': + resolution: {integrity: sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.67.0': - resolution: {integrity: sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA==} + '@oxlint/binding-linux-x64-gnu@1.75.0': + resolution: {integrity: sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.67.0': - resolution: {integrity: sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg==} + '@oxlint/binding-linux-x64-musl@1.75.0': + resolution: {integrity: sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.67.0': - resolution: {integrity: sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g==} + '@oxlint/binding-openharmony-arm64@1.75.0': + resolution: {integrity: sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.67.0': - resolution: {integrity: sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA==} + '@oxlint/binding-win32-arm64-msvc@1.75.0': + resolution: {integrity: sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.67.0': - resolution: {integrity: sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg==} + '@oxlint/binding-win32-ia32-msvc@1.75.0': + resolution: {integrity: sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.67.0': - resolution: {integrity: sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ==} + '@oxlint/binding-win32-x64-msvc@1.75.0': + resolution: {integrity: sha512-DSxnNkBUAYARPwJtR12Ig3deWr8w0H997xP6jy33i+e0SyYJw8FKuz4+cZtpmPEhQmvlPJE3X/2vNxDmLkd/rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/plugins@1.61.0': - resolution: {integrity: sha512-nkOyZEF1vH527CkdQtOp1HMrVFEM4ResURvI2JFeGoup+h+43J/k/FgdOR9b9Isxg+Yae7qVDa7y3nssE8b3TQ==} + '@oxlint/plugins@1.73.0': + resolution: {integrity: sha512-OhgMQeMmZA0dcFcX4/priaJZWdFECxiClgq6mRX6aatZEcV9PbKC3P3/v8U1hVjviT1i5U+vR8lAtBV6m4FXAA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@polka/url@1.0.0-next.29': @@ -806,12 +817,25 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@total-typescript/shoehorn@0.1.2': resolution: {integrity: sha512-p7nNZbOZIofpDNyP0u1BctFbjxD44Qc+oO5jufgQdFdGIXJLc33QRloJpq7k5T59CTgLWfQSUxsuqLcmeurYRw==} '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -824,50 +848,178 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@vitest/expect@4.1.0': - resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] - '@vitest/mocker@4.1.0': - resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@vitest/browser-preview@4.1.10': + resolution: {integrity: sha512-14MJrL59ZFkqXLjwfSk6RzTDy5Czf9UG4+8q8L6Gxjs2aPjEce/cVNYV14bXAc2BvMjUNu904+ZEZA1Xc1wtvQ==} + peerDependencies: + vitest: 4.1.10 + + '@vitest/browser@4.1.10': + resolution: {integrity: sha512-UDwuWGwXj646CBx/bQHOaJSX7np0I8JL/UKQYa1e4QrVHH8VdWtx8eaOuf8sy0ShwDgR6NjJAsp5eF6vjF6qng==} + peerDependencies: + vitest: 4.1.10 + + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.0': - resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.0': - resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.0': - resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.0': - resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/utils@4.1.0': - resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} - '@voidzero-dev/vite-plus-core@0.1.24': - resolution: {integrity: sha512-iXPGBABnQnrDMx89H6MOCGcTZp+QW+3rY4YMVKdE6ydchSvPk2O3MI2vgaRVfOtWJ2IjnxSnf1n2yjP67ZBRFQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-core@0.2.6': + resolution: {integrity: sha512-vqDuuLJWS2JHWkFO7r8Z6AehtKnurpnYtw2XEQtjIfwE2GgSAO3zJdPIeaEZiovS6CqfQa+iOMn3kzVzeTSpTw==} + engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.22.1 - '@tsdown/exe': 0.22.1 '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -878,17 +1030,13 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - typescript: ^5.0.0 || ^6.0.0 + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 unplugin-unused: ^0.5.0 unrun: '*' yaml: ^2.4.2 peerDependenciesMeta: '@arethetypeswrong/core': optional: true - '@tsdown/css': - optional: true - '@tsdown/exe': - optional: true '@types/node': optional: true '@vitejs/devtools': @@ -922,89 +1070,183 @@ packages: yaml: optional: true - '@voidzero-dev/vite-plus-darwin-arm64@0.1.24': - resolution: {integrity: sha512-Hpo9W9piSFlEsJzGkwzfDXhJGrnYByxHXF7NVQZ7g+SLOprddtlfTeM8t+gq9dxcuq0RzM8ddMAhDQP/K3fZQA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-darwin-arm64@0.2.6': + resolution: {integrity: sha512-QSZWgfqPx5lrIKZ0vwgVRujRqo7gORcc9Oq4fI1UDjKZFgYz9gXVMibSjEqYU3R1webN6FKTOCnzFmrfXchWYw==} + engines: {node: '>=20.0.0'} cpu: [arm64] os: [darwin] - '@voidzero-dev/vite-plus-darwin-x64@0.1.24': - resolution: {integrity: sha512-SwnnnZrEFBiU5iKlh/CZAVwn0RFt/Udrvt3kFLtdRxMtN5bKaqTFVA2H8Y/FPCWp1QX9bs4V9ZIAeXAk06zLkw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-darwin-x64@0.2.6': + resolution: {integrity: sha512-pMQZGCQO0s+akuxbjgh31hOUgrdDndCmfbP7BciJuts436qrBb8KaVzBhNjJQtxD6H8yY21CIOjD8nlrp4eDIw==} + engines: {node: '>=20.0.0'} cpu: [x64] os: [darwin] - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.24': - resolution: {integrity: sha512-ImM3eqDki4DpRuHjW6dEh4St8zvbcfOMR7KQZJX42ArriCLQ/QdaYhDRRbcDi27XsOBqRxm2eqUUEymPrYIHpA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.6': + resolution: {integrity: sha512-0e6nrJgUDN5WwoDRjyh7KV/jbL7WDUhTEWslI64KGpuvD7M6OoPBXYo8Et176O2ENwf52CKVDjXwuvMMNIAzAA==} + engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.24': - resolution: {integrity: sha512-gj4mzbob/ls8Zs7iTuF9Gr0EFFF7tdpDiPxDPBkH8tJP5OkHABlzWUwJhU+9xxcUbTaXqpHDw68Mil7jm5dpMg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.6': + resolution: {integrity: sha512-j2yvyv3r2ZEuJG73rWlXFrYrxA7u5+bFSlWTqhsfHZhdb1FKMkklfYRuLtBBdBRLXJ+YMNt9GZT6VTVPJDZnnQ==} + engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.24': - resolution: {integrity: sha512-x7IYK7lI+WuF1n3jSzEYU6FgJxPX/R0rDmTTsOutooGGCU7uShZvfZqIoiTXK0eFnJU5ij5BfBgenenUfsaT/A==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.6': + resolution: {integrity: sha512-5vqldBBnRjIAUmQ88oKli+wPd5vSQaA2AZ2xs+omRlZfeJhC8chlud6DyJV6fVZCC9GI4otK2zSGpfQZx8Kc3A==} + engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-x64-musl@0.1.24': - resolution: {integrity: sha512-JCy2w0eSVUlWQlggK5T47MnL+j0o4EY7hLskINVI8gi+aixQF4xnYBDobz0lbxkqz3/IfiLyXUx6TcU3thcsGQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-linux-x64-musl@0.2.6': + resolution: {integrity: sha512-29ned+euDKAl+BmCigzGrPykQ/kxTjtsPGV6G3hkImwakHNUnmLRayqmsWKHSwXmBk5xo5m+wqjMbo3G0npJQg==} + engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-test@0.1.24': - resolution: {integrity: sha512-9NiG6UadG0iOaPL1AMsO5sDKkx6MADHw4/mMOmHWZUhhUwqzfVtnnptMK37vD71e6KyR7yAscx19FrtOWWtjvA==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/coverage-istanbul': 4.1.8 - '@vitest/coverage-v8': 4.1.8 - '@vitest/ui': 4.1.8 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.6': + resolution: {integrity: sha512-4b5ASpQlkxSXDYzuM6MYsOc1GnYkqG9CbSA1QzobXm87V/Q+MGPn57eILyacgfbmNNLrO2HQ5hasoLvd2BXaSg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [win32] - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.24': - resolution: {integrity: sha512-G+/lhLKVjyn3FmgXX8jeWgq7RcE5O1kdR7QyFayQOdlMX/ZRkvUwQD7bFaqhKzgJM6Oj3a1FH3HQPYk5QOYuCQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@voidzero-dev/vite-plus-win32-x64-msvc@0.2.6': + resolution: {integrity: sha512-rvGkm4WmVkCKPhvUbLkRtlVhi7EYb8GU8KaqIGJ0dVfNQHDEqnFboaiUHuPN1npFNwB+80Ulzz9AkQ/Q8MswQA==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@yuku-codegen/binding-darwin-arm64@0.5.48': + resolution: {integrity: sha512-yo96Oef12WzqnphInfz/eexVse3+kWgfGS5g2S3rFS3dcGn1ENW9xLFDZUP9rh+yP76DOq38wBoFi1+I9+6qBg==} + cpu: [arm64] + os: [darwin] + + '@yuku-codegen/binding-darwin-x64@0.5.48': + resolution: {integrity: sha512-aRCTw0EZC4bVosmw//0OMYP5tGWFE0Cu5yUBFkUbhXx/iBzvORcJ2xPNlOp/vtCCo9Ys4vp8b0DigJV6uOVb2g==} + cpu: [x64] + os: [darwin] + + '@yuku-codegen/binding-freebsd-x64@0.5.48': + resolution: {integrity: sha512-CA0AQAEApDkbw51PdLWMtKPJ41/7rvXsS3SJs+phG7fHJI+MuFzWuLbkucZfZoEOiDscmcsfYIdgL8BsfuyKKQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-codegen/binding-linux-arm-gnu@0.5.48': + resolution: {integrity: sha512-DuSQlk8bH4gpmW3/00P0NLagAcMv8jOxjT40cQmxKRkktr+SUOALCfkT89tdDq3qtY95NR2GXOZ7AjNh7KKqCw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm-musl@0.5.48': + resolution: {integrity: sha512-bxj4Ee+wlaJcWJwft2ReJXWw5sfl1qavDz6+dlRdU1xfTEtjPSNiAWhiCHnJR0R4Ygd57DnzSQmAVGvFv6RcGw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-arm64-gnu@0.5.48': + resolution: {integrity: sha512-mk5JVWh+0JOe5ue8k17kbYX8uGBoKt3ZqoCyxNh4nYAAcX7+X1tFUiU7jbjctu4vHeejCBFSTdQ021+V31cUCQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm64-musl@0.5.48': + resolution: {integrity: sha512-4q3vkrNghbllyxOm2KesFLxCPKHF7r3JyQ7BWZccY1j2Y05yKoIFhoWCqIuQ2W/dpte9RI0+OVfwyxnrKg6fkA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-x64-gnu@0.5.48': + resolution: {integrity: sha512-csd4M1EVrGaohM8acM6gq1zpUA/Rwe2ulUMBKUcwQXm/k6n7cq1A++qdew78SOVb4do3JH1WE+WFwoGQAcWc1w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-x64-musl@0.5.48': + resolution: {integrity: sha512-KcDuEOT+GFoVKdvAWOv1v9iYjwnmvMZlO+j1Rw+5PYdeFLGWGzv/DD11y4SAAdwXIFcil4T0hibeIaF82WStMg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-win32-arm64@0.5.48': + resolution: {integrity: sha512-HI8qNrI8dWM5BuqIMKsqornRvTNFrE6sm5zToIJ9YIa9zt5+29P7fJ7Nr39EVf6dAWSb6q7JSpScJnRsQ+FgZA==} cpu: [arm64] os: [win32] - '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.24': - resolution: {integrity: sha512-b0e5XohEV1w/RdzAtv8/Hm6tvHPXouPtBNsljjW/lDJZq3NCLND5s6lqe8H4IenrgmKSoqakHWtlqJqM36cFbw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@yuku-codegen/binding-win32-x64@0.5.48': + resolution: {integrity: sha512-X5YWJLO6EfBZpeBqO0AYESnUizbpFDWArcvVD61w0PEWQ3CaFRLnbQXs+kpM4ZZfGMfIE22zfA08QSY67q7TNQ==} cpu: [x64] os: [win32] + '@yuku-parser/binding-darwin-arm64@0.5.48': + resolution: {integrity: sha512-If8mb7HH3vqghJ2NNZ8SuHfhsnjVzOxJpB8xcNOXS5WjYrs2mUhHIh5KOIvK13hDOzh0htGeGK3A6MsiEqE7HQ==} + cpu: [arm64] + os: [darwin] + + '@yuku-parser/binding-darwin-x64@0.5.48': + resolution: {integrity: sha512-EimvPXfspzxf1K11eB6tCW5oiQEXB8g84T2wP1TwzQagdDKo33bkmmVF0B32vTIpXnk/Ifu5IB61izZ1MylljA==} + cpu: [x64] + os: [darwin] + + '@yuku-parser/binding-freebsd-x64@0.5.48': + resolution: {integrity: sha512-0GcUMrumLHheThY9r5Tp46gaZYzn0irWPS1Zba6WY+vVQfhUtzGiWgXxI6tuXX0N32kEaaEVRpkKctvo6Kx3aQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-parser/binding-linux-arm-gnu@0.5.48': + resolution: {integrity: sha512-8S5T5wjCC73dmmpQeZ49aYsSunIUM3D4Fc6rdK96c+Ayg/p3FmeSPF3xuLZHejcTmqJIIvnbfPlUF+rB6DITjQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm-musl@0.5.48': + resolution: {integrity: sha512-tTmbxvnUHcK2/crS9547vk2SMmsajH1yqJ8ltXhIuHJgqR1v+d9n9KT+kSayo/5CS76LegeYxhMFjEivBH2hFA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-arm64-gnu@0.5.48': + resolution: {integrity: sha512-KGYCBMqI2zfwyhgq5tpPVNe7jpUeYTBm8DhjdS+zqWNumde/PEC170QE5RHxcOAlsirIDeIUk0jqx+r/axoFSw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm64-musl@0.5.48': + resolution: {integrity: sha512-2wTSMsCSXLTc2lZUjMAuU5X4cje55u205WJqfV5NWNF6j9pW/tXyxr15dJeekj8ziLqBXzIsj4DbRh4sY/WcjA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-x64-gnu@0.5.48': + resolution: {integrity: sha512-d/6v9UnGglVu1WC2JQyv/5aWSi5fXZeGSlidCfmHp4+N65N1GDKUnFtys5MK5eAPeAjTgSHGGtOc/yCcKTlv3A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-x64-musl@0.5.48': + resolution: {integrity: sha512-gX19gw6u4ApPy7SYMPKfFlEkrtj6WlORvrTKK3sBQqjyV+8+mUAkQgxXNjHw4RnOiAmVYg7TOlZcg8d+Qqod9A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-win32-arm64@0.5.48': + resolution: {integrity: sha512-w6cQQLbqj3Jcom5Q7ifm103NUOQ9d+Cb4VU5lkrZDjMnwVJ9Hzzg1vCQR7miJuF44vhCXldbme5UryE3giEKlA==} + cpu: [arm64] + os: [win32] + + '@yuku-parser/binding-win32-x64@0.5.48': + resolution: {integrity: sha512-4gO0HmG7fzFxrw1rs0dUdnnaY9YgennjETqDWrTSp7x9fmTUOAoN4VsMfP7YyliQeG1WJJHc55O+rOhmsLppow==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.5.43': + resolution: {integrity: sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1025,6 +1267,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -1038,6 +1284,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1116,6 +1365,10 @@ packages: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1128,6 +1381,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + effect@4.0.0-beta.78: resolution: {integrity: sha512-j79Rl9QpHwMz/ZJWLNpZoiVj9N7zHqiLKN5EcYd/A8J1oqejILWQLfc4HPlvqHqKC8SK55LJ+X4gy4ONJ+JpfQ==} @@ -1145,9 +1401,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} @@ -1287,8 +1540,11 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jose@6.2.2: - resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} + jose@6.2.4: + resolution: {integrity: sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} @@ -1304,78 +1560,78 @@ packages: kubernetes-types@1.30.0: resolution: {integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} locate-path@5.0.0: @@ -1391,6 +1647,10 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1465,8 +1725,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxfmt@0.52.0: - resolution: {integrity: sha512-nJlYM35F64zTDMecCNhoHNkf+D/eHv7xcjj9XDSj+bFAVtN93m7v8DQMdHd6nDG6Akf/kEYYHmDUBs2Dz27Sug==} + oxfmt@0.60.0: + resolution: {integrity: sha512-fViX6i+gJuZWY+jI/fnR6WRbRj70GZ9RlCd30MygJrHTUNc4DxvKHWw8vBjMjffv3PgU5qWDR0AzmojQByqaZA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1478,16 +1738,16 @@ packages: vite-plus: optional: true - oxlint-tsgolint@0.23.0: - resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} + oxlint-tsgolint@7.0.2001: + resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==} hasBin: true - oxlint@1.67.0: - resolution: {integrity: sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ==} + oxlint@1.75.0: + resolution: {integrity: sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.22.1' + oxlint-tsgolint: '>=7.0.2001' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -1557,10 +1817,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pixelmatch@7.2.0: - resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==} - hasBin: true - pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} @@ -1574,6 +1830,10 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pure-rand@8.4.0: resolution: {integrity: sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==} @@ -1583,6 +1843,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -1673,8 +1936,8 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@8.2.1: - resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} engines: {node: '>=20'} strip-ansi@6.0.1: @@ -1742,13 +2005,13 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} undici@8.3.0: resolution: {integrity: sha512-TkUDgb6tl7KOGZ+7e8E3d2FYgUQgF6z5YypqjWmixVQSQERFcVrVg0ySADm2LVLRh5ljAaHTCR5Fmz3Q34rB7Q==} @@ -1766,10 +2029,18 @@ packages: resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true - vite-plus@0.1.24: - resolution: {integrity: sha512-b3fr6WtCiEhetjuzW/4KcEMOAMuZxoxZATWaXKmPzOLf1upG+pzKJOFZTb94D6wiPBlwcjxoaUtF7C3uAN+VjQ==} - engines: {node: ^20.19.0 || >=22.12.0} + vite-plus@0.2.6: + resolution: {integrity: sha512-fFX8GLENhtzvnE4NmTPC8INRxjD2kZKcqUW0p7jOdawmHTNZqM5FiieyWOG6WH1a/axu9FCsbUNb918grfzDTw==} + engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} hasBin: true + peerDependencies: + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + peerDependenciesMeta: + '@vitest/browser-playwright': + optional: true + '@vitest/browser-webdriverio': + optional: true vite@8.0.14: resolution: {integrity: sha512-s4BJJ+5y1pYL6Otw51FHhVJQhPnuRinKig64g/1+EUNaJsd3gCKdD31IPFvswUgW9/60QT9oFHbZHbQK5imcxw==} @@ -1814,21 +2085,23 @@ packages: yaml: optional: true - vitest@4.1.0: - resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true 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.0 - '@vitest/browser-preview': 4.1.0 - '@vitest/browser-webdriverio': 4.1.0 - '@vitest/ui': 4.1.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -1842,6 +2115,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -1896,10 +2173,26 @@ packages: resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} + yuku-codegen@0.5.48: + resolution: {integrity: sha512-p7HxD5Xl4jzDzqMrGePAOeSHmRY4g58h4HuGq15weQFPxuPWd/W6e7nqp/+Lea6JfpOdBwJOAyXFqIZ/J9Zfnw==} + + yuku-parser@0.5.48: + resolution: {integrity: sha512-OWBfhrpgK9+/4+IXG9oT8Bao4AhViQA7vdyNNH7EUg8dQYgwa70XtIBWTpCEme1P1ECyoDNYkn0wT63f8XRcVA==} + snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/runtime@7.29.7': {} + '@blazediff/core@1.9.1': {} + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -1929,7 +2222,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.31.0(@types/node@25.9.1)': + '@changesets/cli@2.31.1(@types/node@26.1.2)': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -1945,7 +2238,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.9.1) + '@inquirer/external-editor': 1.0.3(@types/node@26.1.2) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -2066,10 +2359,10 @@ snapshots: - bufferutil - utf-8-validate - '@effect/vitest@4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10)': dependencies: effect: 4.0.0-beta.78 - vitest: 4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) '@emnapi/core@1.10.0': dependencies: @@ -2087,12 +2380,12 @@ snapshots: tslib: 2.8.1 optional: true - '@inquirer/external-editor@1.0.3(@types/node@25.9.1)': + '@inquirer/external-editor@1.0.3(@types/node@26.1.2)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.2 '@ioredis/commands@1.5.1': {} @@ -2190,11 +2483,11 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@noble/curves@1.9.1': + '@noble/curves@2.2.0': dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 2.2.0 - '@noble/hashes@1.8.0': {} + '@noble/hashes@2.2.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2208,145 +2501,145 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/runtime@0.133.0': {} + '@oxc-project/runtime@0.141.0': {} '@oxc-project/types@0.132.0': {} - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.141.0': {} - '@oxfmt/binding-android-arm-eabi@0.52.0': + '@oxfmt/binding-android-arm-eabi@0.60.0': optional: true - '@oxfmt/binding-android-arm64@0.52.0': + '@oxfmt/binding-android-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-arm64@0.52.0': + '@oxfmt/binding-darwin-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-x64@0.52.0': + '@oxfmt/binding-darwin-x64@0.60.0': optional: true - '@oxfmt/binding-freebsd-x64@0.52.0': + '@oxfmt/binding-freebsd-x64@0.60.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.52.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.52.0': + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.52.0': + '@oxfmt/binding-linux-arm64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.52.0': + '@oxfmt/binding-linux-arm64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.52.0': + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.52.0': + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.52.0': + '@oxfmt/binding-linux-riscv64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.52.0': + '@oxfmt/binding-linux-s390x-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.52.0': + '@oxfmt/binding-linux-x64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.52.0': + '@oxfmt/binding-linux-x64-musl@0.60.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.52.0': + '@oxfmt/binding-openharmony-arm64@0.60.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.52.0': + '@oxfmt/binding-win32-arm64-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.52.0': + '@oxfmt/binding-win32-ia32-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.52.0': + '@oxfmt/binding-win32-x64-msvc@0.60.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.23.0': + '@oxlint-tsgolint/darwin-arm64@7.0.2001': optional: true - '@oxlint-tsgolint/darwin-x64@0.23.0': + '@oxlint-tsgolint/darwin-x64@7.0.2001': optional: true - '@oxlint-tsgolint/linux-arm64@0.23.0': + '@oxlint-tsgolint/linux-arm64@7.0.2001': optional: true - '@oxlint-tsgolint/linux-x64@0.23.0': + '@oxlint-tsgolint/linux-x64@7.0.2001': optional: true - '@oxlint-tsgolint/win32-arm64@0.23.0': + '@oxlint-tsgolint/win32-arm64@7.0.2001': optional: true - '@oxlint-tsgolint/win32-x64@0.23.0': + '@oxlint-tsgolint/win32-x64@7.0.2001': optional: true - '@oxlint/binding-android-arm-eabi@1.67.0': + '@oxlint/binding-android-arm-eabi@1.75.0': optional: true - '@oxlint/binding-android-arm64@1.67.0': + '@oxlint/binding-android-arm64@1.75.0': optional: true - '@oxlint/binding-darwin-arm64@1.67.0': + '@oxlint/binding-darwin-arm64@1.75.0': optional: true - '@oxlint/binding-darwin-x64@1.67.0': + '@oxlint/binding-darwin-x64@1.75.0': optional: true - '@oxlint/binding-freebsd-x64@1.67.0': + '@oxlint/binding-freebsd-x64@1.75.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.67.0': + '@oxlint/binding-linux-arm-gnueabihf@1.75.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.67.0': + '@oxlint/binding-linux-arm-musleabihf@1.75.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.67.0': + '@oxlint/binding-linux-arm64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.67.0': + '@oxlint/binding-linux-arm64-musl@1.75.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.67.0': + '@oxlint/binding-linux-ppc64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.67.0': + '@oxlint/binding-linux-riscv64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.67.0': + '@oxlint/binding-linux-riscv64-musl@1.75.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.67.0': + '@oxlint/binding-linux-s390x-gnu@1.75.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.67.0': + '@oxlint/binding-linux-x64-gnu@1.75.0': optional: true - '@oxlint/binding-linux-x64-musl@1.67.0': + '@oxlint/binding-linux-x64-musl@1.75.0': optional: true - '@oxlint/binding-openharmony-arm64@1.67.0': + '@oxlint/binding-openharmony-arm64@1.75.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.67.0': + '@oxlint/binding-win32-arm64-msvc@1.75.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.67.0': + '@oxlint/binding-win32-ia32-msvc@1.75.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.67.0': + '@oxlint/binding-win32-x64-msvc@1.75.0': optional: true - '@oxlint/plugins@1.61.0': {} + '@oxlint/plugins@1.73.0': {} '@polka/url@1.0.0-next.29': {} @@ -2405,6 +2698,21 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@total-typescript/shoehorn@0.1.2': {} '@tybys/wasm-util@0.10.2': @@ -2412,6 +2720,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -2423,131 +2733,250 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@25.9.1': + '@types/node@26.1.2': dependencies: - undici-types: 7.24.6 + undici-types: 8.3.0 '@types/ws@8.18.1': dependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.2 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true - '@vitest/expect@4.1.0': + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@vitest/browser-preview@4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10)': + dependencies: + '@testing-library/dom': 10.4.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/browser': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10) + vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.0 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.9.1)(yaml@2.9.0) + vite: 8.0.14(@types/node@26.1.2)(yaml@2.9.0) - '@vitest/pretty-format@4.1.0': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.0': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.0 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.0': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.0': {} + '@vitest/spy@4.1.10': {} - '@vitest/utils@4.1.0': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.0 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@voidzero-dev/vite-plus-core@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(yaml@2.9.0)': + '@voidzero-dev/vite-plus-core@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(yaml@2.9.0)': dependencies: - '@oxc-project/runtime': 0.133.0 - '@oxc-project/types': 0.133.0 - lightningcss: 1.32.0 + '@oxc-project/runtime': 0.141.0 + '@oxc-project/types': 0.141.0 + lightningcss: 1.33.0 postcss: 8.5.15 + yuku-codegen: 0.5.48 + yuku-parser: 0.5.48 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.2 fsevents: 2.3.3 - typescript: 6.0.3 + typescript: 7.0.2 yaml: 2.9.0 - '@voidzero-dev/vite-plus-darwin-arm64@0.1.24': + '@voidzero-dev/vite-plus-darwin-arm64@0.2.6': optional: true - '@voidzero-dev/vite-plus-darwin-x64@0.1.24': + '@voidzero-dev/vite-plus-darwin-x64@0.2.6': optional: true - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.24': + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.6': optional: true - '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.24': + '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.6': optional: true - '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.24': + '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.6': optional: true - '@voidzero-dev/vite-plus-linux-x64-musl@0.1.24': + '@voidzero-dev/vite-plus-linux-x64-musl@0.2.6': optional: true - '@voidzero-dev/vite-plus-test@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@voidzero-dev/vite-plus-core': 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(yaml@2.9.0) - es-module-lexer: 1.7.0 - obug: 2.1.1 - pixelmatch: 7.2.0 - pngjs: 7.0.0 - sirv: 3.0.2 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - vite: 8.0.14(@types/node@25.9.1)(yaml@2.9.0) - ws: 8.21.0 - optionalDependencies: - '@types/node': 25.9.1 - transitivePeerDependencies: - - '@arethetypeswrong/core' - - '@tsdown/css' - - '@tsdown/exe' - - '@vitejs/devtools' - - bufferutil - - esbuild - - jiti - - less - - publint - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - typescript - - unplugin-unused - - unrun - - utf-8-validate - - yaml + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.6': + optional: true + + '@voidzero-dev/vite-plus-win32-x64-msvc@0.2.6': + optional: true + + '@yuku-codegen/binding-darwin-arm64@0.5.48': + optional: true + + '@yuku-codegen/binding-darwin-x64@0.5.48': + optional: true + + '@yuku-codegen/binding-freebsd-x64@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-arm-gnu@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-arm-musl@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-arm64-gnu@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-arm64-musl@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-x64-gnu@0.5.48': + optional: true + + '@yuku-codegen/binding-linux-x64-musl@0.5.48': + optional: true + + '@yuku-codegen/binding-win32-arm64@0.5.48': + optional: true + + '@yuku-codegen/binding-win32-x64@0.5.48': + optional: true + + '@yuku-parser/binding-darwin-arm64@0.5.48': + optional: true + + '@yuku-parser/binding-darwin-x64@0.5.48': + optional: true + + '@yuku-parser/binding-freebsd-x64@0.5.48': + optional: true + + '@yuku-parser/binding-linux-arm-gnu@0.5.48': + optional: true + + '@yuku-parser/binding-linux-arm-musl@0.5.48': + optional: true + + '@yuku-parser/binding-linux-arm64-gnu@0.5.48': + optional: true + + '@yuku-parser/binding-linux-arm64-musl@0.5.48': + optional: true + + '@yuku-parser/binding-linux-x64-gnu@0.5.48': + optional: true - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.24': + '@yuku-parser/binding-linux-x64-musl@0.5.48': optional: true - '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.24': + '@yuku-parser/binding-win32-arm64@0.5.48': optional: true + '@yuku-parser/binding-win32-x64@0.5.48': + optional: true + + '@yuku-toolchain/types@0.5.43': {} + ansi-colors@4.1.3: {} ansi-escapes@7.3.0: @@ -2562,6 +2991,8 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} any-promise@1.3.0: {} @@ -2572,6 +3003,10 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + array-union@2.1.0: {} assertion-error@2.0.1: {} @@ -2640,6 +3075,8 @@ snapshots: denque@2.1.0: {} + dequal@2.0.3: {} + detect-indent@6.1.0: {} detect-libc@2.1.2: {} @@ -2648,6 +3085,8 @@ snapshots: dependencies: path-type: 4.0.0 + dom-accessibility-api@0.5.16: {} + effect@4.0.0-beta.78: dependencies: '@standard-schema/spec': 1.1.0 @@ -2672,8 +3111,6 @@ snapshots: environment@1.1.0: {} - es-module-lexer@1.7.0: {} - es-module-lexer@2.1.0: {} escalade@3.2.0: {} @@ -2799,7 +3236,9 @@ snapshots: isexe@2.0.0: {} - jose@6.2.2: {} + jose@6.2.4: {} + + js-tokens@4.0.0: {} js-yaml@3.14.2: dependencies: @@ -2816,54 +3255,54 @@ snapshots: kubernetes-types@1.30.0: {} - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 locate-path@5.0.0: dependencies: @@ -2875,6 +3314,8 @@ snapshots: lodash.startcase@4.4.0: {} + lz-string@1.5.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2951,63 +3392,63 @@ snapshots: outdent@0.5.0: {} - oxfmt@0.52.0(vite-plus@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0)): + oxfmt@0.60.0(vite-plus@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0)): dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.52.0 - '@oxfmt/binding-android-arm64': 0.52.0 - '@oxfmt/binding-darwin-arm64': 0.52.0 - '@oxfmt/binding-darwin-x64': 0.52.0 - '@oxfmt/binding-freebsd-x64': 0.52.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.52.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.52.0 - '@oxfmt/binding-linux-arm64-gnu': 0.52.0 - '@oxfmt/binding-linux-arm64-musl': 0.52.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.52.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.52.0 - '@oxfmt/binding-linux-riscv64-musl': 0.52.0 - '@oxfmt/binding-linux-s390x-gnu': 0.52.0 - '@oxfmt/binding-linux-x64-gnu': 0.52.0 - '@oxfmt/binding-linux-x64-musl': 0.52.0 - '@oxfmt/binding-openharmony-arm64': 0.52.0 - '@oxfmt/binding-win32-arm64-msvc': 0.52.0 - '@oxfmt/binding-win32-ia32-msvc': 0.52.0 - '@oxfmt/binding-win32-x64-msvc': 0.52.0 - vite-plus: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) - - oxlint-tsgolint@0.23.0: + '@oxfmt/binding-android-arm-eabi': 0.60.0 + '@oxfmt/binding-android-arm64': 0.60.0 + '@oxfmt/binding-darwin-arm64': 0.60.0 + '@oxfmt/binding-darwin-x64': 0.60.0 + '@oxfmt/binding-freebsd-x64': 0.60.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.60.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.60.0 + '@oxfmt/binding-linux-arm64-gnu': 0.60.0 + '@oxfmt/binding-linux-arm64-musl': 0.60.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-musl': 0.60.0 + '@oxfmt/binding-linux-s390x-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-musl': 0.60.0 + '@oxfmt/binding-openharmony-arm64': 0.60.0 + '@oxfmt/binding-win32-arm64-msvc': 0.60.0 + '@oxfmt/binding-win32-ia32-msvc': 0.60.0 + '@oxfmt/binding-win32-x64-msvc': 0.60.0 + vite-plus: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) + + oxlint-tsgolint@7.0.2001: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.23.0 - '@oxlint-tsgolint/darwin-x64': 0.23.0 - '@oxlint-tsgolint/linux-arm64': 0.23.0 - '@oxlint-tsgolint/linux-x64': 0.23.0 - '@oxlint-tsgolint/win32-arm64': 0.23.0 - '@oxlint-tsgolint/win32-x64': 0.23.0 - - oxlint@1.67.0(oxlint-tsgolint@0.23.0)(vite-plus@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0)): + '@oxlint-tsgolint/darwin-arm64': 7.0.2001 + '@oxlint-tsgolint/darwin-x64': 7.0.2001 + '@oxlint-tsgolint/linux-arm64': 7.0.2001 + '@oxlint-tsgolint/linux-x64': 7.0.2001 + '@oxlint-tsgolint/win32-arm64': 7.0.2001 + '@oxlint-tsgolint/win32-x64': 7.0.2001 + + oxlint@1.75.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0)): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.67.0 - '@oxlint/binding-android-arm64': 1.67.0 - '@oxlint/binding-darwin-arm64': 1.67.0 - '@oxlint/binding-darwin-x64': 1.67.0 - '@oxlint/binding-freebsd-x64': 1.67.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.67.0 - '@oxlint/binding-linux-arm-musleabihf': 1.67.0 - '@oxlint/binding-linux-arm64-gnu': 1.67.0 - '@oxlint/binding-linux-arm64-musl': 1.67.0 - '@oxlint/binding-linux-ppc64-gnu': 1.67.0 - '@oxlint/binding-linux-riscv64-gnu': 1.67.0 - '@oxlint/binding-linux-riscv64-musl': 1.67.0 - '@oxlint/binding-linux-s390x-gnu': 1.67.0 - '@oxlint/binding-linux-x64-gnu': 1.67.0 - '@oxlint/binding-linux-x64-musl': 1.67.0 - '@oxlint/binding-openharmony-arm64': 1.67.0 - '@oxlint/binding-win32-arm64-msvc': 1.67.0 - '@oxlint/binding-win32-ia32-msvc': 1.67.0 - '@oxlint/binding-win32-x64-msvc': 1.67.0 - oxlint-tsgolint: 0.23.0 - vite-plus: 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) + '@oxlint/binding-android-arm-eabi': 1.75.0 + '@oxlint/binding-android-arm64': 1.75.0 + '@oxlint/binding-darwin-arm64': 1.75.0 + '@oxlint/binding-darwin-x64': 1.75.0 + '@oxlint/binding-freebsd-x64': 1.75.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.75.0 + '@oxlint/binding-linux-arm-musleabihf': 1.75.0 + '@oxlint/binding-linux-arm64-gnu': 1.75.0 + '@oxlint/binding-linux-arm64-musl': 1.75.0 + '@oxlint/binding-linux-ppc64-gnu': 1.75.0 + '@oxlint/binding-linux-riscv64-gnu': 1.75.0 + '@oxlint/binding-linux-riscv64-musl': 1.75.0 + '@oxlint/binding-linux-s390x-gnu': 1.75.0 + '@oxlint/binding-linux-x64-gnu': 1.75.0 + '@oxlint/binding-linux-x64-musl': 1.75.0 + '@oxlint/binding-openharmony-arm64': 1.75.0 + '@oxlint/binding-win32-arm64-msvc': 1.75.0 + '@oxlint/binding-win32-ia32-msvc': 1.75.0 + '@oxlint/binding-win32-x64-msvc': 1.75.0 + oxlint-tsgolint: 7.0.2001 + vite-plus: 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0) p-filter@2.1.0: dependencies: @@ -3053,10 +3494,6 @@ snapshots: pify@4.0.1: {} - pixelmatch@7.2.0: - dependencies: - pngjs: 7.0.0 - pngjs@7.0.0: {} postcss@8.5.15: @@ -3067,12 +3504,20 @@ snapshots: prettier@2.8.8: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pure-rand@8.4.0: {} quansync@0.2.11: {} queue-microtask@1.2.3: {} + react-is@17.0.2: {} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -3164,7 +3609,7 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@8.2.1: + string-width@8.2.2: dependencies: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 @@ -3222,9 +3667,30 @@ snapshots: tslib@2.8.1: optional: true - typescript@6.0.3: {} - - undici-types@7.24.6: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici-types@8.3.0: {} undici@8.3.0: {} @@ -3234,30 +3700,37 @@ snapshots: uuid@14.0.0: {} - vite-plus@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0): - dependencies: - '@oxc-project/types': 0.133.0 - '@oxlint/plugins': 1.61.0 - '@voidzero-dev/vite-plus-core': 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(yaml@2.9.0) - '@voidzero-dev/vite-plus-test': 0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0) - oxfmt: 0.52.0(vite-plus@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0)) - oxlint: 1.67.0(oxlint-tsgolint@0.23.0)(vite-plus@0.1.24(@types/node@25.9.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0))(yaml@2.9.0)) - oxlint-tsgolint: 0.23.0 + vite-plus@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0): + dependencies: + '@oxc-project/types': 0.141.0 + '@oxlint/plugins': 1.73.0 + '@vitest/browser': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/browser-preview': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + '@voidzero-dev/vite-plus-core': 0.2.6(@types/node@26.1.2)(typescript@7.0.2)(yaml@2.9.0) + oxfmt: 0.60.0(vite-plus@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0)) + oxlint: 1.75.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.6(@types/node@26.1.2)(typescript@7.0.2)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(yaml@2.9.0)) + oxlint-tsgolint: 7.0.2001 + vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) optionalDependencies: - '@voidzero-dev/vite-plus-darwin-arm64': 0.1.24 - '@voidzero-dev/vite-plus-darwin-x64': 0.1.24 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.24 - '@voidzero-dev/vite-plus-linux-arm64-musl': 0.1.24 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.24 - '@voidzero-dev/vite-plus-linux-x64-musl': 0.1.24 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.24 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.24 + '@voidzero-dev/vite-plus-darwin-arm64': 0.2.6 + '@voidzero-dev/vite-plus-darwin-x64': 0.2.6 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.2.6 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.2.6 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.2.6 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.2.6 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.2.6 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.2.6 transitivePeerDependencies: - '@arethetypeswrong/core' - '@edge-runtime/vm' - '@opentelemetry/api' - - '@tsdown/css' - - '@tsdown/exe' - '@types/node' - '@vitejs/devtools' - '@vitest/coverage-istanbul' @@ -3269,6 +3742,7 @@ snapshots: - jiti - jsdom - less + - msw - publint - sass - sass-embedded @@ -3284,27 +3758,27 @@ snapshots: - vite - yaml - vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0): + vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0): dependencies: - lightningcss: 1.32.0 + lightningcss: 1.33.0 picomatch: 4.0.4 postcss: 8.5.15 rolldown: 1.0.2 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.2 fsevents: 2.3.3 yaml: 2.9.0 - vitest@4.1.0(@types/node@25.9.1)(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@8.0.14(@types/node@25.9.1)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3316,10 +3790,11 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.9.1)(yaml@2.9.0) + vite: 8.0.14(@types/node@26.1.2)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 26.1.2 + '@vitest/browser-preview': 4.1.10(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))(vitest@4.1.10) transitivePeerDependencies: - msw @@ -3335,7 +3810,7 @@ snapshots: wrap-ansi@10.0.0: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.1 + string-width: 8.2.2 strip-ansi: 7.2.0 wrap-ansi@7.0.0: @@ -3361,3 +3836,35 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + + yuku-codegen@0.5.48: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-codegen/binding-darwin-arm64': 0.5.48 + '@yuku-codegen/binding-darwin-x64': 0.5.48 + '@yuku-codegen/binding-freebsd-x64': 0.5.48 + '@yuku-codegen/binding-linux-arm-gnu': 0.5.48 + '@yuku-codegen/binding-linux-arm-musl': 0.5.48 + '@yuku-codegen/binding-linux-arm64-gnu': 0.5.48 + '@yuku-codegen/binding-linux-arm64-musl': 0.5.48 + '@yuku-codegen/binding-linux-x64-gnu': 0.5.48 + '@yuku-codegen/binding-linux-x64-musl': 0.5.48 + '@yuku-codegen/binding-win32-arm64': 0.5.48 + '@yuku-codegen/binding-win32-x64': 0.5.48 + + yuku-parser@0.5.48: + dependencies: + '@yuku-toolchain/types': 0.5.43 + optionalDependencies: + '@yuku-parser/binding-darwin-arm64': 0.5.48 + '@yuku-parser/binding-darwin-x64': 0.5.48 + '@yuku-parser/binding-freebsd-x64': 0.5.48 + '@yuku-parser/binding-linux-arm-gnu': 0.5.48 + '@yuku-parser/binding-linux-arm-musl': 0.5.48 + '@yuku-parser/binding-linux-arm64-gnu': 0.5.48 + '@yuku-parser/binding-linux-arm64-musl': 0.5.48 + '@yuku-parser/binding-linux-x64-gnu': 0.5.48 + '@yuku-parser/binding-linux-x64-musl': 0.5.48 + '@yuku-parser/binding-win32-arm64': 0.5.48 + '@yuku-parser/binding-win32-x64': 0.5.48 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 76e67bd..9b2d32a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,13 +7,13 @@ packages: catalog: "@effect/platform-node": 4.0.0-beta.78 "@effect/vitest": 4.0.0-beta.78 - "@noble/curves": 1.9.1 - "@noble/hashes": 1.8.0 - "@types/node": ^25.9.1 + "@noble/curves": 2.2.0 + "@noble/hashes": 2.2.0 + "@types/node": ^26.1.2 effect: 4.0.0-beta.78 - jose: 6.2.2 - vite-plus: 0.1.24 - vite: npm:@voidzero-dev/vite-plus-core@0.1.24 + jose: 6.2.4 + vite-plus: 0.2.6 + vite: npm:@voidzero-dev/vite-plus-core@0.2.6 vitest: npm:@voidzero-dev/vite-plus-test@0.1.24 yaml: ^2.9.0 From 7d75f3ebfafed419d11e178eda31c21599c93026 Mon Sep 17 00:00:00 2001 From: Tarik02 Date: Tue, 28 Jul 2026 10:31:22 +0300 Subject: [PATCH 4/5] preserve typed error causes --- src/auth/error.ts | 3 ++- src/auth/remote-error.ts | 17 +++++++++++++++++ src/auth/transport.ts | 22 +++++++++++++++------- src/connection/error.ts | 6 +++++- src/connection/prepared.ts | 28 ++++++++++++++-------------- src/rpc/error.ts | 20 ++++++++++---------- 6 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 src/auth/remote-error.ts diff --git a/src/auth/error.ts b/src/auth/error.ts index def5766..5cf03ac 100644 --- a/src/auth/error.ts +++ b/src/auth/error.ts @@ -4,6 +4,7 @@ import { PlatformError } from "effect/PlatformError"; import { ConfigError } from "../config/error.ts"; import { UrlError } from "../config/url/error.ts"; +import { RemoteEnvironmentAuthErrorSchema } from "./remote-error.ts"; export class AuthPairingUrlError extends Schema.TaggedErrorClass()( "AuthPairingUrlError", @@ -22,7 +23,7 @@ export class AuthTransportError extends Schema.TaggedErrorClass; diff --git a/src/auth/transport.ts b/src/auth/transport.ts index 4a7bddf..c06852c 100644 --- a/src/auth/transport.ts +++ b/src/auth/transport.ts @@ -51,7 +51,11 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { httpBaseUrl: input.baseUrl, credential: input.credential, }), - ).pipe(Effect.mapError(toTransportError("auth request failed"))); + ).pipe( + Effect.mapError( + (error) => new AuthTransportError({ message: "auth request failed", cause: error }), + ), + ); const now = yield* DateTime.now; return { authenticated: true, @@ -70,7 +74,11 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { httpBaseUrl: connection.url, bearerToken: connection.token, }), - ).pipe(Effect.mapError(toTransportError("auth request failed"))); + ).pipe( + Effect.mapError( + (error) => new AuthTransportError({ message: "auth request failed", cause: error }), + ), + ); return { authenticated: result.authenticated, ...(result.scopes !== undefined ? { role: inferRole(result.scopes.join(" ")) } : {}), @@ -88,7 +96,11 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { httpBaseUrl: connection.url, bearerToken: connection.token, }), - ).pipe(Effect.mapError(toTransportError("auth request failed"))); + ).pipe( + Effect.mapError( + (error) => new AuthTransportError({ message: "auth request failed", cause: error }), + ), + ); return { ticket: result.ticket, expiresAt: DateTime.formatIso(result.expiresAt), @@ -108,7 +120,3 @@ export const T3AuthTransportLive = Layer.effect(T3AuthTransport, makeT3AuthTrans function inferRole(scope: string): AuthBearerBootstrapResult["role"] { return scope.split(/\s+/u).includes("access:write") ? "owner" : "client"; } - -function toTransportError(message: string) { - return (error: unknown) => new AuthTransportError({ message, cause: error }); -} diff --git a/src/connection/error.ts b/src/connection/error.ts index 7e10555..237d727 100644 --- a/src/connection/error.ts +++ b/src/connection/error.ts @@ -1,9 +1,13 @@ import * as Schema from "effect/Schema"; +import { RemoteEnvironmentAuthErrorSchema } from "../auth/remote-error.ts"; +import { ConfigError } from "../config/error.ts"; +import { UrlError } from "../config/url/error.ts"; + export class T3CodeConnectionError extends Schema.TaggedErrorClass()( "T3CodeConnectionError", { message: Schema.String, - cause: Schema.optionalKey(Schema.Unknown), + cause: Schema.Union([ConfigError, RemoteEnvironmentAuthErrorSchema, UrlError]), }, ) {} diff --git a/src/connection/prepared.ts b/src/connection/prepared.ts index 66233e9..ea05849 100644 --- a/src/connection/prepared.ts +++ b/src/connection/prepared.ts @@ -1,7 +1,4 @@ -import { - resolveRemoteWebSocketConnectionUrl, - type RemoteEnvironmentAuthError, -} from "@t3tools/client-runtime/authorization"; +import { resolveRemoteWebSocketConnectionUrl } from "@t3tools/client-runtime/authorization"; import { BearerConnectionTarget, type PreparedConnection, @@ -38,8 +35,12 @@ export const makePreparedConnection = Effect.fn("makePreparedConnection")(functi ), ); const descriptor = yield* fetchRemoteEnvironmentDescriptor({ httpBaseUrl }).pipe( - Effect.mapError((error) => - mapRemoteConnectionError("failed to fetch environment descriptor", error), + Effect.mapError( + (error) => + new T3CodeConnectionError({ + message: "failed to fetch environment descriptor", + cause: error, + }), ), ); const socketUrl = yield* resolveRemoteWebSocketConnectionUrl({ @@ -47,7 +48,13 @@ export const makePreparedConnection = Effect.fn("makePreparedConnection")(functi wsBaseUrl, bearerToken: connection.auth.token, }).pipe( - Effect.mapError((error) => mapRemoteConnectionError("failed to authorize websocket", error)), + Effect.mapError( + (error) => + new T3CodeConnectionError({ + message: "failed to authorize websocket", + cause: error, + }), + ), ); return { @@ -82,10 +89,3 @@ export const T3PreparedConnectionProviderLive = Layer.effect( return T3PreparedConnectionProvider.of({ get }); }), ); - -function mapRemoteConnectionError( - message: string, - error: RemoteEnvironmentAuthError, -): T3CodeConnectionError { - return new T3CodeConnectionError({ message, cause: error }); -} diff --git a/src/rpc/error.ts b/src/rpc/error.ts index 78e41d8..ac44c23 100644 --- a/src/rpc/error.ts +++ b/src/rpc/error.ts @@ -1,15 +1,16 @@ -import * as Schema from "effect/Schema"; +import { + ConnectionBlockedError, + ConnectionTransientError, +} from "@t3tools/client-runtime/connection"; import { EnvironmentAuthorizationError, KeybindingsConfigError, OrchestrationDispatchCommandError, OrchestrationGetSnapshotError, ServerSettingsError, - TerminalCwdError, - TerminalHistoryError, - TerminalNotRunningError, - TerminalSessionLookupError, + TerminalError, } from "@t3tools/contracts"; +import * as Schema from "effect/Schema"; import { HttpClientError } from "effect/unstable/http"; import { RpcClientError } from "effect/unstable/rpc"; @@ -24,10 +25,9 @@ const RpcErrorCauseSchema = Schema.Union([ OrchestrationDispatchCommandError, OrchestrationGetSnapshotError, ServerSettingsError, - TerminalCwdError, - TerminalHistoryError, - TerminalNotRunningError, - TerminalSessionLookupError, + TerminalError, + ConnectionBlockedError, + ConnectionTransientError, AuthTransportError, T3CodeConnectionError, HttpClientError.HttpClientErrorSchema, @@ -40,7 +40,7 @@ export type RpcKnownCause = Schema.Schema.Type; export class RpcError extends Schema.TaggedErrorClass()("RpcError", { message: Schema.String, method: Schema.optionalKey(Schema.String), - cause: Schema.optionalKey(Schema.Unknown), + cause: Schema.optionalKey(RpcErrorCauseSchema), }) {} export type OrchestrationError = RpcError; From 4a01b3c07b8e8b134da85ff50c66dd080d2f3216 Mon Sep 17 00:00:00 2001 From: Tarik02 Date: Tue, 28 Jul 2026 10:58:33 +0300 Subject: [PATCH 5/5] tighten client runtime connection handling --- package.json | 1 - pnpm-lock.yaml | 34 ++---- src/auth/transport.ts | 61 +++++------ src/connection/error.ts | 3 +- src/connection/prepared.ts | 38 +++---- src/rpc/error.ts | 7 -- src/rpc/layer.ts | 8 +- src/rpc/operation.ts | 18 +++- src/rpc/service.ts | 6 +- src/rpc/session.ts | 206 +++++++++++++++++++++---------------- src/rpc/ws-group.ts | 61 ----------- 11 files changed, 195 insertions(+), 248 deletions(-) delete mode 100644 src/rpc/ws-group.ts diff --git a/package.json b/package.json index a4bb9c2..4bdae86 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,6 @@ "@effect/vitest": "catalog:", "@t3tools/client-runtime": "workspace:*", "@t3tools/contracts": "workspace:*", - "@t3tools/shared": "workspace:*", "@total-typescript/shoehorn": "^0.1.2", "@types/node": "^26.1.2", "typescript": "^7.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8127a1b..3b77f72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,33 +6,9 @@ settings: catalogs: default: - '@effect/platform-node': - specifier: 4.0.0-beta.78 - version: 4.0.0-beta.78 '@effect/vitest': specifier: 4.0.0-beta.78 version: 4.0.0-beta.78 - '@noble/curves': - specifier: 2.2.0 - version: 2.2.0 - '@noble/hashes': - specifier: 2.2.0 - version: 2.2.0 - '@types/node': - specifier: ^26.1.2 - version: 26.1.2 - effect: - specifier: 4.0.0-beta.78 - version: 4.0.0-beta.78 - jose: - specifier: 6.2.4 - version: 6.2.4 - vite-plus: - specifier: 0.2.6 - version: 0.2.6 - yaml: - specifier: ^2.9.0 - version: 2.9.0 patchedDependencies: '@effect/vitest@4.0.0-beta.78': @@ -70,16 +46,13 @@ importers: version: 2.31.1(@types/node@26.1.2) '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10) + version: 4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0))) '@t3tools/client-runtime': specifier: workspace:* version: link:upstream-t3code/packages/client-runtime '@t3tools/contracts': specifier: workspace:* version: link:upstream-t3code/packages/contracts - '@t3tools/shared': - specifier: workspace:* - version: link:upstream-t3code/packages/shared '@total-typescript/shoehorn': specifier: ^0.1.2 version: 0.1.2 @@ -2359,6 +2332,11 @@ snapshots: - bufferutil - utf-8-validate + '@effect/vitest@4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)))': + dependencies: + effect: 4.0.0-beta.78 + vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-preview@4.1.10)(vite@8.0.14(@types/node@26.1.2)(yaml@2.9.0)) + '@effect/vitest@4.0.0-beta.78(patch_hash=74fd480109c3bd975255bf5573a64718451bcae02b523c432bc18e9aa27b52fd)(effect@4.0.0-beta.78)(vitest@4.1.10)': dependencies: effect: 4.0.0-beta.78 diff --git a/src/auth/transport.ts b/src/auth/transport.ts index c06852c..41eb775 100644 --- a/src/auth/transport.ts +++ b/src/auth/transport.ts @@ -39,19 +39,16 @@ export class T3AuthTransport extends Context.Service< const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { const httpClient = yield* HttpClient.HttpClient; - const provideHttpClient = (effect: Effect.Effect) => - effect.pipe(Effect.provideService(HttpClient.HttpClient, httpClient)); const bootstrapBearer = Effect.fn("AuthTransport.bootstrapBearer")(function* (input: { readonly baseUrl: string; readonly credential: string; }) { - const result = yield* provideHttpClient( - bootstrapRemoteBearerSession({ - httpBaseUrl: input.baseUrl, - credential: input.credential, - }), - ).pipe( + const result = yield* bootstrapRemoteBearerSession({ + httpBaseUrl: input.baseUrl, + credential: input.credential, + }).pipe( + Effect.provideService(HttpClient.HttpClient, httpClient), Effect.mapError( (error) => new AuthTransportError({ message: "auth request failed", cause: error }), ), @@ -69,12 +66,11 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { const getSession = Effect.fn("AuthTransport.getSession")(function* ( connection: AuthTransportConnection, ) { - const result = yield* provideHttpClient( - fetchRemoteSessionState({ - httpBaseUrl: connection.url, - bearerToken: connection.token, - }), - ).pipe( + const result = yield* fetchRemoteSessionState({ + httpBaseUrl: connection.url, + bearerToken: connection.token, + }).pipe( + Effect.provideService(HttpClient.HttpClient, httpClient), Effect.mapError( (error) => new AuthTransportError({ message: "auth request failed", cause: error }), ), @@ -89,29 +85,28 @@ const makeT3AuthTransport = Effect.fn("makeT3AuthTransport")(function* () { } satisfies AuthSessionState; }); - const issueWebSocketTicketForConnection = Effect.fn("AuthTransport.issueWebSocketTicket")( - function* (connection: AuthTransportConnection) { - const result = yield* provideHttpClient( - issueRemoteWebSocketTicket({ - httpBaseUrl: connection.url, - bearerToken: connection.token, - }), - ).pipe( - Effect.mapError( - (error) => new AuthTransportError({ message: "auth request failed", cause: error }), - ), - ); - return { - ticket: result.ticket, - expiresAt: DateTime.formatIso(result.expiresAt), - } satisfies AuthWebSocketTicketResult; - }, - ); + const issueWebSocketTicket = Effect.fn("AuthTransport.issueWebSocketTicket")(function* ( + connection: AuthTransportConnection, + ) { + const result = yield* issueRemoteWebSocketTicket({ + httpBaseUrl: connection.url, + bearerToken: connection.token, + }).pipe( + Effect.provideService(HttpClient.HttpClient, httpClient), + Effect.mapError( + (error) => new AuthTransportError({ message: "auth request failed", cause: error }), + ), + ); + return { + ticket: result.ticket, + expiresAt: DateTime.formatIso(result.expiresAt), + } satisfies AuthWebSocketTicketResult; + }); return { bootstrapBearer, getSession, - issueWebSocketTicket: issueWebSocketTicketForConnection, + issueWebSocketTicket, }; }); diff --git a/src/connection/error.ts b/src/connection/error.ts index 237d727..cc4fbfb 100644 --- a/src/connection/error.ts +++ b/src/connection/error.ts @@ -1,6 +1,5 @@ import * as Schema from "effect/Schema"; -import { RemoteEnvironmentAuthErrorSchema } from "../auth/remote-error.ts"; import { ConfigError } from "../config/error.ts"; import { UrlError } from "../config/url/error.ts"; @@ -8,6 +7,6 @@ export class T3CodeConnectionError extends Schema.TaggedErrorClass; + readonly get: Effect.Effect; } >()("t3cli/T3PreparedConnectionProvider") {} -export const makePreparedConnection = Effect.fn("makePreparedConnection")(function* ( +const makePreparedConnection = Effect.fn("makePreparedConnection")(function* ( connection: T3CodeConnection, ) { const httpBaseUrl = connection.origin.url; @@ -35,27 +37,13 @@ export const makePreparedConnection = Effect.fn("makePreparedConnection")(functi ), ); const descriptor = yield* fetchRemoteEnvironmentDescriptor({ httpBaseUrl }).pipe( - Effect.mapError( - (error) => - new T3CodeConnectionError({ - message: "failed to fetch environment descriptor", - cause: error, - }), - ), + Effect.mapError(mapRemoteEnvironmentError), ); const socketUrl = yield* resolveRemoteWebSocketConnectionUrl({ httpBaseUrl, wsBaseUrl, bearerToken: connection.auth.token, - }).pipe( - Effect.mapError( - (error) => - new T3CodeConnectionError({ - message: "failed to authorize websocket", - cause: error, - }), - ), - ); + }).pipe(Effect.mapError(mapRemoteEnvironmentError)); return { environmentId: descriptor.environmentId, @@ -63,7 +51,7 @@ export const makePreparedConnection = Effect.fn("makePreparedConnection")(functi httpBaseUrl, socketUrl, httpAuthorization: { - _tag: "Bearer" as const, + _tag: "Bearer", token: connection.auth.token, }, target: new BearerConnectionTarget({ @@ -74,9 +62,8 @@ export const makePreparedConnection = Effect.fn("makePreparedConnection")(functi } satisfies PreparedConnection; }); -export const T3PreparedConnectionProviderLive = Layer.effect( - T3PreparedConnectionProvider, - Effect.gen(function* () { +const makeT3PreparedConnectionProvider = Effect.fn("makeT3PreparedConnectionProvider")( + function* () { const connectionProvider = yield* T3CodeConnectionProvider; const httpClient = yield* HttpClient.HttpClient; const get = connectionProvider.get.pipe( @@ -87,5 +74,10 @@ export const T3PreparedConnectionProviderLive = Layer.effect( ), ); return T3PreparedConnectionProvider.of({ get }); - }), + }, +); + +export const T3PreparedConnectionProviderLive = Layer.effect( + T3PreparedConnectionProvider, + makeT3PreparedConnectionProvider(), ); diff --git a/src/rpc/error.ts b/src/rpc/error.ts index ac44c23..abdf037 100644 --- a/src/rpc/error.ts +++ b/src/rpc/error.ts @@ -11,12 +11,9 @@ import { TerminalError, } from "@t3tools/contracts"; import * as Schema from "effect/Schema"; -import { HttpClientError } from "effect/unstable/http"; import { RpcClientError } from "effect/unstable/rpc"; -import { AuthTransportError } from "../auth/error.ts"; import { T3CodeConnectionError } from "../connection/error.ts"; -import { UrlError } from "../config/url/error.ts"; const RpcErrorCauseSchema = Schema.Union([ RpcClientError.RpcClientError, @@ -28,11 +25,7 @@ const RpcErrorCauseSchema = Schema.Union([ TerminalError, ConnectionBlockedError, ConnectionTransientError, - AuthTransportError, T3CodeConnectionError, - HttpClientError.HttpClientErrorSchema, - UrlError, - Schema.instanceOf(Schema.SchemaError), ]); export type RpcKnownCause = Schema.Schema.Type; diff --git a/src/rpc/layer.ts b/src/rpc/layer.ts index ebaa980..604b57a 100644 --- a/src/rpc/layer.ts +++ b/src/rpc/layer.ts @@ -4,6 +4,7 @@ import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; +import * as Predicate from "effect/Predicate"; import * as Schedule from "effect/Schedule"; import * as Scope from "effect/Scope"; import * as SynchronizedRef from "effect/SynchronizedRef"; @@ -12,7 +13,12 @@ import { T3PreparedConnectionProvider } from "../connection/prepared.ts"; import { RpcError } from "./error.ts"; import { T3Rpc, type WsClient } from "./service.ts"; -const connectionRetrySchedule = Schedule.exponential("100 millis").pipe(Schedule.take(4)); +const connectionRetrySchedule = Schedule.exponential("100 millis").pipe( + Schedule.take(4), + Schedule.collectWhile((metadata: Schedule.Metadata) => + Predicate.isTagged(metadata.input, "ConnectionTransientError"), + ), +); type Connection = { readonly scope: Scope.Closeable; diff --git a/src/rpc/operation.ts b/src/rpc/operation.ts index 8585b43..eff7e70 100644 --- a/src/rpc/operation.ts +++ b/src/rpc/operation.ts @@ -1,3 +1,11 @@ +import type { + EnvironmentAuthorizationError, + KeybindingsConfigError, + OrchestrationDispatchCommandError, + OrchestrationGetSnapshotError, + ServerSettingsError, + TerminalError, +} from "@t3tools/contracts"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; @@ -8,9 +16,15 @@ import { RpcClientError } from "effect/unstable/rpc"; import { RpcError } from "./error.ts"; import { T3Rpc, type WsClient } from "./service.ts"; -import type { CliRpcRequestError } from "./ws-group.ts"; -export type CliRpcOperationError = CliRpcRequestError | RpcClientError.RpcClientError; +export type CliRpcOperationError = + | EnvironmentAuthorizationError + | KeybindingsConfigError + | OrchestrationDispatchCommandError + | OrchestrationGetSnapshotError + | RpcClientError.RpcClientError + | ServerSettingsError + | TerminalError; export const rpcRetrySchedule = Schedule.exponential("100 millis").pipe( Schedule.take(4), diff --git a/src/rpc/service.ts b/src/rpc/service.ts index a204c04..54a765c 100644 --- a/src/rpc/service.ts +++ b/src/rpc/service.ts @@ -1,10 +1,10 @@ +import type { RpcSession } from "@t3tools/client-runtime/rpc"; import * as Context from "effect/Context"; import type * as Effect from "effect/Effect"; -import type { RpcClient, RpcClientError } from "effect/unstable/rpc"; -import type { CliWsRpcGroup } from "./ws-group.ts"; + import type { RpcError } from "./error.ts"; -export type WsClient = RpcClient.FromGroup; +export type WsClient = RpcSession["client"]; export type T3RpcService = { readonly getClient: Effect.Effect; diff --git a/src/rpc/session.ts b/src/rpc/session.ts index a18f145..9d722a4 100644 --- a/src/rpc/session.ts +++ b/src/rpc/session.ts @@ -6,111 +6,143 @@ import { import { ConnectionBlockedError, type ConnectionAttemptError, - type ConnectionTransientError, - ConnectionTransientError as ConnectionTransientErrorClass, + ConnectionTransientError, type PreparedConnection, } from "@t3tools/client-runtime/connection"; import { WS_METHODS } from "@t3tools/contracts"; import * as Deferred from "effect/Deferred"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; -import * as Predicate from "effect/Predicate"; import * as Schedule from "effect/Schedule"; import * as RpcClient from "effect/unstable/rpc/RpcClient"; import * as RpcSerialization from "effect/unstable/rpc/RpcSerialization"; import * as Socket from "effect/unstable/socket/Socket"; -type InitialConfigError = Effect.Error< - ReturnType[typeof WS_METHODS.serverGetConfig]> ->; +type SessionRpcError = + | Effect.Error> + | Effect.Error>; -export const T3RpcSessionFactoryLive = Layer.effect( - RpcSessionFactory, - Effect.gen(function* () { - const webSocketConstructor = yield* Socket.WebSocketConstructor; +const makeT3RpcSessionFactory = Effect.fn("makeT3RpcSessionFactory")(function* () { + const webSocketConstructor = yield* Socket.WebSocketConstructor; + + const connect: RpcSessionFactory["Service"]["connect"] = Effect.fnUntraced(function* ( + connection: PreparedConnection, + ) { + yield* Effect.annotateCurrentSpan({ + "connection.environment.id": connection.environmentId, + }); - const connect: RpcSessionFactory["Service"]["connect"] = Effect.fnUntraced(function* ( - connection: PreparedConnection, - ) { - const connected = yield* Deferred.make(); - const disconnected = yield* Deferred.make(); - const hooks = RpcClient.ConnectionHooks.of({ - onConnect: Deferred.succeed(connected, undefined).pipe(Effect.asVoid), - onDisconnect: Deferred.isDone(connected).pipe( - Effect.flatMap((wasConnected) => - Deferred.fail( - disconnected, - new ConnectionTransientErrorClass({ - reason: "transport", - detail: wasConnected - ? `${connection.label} disconnected.` - : `${connection.label} could not establish a WebSocket connection.`, - }), - ), + const connected = yield* Deferred.make(); + const disconnected = yield* Deferred.make(); + const hooks = RpcClient.ConnectionHooks.of({ + onConnect: Deferred.succeed(connected, undefined).pipe(Effect.asVoid), + onDisconnect: Deferred.isDone(connected).pipe( + Effect.flatMap((wasConnected) => + Deferred.fail( + disconnected, + new ConnectionTransientError({ + reason: "transport", + detail: wasConnected + ? `${connection.label} disconnected.` + : `${connection.label} could not establish a WebSocket connection.`, + }), ), - Effect.asVoid, ), - }); - const socketLayer = Socket.layerWebSocket(connection.socketUrl, { - openTimeout: "15 seconds", - }).pipe(Layer.provide(Layer.succeed(Socket.WebSocketConstructor, webSocketConstructor))); - const protocolLayer = Layer.effect( - RpcClient.Protocol, - RpcClient.makeProtocolSocket({ - retryTransientErrors: false, - retryPolicy: Schedule.recurs(0), - }), - ).pipe( - Layer.provide( - Layer.mergeAll( - socketLayer, - RpcSerialization.layerJson, - Layer.succeed(RpcClient.ConnectionHooks, hooks), - ), + Effect.asVoid, + ), + }); + const socketLayer = Socket.layerWebSocket(connection.socketUrl, { + openTimeout: "15 seconds", + }).pipe(Layer.provide(Layer.succeed(Socket.WebSocketConstructor, webSocketConstructor))); + const protocolLayer = Layer.effect( + RpcClient.Protocol, + RpcClient.makeProtocolSocket({ + retryTransientErrors: false, + retryPolicy: Schedule.recurs(0), + }), + ).pipe( + Layer.provide( + Layer.mergeAll( + socketLayer, + RpcSerialization.layerJson, + Layer.succeed(RpcClient.ConnectionHooks, hooks), ), - ); - const protocolContext = yield* Layer.build(protocolLayer); - const client = yield* makeWsRpcProtocolClient.pipe(Effect.provide(protocolContext)); - const initialConfig = yield* Effect.cached( - client[WS_METHODS.serverGetConfig]({}).pipe(Effect.mapError(mapInitialConfigError)), - ); - const probe = client[WS_METHODS.serverGetConfig]({}).pipe( - Effect.mapError(mapInitialConfigError), + ), + ); + const protocolContext = yield* Layer.build(protocolLayer).pipe( + Effect.withSpan("environment.websocket.connect"), + ); + const client = yield* makeWsRpcProtocolClient.pipe(Effect.provide(protocolContext)); + const initialConfig = yield* Effect.cached( + client[WS_METHODS.serverGetConfig]({}).pipe( + catchSessionRpcErrors, + Effect.withSpan("environment.initialSync"), + ), + ); + const probe = initialConfig.pipe( + Effect.flatMap((config) => + Effect.gen(function* () { + if (config.environment.capabilities.connectionProbe === true) { + return yield* client[WS_METHODS.serverProbe]({}); + } + return yield* client[WS_METHODS.serverGetConfig]({}); + }).pipe(catchSessionRpcErrors), + ), + Effect.asVoid, + Effect.withSpan("clientRuntime.connection.rpcSession.probe"), + ); + + return { + client, + initialConfig, + ready: Deferred.await(connected).pipe( + Effect.andThen(initialConfig), Effect.asVoid, - ); + Effect.raceFirst(Deferred.await(disconnected)), + ), + probe, + closed: Deferred.await(disconnected), + } satisfies RpcSession; + }); - return { - client, - initialConfig, - ready: Deferred.await(connected).pipe( - Effect.andThen(initialConfig), - Effect.asVoid, - Effect.raceFirst(Deferred.await(disconnected)), - ), - probe, - closed: Deferred.await(disconnected), - } satisfies RpcSession; - }); + return RpcSessionFactory.of({ connect }); +}); - return RpcSessionFactory.of({ connect }); - }), -); +export const T3RpcSessionFactoryLive = Layer.effect(RpcSessionFactory, makeT3RpcSessionFactory()); -function mapInitialConfigError(error: InitialConfigError): ConnectionAttemptError { - if (Predicate.isTagged(error, "EnvironmentAuthorizationError")) { - return new ConnectionBlockedError({ - reason: "permission", - detail: error.message, - }); - } - if (Predicate.isTagged(error, "RpcClientError")) { - return new ConnectionTransientErrorClass({ - reason: "transport", - detail: error.message, - }); - } - return new ConnectionTransientErrorClass({ - reason: "remote-unavailable", - detail: error.message, - }); +function catchSessionRpcErrors( + effect: Effect.Effect, +): Effect.Effect { + return effect.pipe( + Effect.catchTags({ + EnvironmentAuthorizationError: (error) => + Effect.fail( + new ConnectionBlockedError({ + reason: "permission", + detail: error.message, + }), + ), + KeybindingsConfigParseError: (error) => + Effect.fail( + new ConnectionTransientError({ + reason: "remote-unavailable", + detail: error.message, + }), + ), + ServerSettingsError: (error) => + Effect.fail( + new ConnectionTransientError({ + reason: "remote-unavailable", + detail: error.message, + }), + ), + RpcClientError: (error) => + Effect.fail( + new ConnectionTransientError({ + reason: "transport", + detail: error.message, + }), + ), + }), + ); } diff --git a/src/rpc/ws-group.ts b/src/rpc/ws-group.ts deleted file mode 100644 index b218406..0000000 --- a/src/rpc/ws-group.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - EnvironmentAuthorizationError, - KeybindingsConfigError, - OrchestrationDispatchCommandError, - OrchestrationGetSnapshotError, - ServerConfig, - ServerProviders, - ServerSettingsError, - type TerminalError, - WS_METHODS, - WsSubscribeTerminalEventsRpc, - WsSubscribeTerminalMetadataRpc, - WsTerminalAttachRpc, - WsTerminalCloseRpc, - WsTerminalOpenRpc, - WsTerminalResizeRpc, - WsTerminalWriteRpc, - WsOrchestrationDispatchCommandRpc, - WsOrchestrationGetArchivedShellSnapshotRpc, - WsOrchestrationSubscribeShellRpc, - WsOrchestrationSubscribeThreadRpc, -} from "@t3tools/contracts"; -import * as Schema from "effect/Schema"; -import { Rpc, RpcGroup } from "effect/unstable/rpc"; - -export const FallbackServerConfig = Schema.Struct({ - providers: ServerProviders, -}); -export type FallbackServerConfig = typeof FallbackServerConfig.Type; - -export const CliServerConfig = Schema.Union([ServerConfig, FallbackServerConfig]); -export type CliServerConfig = typeof CliServerConfig.Type; - -export const WsServerGetConfigRpc = Rpc.make(WS_METHODS.serverGetConfig, { - payload: Schema.Struct({}), - success: CliServerConfig, - error: Schema.Union([KeybindingsConfigError, ServerSettingsError, EnvironmentAuthorizationError]), -}); - -export const CliWsRpcGroup = RpcGroup.make( - WsTerminalOpenRpc, - WsTerminalAttachRpc, - WsTerminalWriteRpc, - WsTerminalResizeRpc, - WsTerminalCloseRpc, - WsSubscribeTerminalEventsRpc, - WsSubscribeTerminalMetadataRpc, - WsOrchestrationDispatchCommandRpc, - WsOrchestrationGetArchivedShellSnapshotRpc, - WsOrchestrationSubscribeShellRpc, - WsOrchestrationSubscribeThreadRpc, - WsServerGetConfigRpc, -); - -export type CliRpcRequestError = - | EnvironmentAuthorizationError - | KeybindingsConfigError - | OrchestrationDispatchCommandError - | OrchestrationGetSnapshotError - | TerminalError - | ServerSettingsError;