chore(deps): update direct dependencies

This commit is contained in:
Peter Steinberger
2026-04-05 13:33:04 +01:00
parent 31f5463a1c
commit d70162864a
10 changed files with 651 additions and 140 deletions

View File

@@ -5,7 +5,7 @@
"description": "OpenClaw Amazon Bedrock provider plugin",
"type": "module",
"dependencies": {
"@aws-sdk/client-bedrock": "3.1022.0"
"@aws-sdk/client-bedrock": "3.1023.0"
},
"openclaw": {
"bundle": {

View File

@@ -4,7 +4,7 @@
"description": "OpenClaw Discord channel plugin",
"type": "module",
"dependencies": {
"@buape/carbon": "0.0.0-beta-20260327000044",
"@buape/carbon": "0.14.0",
"@discordjs/voice": "^0.19.2",
"discord-api-types": "^0.38.44",
"https-proxy-agent": "^9.0.0",

View File

@@ -9,6 +9,7 @@ import {
type ResolvedDiscordAccount,
} from "./accounts.js";
import { resolveDiscordProxyFetchForAccount } from "./proxy-fetch.js";
import { createDiscordRequestClient } from "./proxy-request-client.js";
import { createDiscordRetryRunner } from "./retry.js";
import type { DiscordRuntimeAccountContext } from "./send.types.js";
import { normalizeDiscordToken } from "./token.js";
@@ -78,7 +79,10 @@ function resolveRest(
return rest;
}
const resolvedProxyFetch = proxyFetch ?? resolveDiscordProxyFetchForAccount(account, cfg);
return new RequestClient(token, resolvedProxyFetch ? { fetch: resolvedProxyFetch } : undefined);
return createDiscordRequestClient(
token,
resolvedProxyFetch ? { fetch: resolvedProxyFetch } : undefined,
);
}
function resolveAccountWithoutToken(params: {

View File

@@ -12,6 +12,7 @@ import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/config-runtime";
import { danger } from "openclaw/plugin-sdk/runtime-env";
import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env";
import { createDiscordRequestClient } from "../proxy-request-client.js";
import type { DiscordGuildEntryResolved } from "./allow-list.js";
import { createDiscordAutoPresenceController } from "./auto-presence.js";
import type { DiscordDmPolicy } from "./dm-command-auth.js";
@@ -116,7 +117,6 @@ export function createDiscordMonitorClient(params: {
token: params.token,
autoDeploy: false,
eventQueue: eventQueueOpts,
...(params.proxyFetch ? { requestOptions: { fetch: params.proxyFetch } } : {}),
},
{
commands: params.commands,
@@ -126,6 +126,11 @@ export function createDiscordMonitorClient(params: {
},
clientPlugins,
);
if (params.proxyFetch) {
client.rest = createDiscordRequestClient(params.token, {
fetch: params.proxyFetch,
});
}
const gateway = client.getPlugin<GatewayPlugin>("gateway") as MutableDiscordGateway | undefined;
const gatewaySupervisor = params.createGatewaySupervisor({
gateway,

View File

@@ -0,0 +1,475 @@
import {
DiscordError,
RateLimitError,
RequestClient,
type DiscordRawError,
type RequestData,
type RequestClientOptions,
} from "@buape/carbon";
export type ProxyRequestClientOptions = RequestClientOptions & {
fetch?: typeof fetch;
};
type QueuedRequest = {
method: string;
path: string;
data?: RequestData;
query?: Record<string, string | number | boolean>;
resolve: (value?: unknown) => void;
reject: (reason?: unknown) => void;
routeKey: string;
};
type MultipartFile = {
data: unknown;
name: string;
description?: string;
};
type Attachment = {
id: number;
filename: string;
description?: string;
};
const defaultOptions: Required<Omit<RequestClientOptions, "baseUrl" | "tokenHeader">> & {
baseUrl: string;
tokenHeader: "Bot" | "Bearer";
} = {
tokenHeader: "Bot",
baseUrl: "https://discord.com/api",
apiVersion: 10,
userAgent: "DiscordBot (https://github.com/buape/carbon, v0.0.0)",
timeout: 15_000,
queueRequests: true,
maxQueueSize: 1000,
};
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null;
}
function getMultipartFiles(payload: unknown): MultipartFile[] {
if (!isRecord(payload)) {
return [];
}
const directFiles = payload.files;
if (Array.isArray(directFiles)) {
return directFiles as MultipartFile[];
}
const nestedData = payload.data;
if (!isRecord(nestedData)) {
return [];
}
const nestedFiles = nestedData.files;
return Array.isArray(nestedFiles) ? (nestedFiles as MultipartFile[]) : [];
}
function isMultipartPayload(payload: unknown): payload is Record<string, unknown> {
return getMultipartFiles(payload).length > 0;
}
function toRateLimitBody(parsedBody: unknown, rawBody: string, headers: Headers) {
if (isRecord(parsedBody)) {
const message = typeof parsedBody.message === "string" ? parsedBody.message : undefined;
const retryAfter =
typeof parsedBody.retry_after === "number" ? parsedBody.retry_after : undefined;
const global = typeof parsedBody.global === "boolean" ? parsedBody.global : undefined;
if (message !== undefined && retryAfter !== undefined && global !== undefined) {
return {
message,
retry_after: retryAfter,
global,
};
}
}
const retryAfterHeader = headers.get("Retry-After");
return {
message: typeof parsedBody === "string" ? parsedBody : rawBody || "You are being rate limited.",
retry_after:
retryAfterHeader && !Number.isNaN(Number(retryAfterHeader)) ? Number(retryAfterHeader) : 1,
global: headers.get("X-RateLimit-Scope") === "global",
};
}
function toDiscordErrorBody(parsedBody: unknown, rawBody: string): DiscordRawError {
if (isRecord(parsedBody) && typeof parsedBody.message === "string") {
return parsedBody as DiscordRawError;
}
return {
message: typeof parsedBody === "string" ? parsedBody : rawBody || "Discord request failed",
};
}
function toBlobPart(value: unknown): BlobPart {
if (value instanceof ArrayBuffer || typeof value === "string") {
return value;
}
if (ArrayBuffer.isView(value)) {
const copied = new Uint8Array(value.byteLength);
copied.set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));
return copied;
}
if (value instanceof Blob) {
return value;
}
return String(value);
}
// Carbon 0.14 removed the custom fetch seam from RequestClientOptions.
// Keep a local proxy-aware clone so Discord proxy config still works on OpenClaw.
class ProxyRequestClientCompat {
readonly options: ProxyRequestClientOptions;
readonly customFetch?: typeof fetch;
protected queue: QueuedRequest[] = [];
private readonly token: string;
private abortController: AbortController | null = null;
private processingQueue = false;
private readonly routeBuckets = new Map<string, string>();
private readonly bucketStates = new Map<string, number>();
private globalRateLimitUntil = 0;
constructor(token: string, options?: ProxyRequestClientOptions) {
this.token = token;
this.options = {
...defaultOptions,
...options,
};
this.customFetch = options?.fetch;
}
async get(path: string, query?: QueuedRequest["query"]): Promise<unknown> {
return await this.request("GET", path, { query });
}
async post(path: string, data?: RequestData, query?: QueuedRequest["query"]): Promise<unknown> {
return await this.request("POST", path, { data, query });
}
async patch(path: string, data?: RequestData, query?: QueuedRequest["query"]): Promise<unknown> {
return await this.request("PATCH", path, { data, query });
}
async put(path: string, data?: RequestData, query?: QueuedRequest["query"]): Promise<unknown> {
return await this.request("PUT", path, { data, query });
}
async delete(path: string, data?: RequestData, query?: QueuedRequest["query"]): Promise<unknown> {
return await this.request("DELETE", path, { data, query });
}
clearQueue(): void {
this.queue.length = 0;
}
get queueSize(): number {
return this.queue.length;
}
abortAllRequests(): void {
this.abortController?.abort();
this.abortController = null;
}
private async request(
method: string,
path: string,
params: Pick<QueuedRequest, "data" | "query">,
): Promise<unknown> {
const routeKey = this.getRouteKey(method, path);
if (this.options.queueRequests) {
if (
typeof this.options.maxQueueSize === "number" &&
this.options.maxQueueSize > 0 &&
this.queue.length >= this.options.maxQueueSize
) {
const stats = this.queue.reduce(
(acc, item) => {
const count = (acc.counts.get(item.routeKey) ?? 0) + 1;
acc.counts.set(item.routeKey, count);
if (count > acc.topCount) {
acc.topCount = count;
acc.topRoute = item.routeKey;
}
return acc;
},
{
counts: new Map([[routeKey, 1]]),
topRoute: routeKey,
topCount: 1,
},
);
throw new Error(
`Request queue is full (${this.queue.length} / ${this.options.maxQueueSize}), you should implement a queuing system in your requests or raise the queue size in Carbon. Top offender: ${stats.topRoute}`,
);
}
return await new Promise((resolve, reject) => {
this.queue.push({
method,
path,
data: params.data,
query: params.query,
resolve,
reject,
routeKey,
});
void this.processQueue();
});
}
return await new Promise((resolve, reject) => {
void this.executeRequest({
method,
path,
data: params.data,
query: params.query,
resolve,
reject,
routeKey,
})
.then(resolve)
.catch(reject);
});
}
private async executeRequest(request: QueuedRequest): Promise<unknown> {
const { method, path, data, query, routeKey } = request;
await this.waitForBucket(routeKey);
const queryString = query
? `?${Object.entries(query)
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
.join("&")}`
: "";
const url = `${this.options.baseUrl}${path}${queryString}`;
const headers =
this.token === "webhook"
? new Headers()
: new Headers({
Authorization: `${this.options.tokenHeader} ${this.token}`,
});
if (data?.headers) {
for (const [key, value] of Object.entries(data.headers)) {
headers.set(key, value);
}
}
this.abortController = new AbortController();
const timeoutMs =
typeof this.options.timeout === "number" && this.options.timeout > 0
? this.options.timeout
: undefined;
let body: BodyInit | undefined;
if (data?.body && isMultipartPayload(data.body)) {
const payload = data.body;
const normalizedBody: Record<string, unknown> & { attachments: Attachment[] } =
typeof payload === "string"
? { content: payload, attachments: [] }
: { ...payload, attachments: [] };
const formData = new FormData();
const files = getMultipartFiles(payload);
for (const [index, file] of files.entries()) {
const normalizedFileData =
file.data instanceof Blob ? file.data : new Blob([toBlobPart(file.data)]);
formData.append(`files[${index}]`, normalizedFileData, file.name);
normalizedBody.attachments.push({
id: index,
filename: file.name,
description: file.description,
});
}
const cleanedBody = {
...normalizedBody,
files: undefined,
};
formData.append("payload_json", JSON.stringify(cleanedBody));
body = formData;
} else if (data?.body != null) {
headers.set("Content-Type", "application/json");
body = data.rawBody ? (data.body as BodyInit) : JSON.stringify(data.body);
}
let timeoutId: ReturnType<typeof setTimeout> | undefined;
if (timeoutMs !== undefined) {
timeoutId = setTimeout(() => {
this.abortController?.abort();
}, timeoutMs);
}
let response: Response;
try {
response = await (this.customFetch ?? globalThis.fetch)(url, {
method,
headers,
body,
signal: this.abortController.signal,
});
} finally {
if (timeoutId) {
clearTimeout(timeoutId);
}
}
let rawBody = "";
let parsedBody: unknown;
try {
rawBody = await response.text();
} catch {
rawBody = "";
}
if (rawBody.length > 0) {
try {
parsedBody = JSON.parse(rawBody);
} catch {
parsedBody = undefined;
}
}
if (response.status === 429) {
const rateLimitBody = toRateLimitBody(parsedBody, rawBody, response.headers);
const rateLimitError = new RateLimitError(response, rateLimitBody);
this.scheduleRateLimit(
routeKey,
rateLimitError.retryAfter,
rateLimitError.scope === "global",
);
throw rateLimitError;
}
this.updateBucketFromHeaders(routeKey, response.headers);
if (!response.ok) {
throw new DiscordError(response, toDiscordErrorBody(parsedBody, rawBody));
}
return parsedBody ?? rawBody;
}
private async processQueue(): Promise<void> {
if (this.processingQueue) {
return;
}
this.processingQueue = true;
try {
while (this.queue.length > 0) {
const request = this.queue.shift();
if (!request) {
continue;
}
try {
const result = await this.executeRequest(request);
request.resolve(result);
} catch (error) {
if (error instanceof RateLimitError && this.options.queueRequests) {
this.queue.unshift(request);
continue;
}
request.reject(error);
}
}
} finally {
this.processingQueue = false;
}
}
private async waitForBucket(routeKey: string): Promise<void> {
while (true) {
const now = Date.now();
if (this.globalRateLimitUntil > now) {
await new Promise((resolve) => setTimeout(resolve, this.globalRateLimitUntil - now));
continue;
}
const bucketKey = this.routeBuckets.get(routeKey);
const bucketUntil = bucketKey ? (this.bucketStates.get(bucketKey) ?? 0) : 0;
if (bucketUntil > now) {
await new Promise((resolve) => setTimeout(resolve, bucketUntil - now));
continue;
}
return;
}
}
private scheduleRateLimit(routeKey: string, retryAfterSeconds: number, global: boolean): void {
const resetAt = Date.now() + Math.ceil(retryAfterSeconds * 1000);
if (global) {
this.globalRateLimitUntil = Math.max(this.globalRateLimitUntil, resetAt);
return;
}
const bucketKey = this.routeBuckets.get(routeKey) ?? routeKey;
this.routeBuckets.set(routeKey, bucketKey);
this.bucketStates.set(bucketKey, Math.max(this.bucketStates.get(bucketKey) ?? 0, resetAt));
}
private updateBucketFromHeaders(routeKey: string, headers: Headers): void {
const bucket = headers.get("X-RateLimit-Bucket");
const retryAfter = headers.get("X-RateLimit-Reset-After");
const remaining = headers.get("X-RateLimit-Remaining");
const resetAfterSeconds = retryAfter ? Number(retryAfter) : Number.NaN;
const remainingRequests = remaining ? Number(remaining) : Number.NaN;
if (!bucket) {
return;
}
this.routeBuckets.set(routeKey, bucket);
if (!Number.isFinite(resetAfterSeconds) || !Number.isFinite(remainingRequests)) {
if (!this.bucketStates.has(bucket)) {
this.bucketStates.set(bucket, 0);
}
return;
}
if (remainingRequests <= 0) {
this.bucketStates.set(bucket, Date.now() + Math.ceil(resetAfterSeconds * 1000));
return;
}
this.bucketStates.set(bucket, 0);
}
private getMajorParameter(path: string): string | null {
const guildMatch = path.match(/^\/guilds\/(\d+)/);
if (guildMatch?.[1]) {
return guildMatch[1];
}
const channelMatch = path.match(/^\/channels\/(\d+)/);
if (channelMatch?.[1]) {
return channelMatch[1];
}
const webhookMatch = path.match(/^\/webhooks\/(\d+)(?:\/([^/]+))?/);
if (webhookMatch) {
const [, id, token] = webhookMatch;
return token ? `${id}/${token}` : (id ?? null);
}
return null;
}
private getRouteKey(method: string, path: string): string {
return `${method.toUpperCase()}:${this.getBucketKey(path)}`;
}
private getBucketKey(path: string): string {
const majorParameter = this.getMajorParameter(path);
const normalizedPath = path
.replace(/\?.*$/, "")
.replace(/\/\d{17,20}(?=\/|$)/g, "/:id")
.replace(/\/reactions\/[^/]+/g, "/reactions/:reaction");
return majorParameter ? `${normalizedPath}:${majorParameter}` : normalizedPath;
}
}
export function createDiscordRequestClient(
token: string,
options?: ProxyRequestClientOptions,
): RequestClient {
if (!options?.fetch) {
return new RequestClient(token, options);
}
return new ProxyRequestClientCompat(token, options) as unknown as RequestClient;
}

View File

@@ -4,8 +4,8 @@
"description": "OpenClaw Tlon/Urbit channel plugin",
"type": "module",
"dependencies": {
"@aws-sdk/client-s3": "3.1022.0",
"@aws-sdk/s3-request-presigner": "3.1022.0",
"@aws-sdk/client-s3": "3.1023.0",
"@aws-sdk/s3-request-presigner": "3.1023.0",
"@tloncorp/tlon-skill": "0.3.2",
"@urbit/aura": "^3.0.0"
},

View File

@@ -4,9 +4,9 @@
"description": "OpenClaw Twitch channel plugin",
"type": "module",
"dependencies": {
"@twurple/api": "^8.1.2",
"@twurple/auth": "^8.1.2",
"@twurple/chat": "^8.1.2"
"@twurple/api": "^8.1.3",
"@twurple/auth": "^8.1.3",
"@twurple/chat": "^8.1.3"
},
"openclaw": {
"extensions": [

View File

@@ -4,7 +4,7 @@
"description": "OpenClaw Zalo channel plugin",
"type": "module",
"dependencies": {
"undici": "8.0.0"
"undici": "8.0.1"
},
"devDependencies": {
"openclaw": "workspace:*"

View File

@@ -1088,7 +1088,7 @@
"dependencies": {
"@agentclientprotocol/sdk": "0.18.0",
"@anthropic-ai/vertex-sdk": "^0.14.4",
"@aws-sdk/client-bedrock": "3.1022.0",
"@aws-sdk/client-bedrock": "3.1023.0",
"@clack/prompts": "^1.2.0",
"@homebridge/ciao": "^1.3.6",
"@line/bot-sdk": "^10.6.0",
@@ -1129,7 +1129,7 @@
"sqlite-vec": "0.1.9",
"tar": "7.5.13",
"tslog": "^4.10.2",
"undici": "^8.0.0",
"undici": "^8.0.1",
"uuid": "^13.0.0",
"ws": "^8.20.0",
"yaml": "^2.8.3",
@@ -1141,7 +1141,7 @@
"@lit/context": "^1.1.6",
"@types/express": "^5.0.6",
"@types/markdown-it": "^14.1.2",
"@types/node": "^25.5.0",
"@types/node": "^25.5.2",
"@types/qrcode-terminal": "^0.12.2",
"@types/ws": "^8.18.1",
"@typescript/native-preview": "7.0.0-dev.20260404.1",

281
pnpm-lock.yaml generated
View File

@@ -37,8 +37,8 @@ importers:
specifier: ^0.14.4
version: 0.14.4(zod@4.3.6)
'@aws-sdk/client-bedrock':
specifier: 3.1022.0
version: 3.1022.0
specifier: 3.1023.0
version: 3.1023.0
'@clack/prompts':
specifier: ^1.2.0
version: 1.2.0
@@ -166,8 +166,8 @@ importers:
specifier: ^4.10.2
version: 4.10.2
undici:
specifier: ^8.0.0
version: 8.0.0
specifier: ^8.0.1
version: 8.0.1
uuid:
specifier: ^13.0.0
version: 13.0.0
@@ -197,8 +197,8 @@ importers:
specifier: ^14.1.2
version: 14.1.2
'@types/node':
specifier: ^25.5.0
version: 25.5.0
specifier: ^25.5.2
version: 25.5.2
'@types/qrcode-terminal':
specifier: ^0.12.2
version: 0.12.2
@@ -210,7 +210,7 @@ importers:
version: 7.0.0-dev.20260404.1
'@vitest/coverage-v8':
specifier: ^4.1.2
version: 4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)
version: 4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)
jscpd:
specifier: 4.0.8
version: 4.0.8
@@ -246,7 +246,7 @@ importers:
version: 6.0.2
vitest:
specifier: ^4.1.2
version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
optionalDependencies:
'@matrix-org/matrix-sdk-crypto-nodejs':
specifier: ^0.4.0
@@ -264,8 +264,10 @@ importers:
extensions/amazon-bedrock:
dependencies:
'@aws-sdk/client-bedrock':
specifier: 3.1022.0
version: 3.1022.0
specifier: 3.1023.0
version: 3.1023.0
extensions/amazon-bedrock-mantle: {}
extensions/anthropic: {}
@@ -347,8 +349,8 @@ importers:
extensions/discord:
dependencies:
'@buape/carbon':
specifier: 0.0.0-beta-20260327000044
version: 0.0.0-beta-20260327000044(@discordjs/opus@0.10.0)(hono@4.12.10)(opusscript@0.1.1)
specifier: 0.14.0
version: 0.14.0(@discordjs/opus@0.10.0)(hono@4.12.10)(opusscript@0.1.1)
'@discordjs/voice':
specifier: ^0.19.2
version: 0.19.2(@discordjs/opus@0.10.0)(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(opusscript@0.1.1)
@@ -392,6 +394,8 @@ importers:
extensions/firecrawl: {}
extensions/fireworks: {}
extensions/github-copilot: {}
extensions/google: {}
@@ -632,11 +636,11 @@ importers:
extensions/tlon:
dependencies:
'@aws-sdk/client-s3':
specifier: 3.1022.0
version: 3.1022.0
specifier: 3.1023.0
version: 3.1023.0
'@aws-sdk/s3-request-presigner':
specifier: 3.1022.0
version: 3.1022.0
specifier: 3.1023.0
version: 3.1023.0
'@tloncorp/tlon-skill':
specifier: 0.3.2
version: 0.3.2
@@ -653,14 +657,14 @@ importers:
extensions/twitch:
dependencies:
'@twurple/api':
specifier: ^8.1.2
version: 8.1.2(@twurple/auth@8.1.2)
specifier: ^8.1.3
version: 8.1.3(@twurple/auth@8.1.3)
'@twurple/auth':
specifier: ^8.1.2
version: 8.1.2
specifier: ^8.1.3
version: 8.1.3
'@twurple/chat':
specifier: ^8.1.2
version: 8.1.2(@twurple/auth@8.1.2)
specifier: ^8.1.3
version: 8.1.3(@twurple/auth@8.1.3)
extensions/venice: {}
@@ -710,8 +714,8 @@ importers:
extensions/zalo:
dependencies:
undici:
specifier: 8.0.0
version: 8.0.0
specifier: 8.0.1
version: 8.0.1
devDependencies:
openclaw:
specifier: workspace:*
@@ -766,7 +770,7 @@ importers:
devDependencies:
'@vitest/browser-playwright':
specifier: 4.1.2
version: 4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
version: 4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
jsdom:
specifier: ^29.0.1
version: 29.0.1(@noble/hashes@2.0.1)
@@ -775,10 +779,10 @@ importers:
version: 1.59.1
vite:
specifier: 8.0.3
version: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
version: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vitest:
specifier: 4.1.2
version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
version: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
packages:
@@ -842,12 +846,12 @@ packages:
resolution: {integrity: sha512-gT8+ebNzmLjk07dPTVn0f4ZdEDSFYsyCX3rAxX2QGGOasKeeQQEBW4PxYqHGM6lJrcuFSc/ScSVKTRDxGZlFiA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/client-bedrock@3.1022.0':
resolution: {integrity: sha512-iuCuyItz3kU8ZIfV0SHcWAowSsRRLhEZ3NZQZ0QFaQI5D6sVZuZjX3IpdSm4FewReshQFq85jtLRFS9Sopwh4A==}
'@aws-sdk/client-bedrock@3.1023.0':
resolution: {integrity: sha512-FmHGUYqToT7rsbeLukagUcYoAM22/ZxInkK+duVpZBmpu2D9cIoLIp5n/bKPjds3cw/8YTZKZt16kF2vJ6KbXA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/client-s3@3.1022.0':
resolution: {integrity: sha512-PhdIW0LxjzcMlBiCldRefnyZk84wtYGnEV0sNGOD55DZTvZsibG2XHvQiL1aFliKugfAhuIpNmFkctI2n2I3Dg==}
'@aws-sdk/client-s3@3.1023.0':
resolution: {integrity: sha512-IvNy49sdoCWd3fgHQxail3y0UQdfKj1Xk0VPu9HTwlog60o9Lmp5ykjZ2LlIuHEPaxq4Siih707GB/ulUWgetw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.973.26':
@@ -950,8 +954,8 @@ packages:
resolution: {integrity: sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/s3-request-presigner@3.1022.0':
resolution: {integrity: sha512-2arKiJswYGEOScAhEeOuy/1A1wScfgbfmU/6NAn0UK0/LDxqsOTc4/bCEuUK+/LtB+Lxu3rODqbY8V5gTGPLaQ==}
'@aws-sdk/s3-request-presigner@3.1023.0':
resolution: {integrity: sha512-SGC/9cctIEgDQpqsStntTyGRI8bLL/mqZ4Dh54ggrLnwza20uhpVPPxV6omem0Es3362/7UGDGe0Pa+QQPCiDQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/signature-v4-multi-region@3.996.15':
@@ -966,6 +970,10 @@ packages:
resolution: {integrity: sha512-rC0+QQh5uo9Y0wtrvsVuGWi8njtf6h6FB94h5NClUoiNTuQiRG/+AjXiqhv1x/m8TnLrgYCHiFzykOdOb5Ea9w==}
engines: {node: '>=20.0.0'}
'@aws-sdk/token-providers@3.1023.0':
resolution: {integrity: sha512-g/t814ec7g+MbazONIdQzb0c8FalVnSKCLc665GLG4QdrviKXHzag7HQmf5wBhCDsUDNAIi77fLeElaZSkylTA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/types@3.973.6':
resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==}
engines: {node: '>=20.0.0'}
@@ -1070,8 +1078,8 @@ packages:
resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
hasBin: true
'@buape/carbon@0.0.0-beta-20260327000044':
resolution: {integrity: sha512-jaGrh83aOFuCaRlN6bgYZqiY/srOwP28XBPBcaonW2qjzQl/Or5KWCkqE36AWpzPdy26PDhIeBdmHMAGc7xLzg==}
'@buape/carbon@0.14.0':
resolution: {integrity: sha512-mavllPK2iVpRNRtC4C8JOUdJ1hdV0+LDelFW+pjpJaM31MBLMfIJ+f/LlYTIK5QrEcQsXOC+6lU2e0gmgjWhIQ==}
'@cacheable/memory@2.0.8':
resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==}
@@ -3280,8 +3288,8 @@ packages:
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
'@swc/helpers@0.5.20':
resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==}
'@swc/helpers@0.5.21':
resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==}
'@telegraf/types@7.1.0':
resolution: {integrity: sha512-kGevOIbpMcIlCDeorKGpwZmdH7kHbqlk/Yj6dEpJMKEQw5lk0KVQY0OLXaCswy8GqlIVLd5625OB+rAntP9xVw==}
@@ -3336,24 +3344,24 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
'@twurple/api-call@8.1.2':
resolution: {integrity: sha512-lIGBcqIbL/5sji9nDZ5tdThIi6okgglTIzYn+himcZvxGEKntwj+kaCXKFHklAC5DFMr7k8PP3mxY3IzH2lHFA==}
'@twurple/api-call@8.1.3':
resolution: {integrity: sha512-eKIoIRHyPsyJwCOpofE+/J+C5O+bPnxtq3bPUzMsS4EzZOF268WocbkaKLW1Fh3tepyxj3TvTNxEvKA6jbJr0A==}
'@twurple/api@8.1.2':
resolution: {integrity: sha512-6XEm0cpQo5MpAIWUOCfjzglvLQYM4GdWcGkvomH0uPeGPUiu/kwoC47N4Ug/ZaGzH8DY9GV1rkxQn/L1M8RxoQ==}
'@twurple/api@8.1.3':
resolution: {integrity: sha512-DTa/VX+h7kciDz3ZBQmrpVy1nPIepRMv4BtldaXKfDERlXRQBt4V2d6KfNn/hdUkRkxJ2Xi8x4PfBFE79VSrBw==}
peerDependencies:
'@twurple/auth': 8.1.2
'@twurple/auth': 8.1.3
'@twurple/auth@8.1.2':
resolution: {integrity: sha512-oicwUnHZu9VkPhSIv3ODhJyrL8x7zX9ZyP1vRhPYmuw+Uqn9nR2KgmtchapjVkjLF0hvLLtxx1287YHDFTK3og==}
'@twurple/auth@8.1.3':
resolution: {integrity: sha512-UklOtXzQUnZskFsvt3h3kmkjXsILqNXe4NCMR1SYPicsYVnVMElS1uMiVI/H5mzJhVR5MFx5wQQyI15b5YtBxw==}
'@twurple/chat@8.1.2':
resolution: {integrity: sha512-+AvgfeFRFRrpBX3mscxP0742xY0j2SOi1Cz3ggH1pR0Ln+32roiwicHTxXr4RJEGCAxHMKYR8Q6WueTpls1KbQ==}
'@twurple/chat@8.1.3':
resolution: {integrity: sha512-BTamweCTlv8Bdkx1um0dSn0sDXBm3CX4js0GbatWPsX6mrMWljny2pQgIj+PSkTtHfsR4fmGEIayAticEydxnQ==}
peerDependencies:
'@twurple/auth': 8.1.2
'@twurple/auth': 8.1.3
'@twurple/common@8.1.2':
resolution: {integrity: sha512-U0mKLKe4w4Nqdnsiz3s1un11y+yJcc76y0IErzImajNcDKsAEJvNDPnm2BahSlP2MAueotugP8EwUXcs1MmP9Q==}
'@twurple/common@8.1.3':
resolution: {integrity: sha512-B2BT42fJAEYqSPGjTd6qyZoUv6kgFzIvUJuTIrOUcBiJxcvZh8tD+WLRd5xfMKhtLbUFgesYlHxdPhmdar8/zw==}
'@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
@@ -3361,8 +3369,8 @@ packages:
'@types/body-parser@1.19.6':
resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
'@types/bun@1.3.9':
resolution: {integrity: sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw==}
'@types/bun@1.3.6':
resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==}
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
@@ -3430,15 +3438,18 @@ packages:
'@types/node@16.9.1':
resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==}
'@types/node@20.19.37':
resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==}
'@types/node@20.19.39':
resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==}
'@types/node@24.12.0':
resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==}
'@types/node@24.12.2':
resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==}
'@types/node@25.5.0':
resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==}
'@types/node@25.5.2':
resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==}
'@types/qrcode-terminal@0.12.2':
resolution: {integrity: sha512-v+RcIEJ+Uhd6ygSQ0u5YYY7ZM+la7GgPbs0V/7l/kFs2uO4S8BcIUEMoP7za4DNIqNnUD5npf0A/7kBhrCKG5Q==}
@@ -3888,8 +3899,8 @@ packages:
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
bun-types@1.3.9:
resolution: {integrity: sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg==}
bun-types@1.3.6:
resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==}
bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
@@ -5533,8 +5544,8 @@ packages:
partial-json@0.1.7:
resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==}
path-expression-matcher@1.2.0:
resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==}
path-expression-matcher@1.2.1:
resolution: {integrity: sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==}
engines: {node: '>=14.0.0'}
path-is-absolute@1.0.1:
@@ -6361,8 +6372,8 @@ packages:
resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==}
engines: {node: '>=20.18.1'}
undici@8.0.0:
resolution: {integrity: sha512-RGabV5g1ggSX5mU4k+B8BLWgb418gDbg0wAVFeiU00iOxtw4ufGsE6GFsuSd2uqOKooWSLf71JGapOFYpE8f+A==}
undici@8.0.1:
resolution: {integrity: sha512-6qdTUr+jabXmYKeYkv/+pIvO7d0bs1k9uy+5PFnXr4segNVwILH1KExhwRh3/iGa6gSLmySK3hTnSs3k7ZPnjQ==}
engines: {node: '>=22.19.0'}
unhomoglyph@1.0.6:
@@ -6829,7 +6840,7 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/client-bedrock@3.1022.0':
'@aws-sdk/client-bedrock@3.1023.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
@@ -6840,7 +6851,7 @@ snapshots:
'@aws-sdk/middleware-recursion-detection': 3.972.9
'@aws-sdk/middleware-user-agent': 3.972.28
'@aws-sdk/region-config-resolver': 3.972.10
'@aws-sdk/token-providers': 3.1022.0
'@aws-sdk/token-providers': 3.1023.0
'@aws-sdk/types': 3.973.6
'@aws-sdk/util-endpoints': 3.996.5
'@aws-sdk/util-user-agent-browser': 3.972.8
@@ -6874,7 +6885,7 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/client-s3@3.1022.0':
'@aws-sdk/client-s3@3.1023.0':
dependencies:
'@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0
@@ -7234,7 +7245,7 @@ snapshots:
'@smithy/types': 4.13.1
tslib: 2.8.1
'@aws-sdk/s3-request-presigner@3.1022.0':
'@aws-sdk/s3-request-presigner@3.1023.0':
dependencies:
'@aws-sdk/signature-v4-multi-region': 3.996.15
'@aws-sdk/types': 3.973.6
@@ -7278,6 +7289,18 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/token-providers@3.1023.0':
dependencies:
'@aws-sdk/core': 3.973.26
'@aws-sdk/nested-clients': 3.996.18
'@aws-sdk/types': 3.973.6
'@smithy/property-provider': 4.2.12
'@smithy/shared-ini-file-loader': 4.4.7
'@smithy/types': 4.13.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/types@3.973.6':
dependencies:
'@smithy/types': 4.13.1
@@ -7385,15 +7408,15 @@ snapshots:
dependencies:
css-tree: 3.2.1
'@buape/carbon@0.0.0-beta-20260327000044(@discordjs/opus@0.10.0)(hono@4.12.10)(opusscript@0.1.1)':
'@buape/carbon@0.14.0(@discordjs/opus@0.10.0)(hono@4.12.10)(opusscript@0.1.1)':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
discord-api-types: 0.38.37
optionalDependencies:
'@cloudflare/workers-types': 4.20260120.0
'@discordjs/voice': 0.19.0(@discordjs/opus@0.10.0)(opusscript@0.1.1)
'@hono/node-server': 1.19.10(hono@4.12.10)
'@types/bun': 1.3.9
'@types/bun': 1.3.6
'@types/ws': 8.18.1
ws: 8.19.0
transitivePeerDependencies:
@@ -7484,7 +7507,7 @@ snapshots:
'@d-fischer/logger': 4.2.4
'@d-fischer/shared-utils': 3.6.4
'@d-fischer/typed-event-emitter': 3.3.3
'@types/node': 20.19.37
'@types/node': 20.19.39
'@types/ws': 8.18.1
tslib: 2.8.1
ws: 8.20.0
@@ -7553,7 +7576,7 @@ snapshots:
discord-api-types: 0.38.44
prism-media: 1.3.5(@discordjs/opus@0.10.0)(opusscript@0.1.1)
tslib: 2.8.1
ws: 8.20.0
ws: 8.19.0
transitivePeerDependencies:
- '@discordjs/opus'
- bufferutil
@@ -8179,7 +8202,7 @@ snapshots:
'@line/bot-sdk@10.6.0':
dependencies:
'@types/node': 24.12.0
'@types/node': 24.12.2
optionalDependencies:
axios: 1.13.6
transitivePeerDependencies:
@@ -9184,14 +9207,14 @@ snapshots:
'@slack/logger@4.0.1':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
'@slack/oauth@3.0.5':
dependencies:
'@slack/logger': 4.0.1
'@slack/web-api': 7.15.0
'@types/jsonwebtoken': 9.0.10
'@types/node': 25.5.0
'@types/node': 25.5.2
jsonwebtoken: 9.0.3
transitivePeerDependencies:
- debug
@@ -9200,7 +9223,7 @@ snapshots:
dependencies:
'@slack/logger': 4.0.1
'@slack/web-api': 7.15.0
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/ws': 8.18.1
eventemitter3: 5.0.4
ws: 8.20.0
@@ -9629,7 +9652,7 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
'@swc/helpers@0.5.20':
'@swc/helpers@0.5.21':
dependencies:
tslib: 2.8.1
@@ -9676,13 +9699,13 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {}
'@twurple/api-call@8.1.2':
'@twurple/api-call@8.1.3':
dependencies:
'@d-fischer/shared-utils': 3.6.4
'@twurple/common': 8.1.2
'@twurple/common': 8.1.3
tslib: 2.8.1
'@twurple/api@8.1.2(@twurple/auth@8.1.2)':
'@twurple/api@8.1.3(@twurple/auth@8.1.3)':
dependencies:
'@d-fischer/cache-decorators': 4.0.1
'@d-fischer/detect-node': 3.0.1
@@ -9690,22 +9713,22 @@ snapshots:
'@d-fischer/rate-limiter': 1.1.0
'@d-fischer/shared-utils': 3.6.4
'@d-fischer/typed-event-emitter': 3.3.3
'@twurple/api-call': 8.1.2
'@twurple/auth': 8.1.2
'@twurple/common': 8.1.2
'@twurple/api-call': 8.1.3
'@twurple/auth': 8.1.3
'@twurple/common': 8.1.3
retry: 0.13.1
tslib: 2.8.1
'@twurple/auth@8.1.2':
'@twurple/auth@8.1.3':
dependencies:
'@d-fischer/logger': 4.2.4
'@d-fischer/shared-utils': 3.6.4
'@d-fischer/typed-event-emitter': 3.3.3
'@twurple/api-call': 8.1.2
'@twurple/common': 8.1.2
'@twurple/api-call': 8.1.3
'@twurple/common': 8.1.3
tslib: 2.8.1
'@twurple/chat@8.1.2(@twurple/auth@8.1.2)':
'@twurple/chat@8.1.3(@twurple/auth@8.1.3)':
dependencies:
'@d-fischer/cache-decorators': 4.0.1
'@d-fischer/deprecate': 2.0.2
@@ -9713,15 +9736,15 @@ snapshots:
'@d-fischer/rate-limiter': 1.1.0
'@d-fischer/shared-utils': 3.6.4
'@d-fischer/typed-event-emitter': 3.3.3
'@twurple/auth': 8.1.2
'@twurple/common': 8.1.2
'@twurple/auth': 8.1.3
'@twurple/common': 8.1.3
ircv3: 0.33.1
tslib: 2.8.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@twurple/common@8.1.2':
'@twurple/common@8.1.3':
dependencies:
'@d-fischer/shared-utils': 3.6.4
klona: 2.0.6
@@ -9735,11 +9758,11 @@ snapshots:
'@types/body-parser@1.19.6':
dependencies:
'@types/connect': 3.4.38
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/bun@1.3.9':
'@types/bun@1.3.6':
dependencies:
bun-types: 1.3.9
bun-types: 1.3.6
optional: true
'@types/chai@5.2.3':
@@ -9753,7 +9776,7 @@ snapshots:
'@types/connect@3.4.38':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/deep-eql@4.0.2': {}
@@ -9763,7 +9786,7 @@ snapshots:
'@types/express-serve-static-core@5.1.1':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/qs': 6.15.0
'@types/range-parser': 1.2.7
'@types/send': 1.2.1
@@ -9785,7 +9808,7 @@ snapshots:
'@types/jsonwebtoken@9.0.10':
dependencies:
'@types/ms': 2.1.0
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/linkify-it@5.0.0': {}
@@ -9810,11 +9833,11 @@ snapshots:
'@types/node@16.9.1': {}
'@types/node@20.19.37':
'@types/node@20.19.39':
dependencies:
undici-types: 6.21.0
'@types/node@24.12.0':
'@types/node@24.12.2':
dependencies:
undici-types: 7.16.0
@@ -9822,6 +9845,10 @@ snapshots:
dependencies:
undici-types: 7.18.2
'@types/node@25.5.2':
dependencies:
undici-types: 7.18.2
'@types/qrcode-terminal@0.12.2': {}
'@types/qs@6.15.0': {}
@@ -9834,12 +9861,12 @@ snapshots:
'@types/send@1.2.1':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/serve-static@2.2.0':
dependencies:
'@types/http-errors': 2.0.5
'@types/node': 25.5.0
'@types/node': 25.5.2
'@types/trusted-types@2.0.7': {}
@@ -9851,7 +9878,7 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
optional: true
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20260404.1':
@@ -9889,29 +9916,29 @@ snapshots:
'@urbit/aura@3.0.0': {}
'@vitest/browser-playwright@4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)':
'@vitest/browser-playwright@4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)':
dependencies:
'@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
playwright: 1.59.1
tinyrainbow: 3.1.0
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
'@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)':
'@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)':
dependencies:
'@blazediff/core': 1.9.1
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/utils': 4.1.2
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.0
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
ws: 8.20.0
transitivePeerDependencies:
- bufferutil
@@ -9919,7 +9946,7 @@ snapshots:
- utf-8-validate
- vite
'@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)':
'@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.1.2
@@ -9931,9 +9958,9 @@ snapshots:
obug: 2.1.1
std-env: 4.0.0
tinyrainbow: 3.1.0
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
vitest: 4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
optionalDependencies:
'@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
'@vitest/browser': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
'@vitest/expect@4.1.2':
dependencies:
@@ -9944,13 +9971,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
'@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
'@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.1.2
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
'@vitest/pretty-format@4.1.2':
dependencies:
@@ -10100,10 +10127,10 @@ snapshots:
apache-arrow@18.1.0:
dependencies:
'@swc/helpers': 0.5.20
'@swc/helpers': 0.5.21
'@types/command-line-args': 5.2.3
'@types/command-line-usage': 5.0.4
'@types/node': 20.19.37
'@types/node': 20.19.39
command-line-args: 5.2.1
command-line-usage: 7.0.4
flatbuffers: 24.12.23
@@ -10300,9 +10327,9 @@ snapshots:
buffer-from@1.1.2: {}
bun-types@1.3.9:
bun-types@1.3.6:
dependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
optional: true
bytes@3.1.2: {}
@@ -10802,12 +10829,12 @@ snapshots:
fast-xml-builder@1.1.4:
dependencies:
path-expression-matcher: 1.2.0
path-expression-matcher: 1.2.1
fast-xml-parser@5.5.7:
dependencies:
fast-xml-builder: 1.1.4
path-expression-matcher: 1.2.0
path-expression-matcher: 1.2.1
strnum: 2.2.2
fastq@1.20.1:
@@ -12149,7 +12176,7 @@ snapshots:
partial-json@0.1.7: {}
path-expression-matcher@1.2.0: {}
path-expression-matcher@1.2.1: {}
path-is-absolute@1.0.1:
optional: true
@@ -12283,7 +12310,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 25.5.0
'@types/node': 25.5.2
long: 5.3.2
proxy-addr@2.0.7:
@@ -13086,7 +13113,7 @@ snapshots:
undici@7.24.7: {}
undici@8.0.0: {}
undici@8.0.1: {}
unhomoglyph@1.0.6: {}
@@ -13159,7 +13186,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3):
vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.4
@@ -13167,7 +13194,7 @@ snapshots:
rolldown: 1.0.0-rc.12(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.5.0
'@types/node': 25.5.2
esbuild: 0.27.4
fsevents: 2.3.3
jiti: 2.6.1
@@ -13177,10 +13204,10 @@ snapshots:
- '@emnapi/core'
- '@emnapi/runtime'
vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)):
vitest@4.1.2(@opentelemetry/api@1.9.1)(@types/node@25.5.2)(@vitest/browser-playwright@4.1.2)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.2
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/pretty-format': 4.1.2
'@vitest/runner': 4.1.2
'@vitest/snapshot': 4.1.2
@@ -13197,12 +13224,12 @@ snapshots:
tinyexec: 1.0.4
tinyglobby: 0.2.15
tinyrainbow: 3.1.0
vite: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
vite: 8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)
why-is-node-running: 2.3.0
optionalDependencies:
'@opentelemetry/api': 1.9.1
'@types/node': 25.5.0
'@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
'@types/node': 25.5.2
'@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.3(@emnapi/core@1.8.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)
jsdom: 29.0.1(@noble/hashes@2.0.1)
transitivePeerDependencies:
- msw