diff --git a/extensions/matrix-js/index.ts b/extensions/matrix-js/index.ts index 87cff7712ce..59fcc309505 100644 --- a/extensions/matrix-js/index.ts +++ b/extensions/matrix-js/index.ts @@ -1,6 +1,12 @@ -import type { OpenClawPluginApi } from "openclaw/plugin-sdk"; +import type { GatewayRequestHandlerOptions, OpenClawPluginApi } from "openclaw/plugin-sdk"; import { emptyPluginConfigSchema } from "openclaw/plugin-sdk"; import { matrixPlugin } from "./src/channel.js"; +import { registerMatrixJsCli } from "./src/cli.js"; +import { + bootstrapMatrixVerification, + getMatrixVerificationStatus, + verifyMatrixRecoveryKey, +} from "./src/matrix/actions/verification.js"; import { setMatrixRuntime } from "./src/runtime.js"; const plugin = { @@ -11,6 +17,78 @@ const plugin = { register(api: OpenClawPluginApi) { setMatrixRuntime(api.runtime); api.registerChannel({ plugin: matrixPlugin }); + + const sendError = (respond: (ok: boolean, payload?: unknown) => void, err: unknown) => { + respond(false, { error: err instanceof Error ? err.message : String(err) }); + }; + + api.registerGatewayMethod( + "matrix-js.verify.recoveryKey", + async ({ params, respond }: GatewayRequestHandlerOptions) => { + try { + const key = typeof params?.key === "string" ? params.key : ""; + if (!key.trim()) { + respond(false, { error: "key required" }); + return; + } + const accountId = + typeof params?.accountId === "string" + ? params.accountId.trim() || undefined + : undefined; + const result = await verifyMatrixRecoveryKey(key, { accountId }); + respond(result.success, result); + } catch (err) { + sendError(respond, err); + } + }, + ); + + api.registerGatewayMethod( + "matrix-js.verify.bootstrap", + async ({ params, respond }: GatewayRequestHandlerOptions) => { + try { + const accountId = + typeof params?.accountId === "string" + ? params.accountId.trim() || undefined + : undefined; + const recoveryKey = + typeof params?.recoveryKey === "string" ? params.recoveryKey : undefined; + const forceResetCrossSigning = params?.forceResetCrossSigning === true; + const result = await bootstrapMatrixVerification({ + accountId, + recoveryKey, + forceResetCrossSigning, + }); + respond(result.success, result); + } catch (err) { + sendError(respond, err); + } + }, + ); + + api.registerGatewayMethod( + "matrix-js.verify.status", + async ({ params, respond }: GatewayRequestHandlerOptions) => { + try { + const accountId = + typeof params?.accountId === "string" + ? params.accountId.trim() || undefined + : undefined; + const includeRecoveryKey = params?.includeRecoveryKey === true; + const status = await getMatrixVerificationStatus({ accountId, includeRecoveryKey }); + respond(true, status); + } catch (err) { + sendError(respond, err); + } + }, + ); + + api.registerCli( + ({ program }) => { + registerMatrixJsCli({ program }); + }, + { commands: ["matrix-js"] }, + ); }, }; diff --git a/extensions/matrix-js/src/cli.ts b/extensions/matrix-js/src/cli.ts new file mode 100644 index 00000000000..9e39771e936 --- /dev/null +++ b/extensions/matrix-js/src/cli.ts @@ -0,0 +1,154 @@ +import type { Command } from "commander"; +import { + bootstrapMatrixVerification, + getMatrixVerificationStatus, + verifyMatrixRecoveryKey, +} from "./matrix/actions/verification.js"; + +function printVerificationStatus(status: { + verified: boolean; + userId: string | null; + deviceId: string | null; + backupVersion: string | null; + recoveryKeyStored: boolean; + recoveryKeyCreatedAt: string | null; + pendingVerifications: number; +}): void { + if (status.verified) { + console.log("Verified: yes"); + console.log(`User: ${status.userId ?? "unknown"}`); + console.log(`Device: ${status.deviceId ?? "unknown"}`); + if (status.backupVersion) { + console.log(`Backup version: ${status.backupVersion}`); + } + } else { + console.log("Verified: no"); + console.log(`User: ${status.userId ?? "unknown"}`); + console.log(`Device: ${status.deviceId ?? "unknown"}`); + console.log("Run 'openclaw matrix-js verify recovery-key ' to verify this device."); + } + console.log(`Recovery key stored: ${status.recoveryKeyStored ? "yes" : "no"}`); + if (status.recoveryKeyCreatedAt) { + console.log(`Recovery key created at: ${status.recoveryKeyCreatedAt}`); + } + console.log(`Pending verifications: ${status.pendingVerifications}`); +} + +export function registerMatrixJsCli(params: { program: Command }): void { + const root = params.program + .command("matrix-js") + .description("Matrix-js channel utilities") + .addHelpText("after", () => "\nDocs: https://docs.openclaw.ai/channels/matrix\n"); + + const verify = root.command("verify").description("Device verification for Matrix E2EE"); + + verify + .command("status") + .description("Check Matrix-js device verification status") + .option("--account ", "Account ID (for multi-account setups)") + .option("--include-recovery-key", "Include stored recovery key in output") + .option("--json", "Output as JSON") + .action(async (options: { account?: string; includeRecoveryKey?: boolean; json?: boolean }) => { + try { + const status = await getMatrixVerificationStatus({ + accountId: options.account, + includeRecoveryKey: options.includeRecoveryKey === true, + }); + if (options.json) { + console.log(JSON.stringify(status, null, 2)); + return; + } + printVerificationStatus(status); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (options.json) { + console.log(JSON.stringify({ error: message }, null, 2)); + } else { + console.error(`Error: ${message}`); + } + process.exitCode = 1; + } + }); + + verify + .command("bootstrap") + .description("Bootstrap Matrix-js cross-signing and device verification state") + .option("--account ", "Account ID (for multi-account setups)") + .option("--recovery-key ", "Recovery key to apply before bootstrap") + .option("--force-reset-cross-signing", "Force reset cross-signing identity before bootstrap") + .option("--json", "Output as JSON") + .action( + async (options: { + account?: string; + recoveryKey?: string; + forceResetCrossSigning?: boolean; + json?: boolean; + }) => { + try { + const result = await bootstrapMatrixVerification({ + accountId: options.account, + recoveryKey: options.recoveryKey, + forceResetCrossSigning: options.forceResetCrossSigning === true, + }); + if (options.json) { + console.log(JSON.stringify(result, null, 2)); + return; + } + console.log(`Bootstrap success: ${result.success ? "yes" : "no"}`); + if (result.error) { + console.log(`Error: ${result.error}`); + } + console.log(`Verified: ${result.verification.verified ? "yes" : "no"}`); + console.log(`User: ${result.verification.userId ?? "unknown"}`); + console.log(`Device: ${result.verification.deviceId ?? "unknown"}`); + console.log( + `Cross-signing published: ${result.crossSigning.published ? "yes" : "no"} (master=${result.crossSigning.masterKeyPublished ? "yes" : "no"}, self=${result.crossSigning.selfSigningKeyPublished ? "yes" : "no"}, user=${result.crossSigning.userSigningKeyPublished ? "yes" : "no"})`, + ); + console.log(`Pending verifications: ${result.pendingVerifications}`); + if (!result.success) { + process.exitCode = 1; + } + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (options.json) { + console.log(JSON.stringify({ success: false, error: message }, null, 2)); + } else { + console.error(`Verification bootstrap failed: ${message}`); + } + process.exitCode = 1; + } + }, + ); + + verify + .command("recovery-key ") + .description("Verify device using a Matrix recovery key") + .option("--account ", "Account ID (for multi-account setups)") + .option("--json", "Output as JSON") + .action(async (key: string, options: { account?: string; json?: boolean }) => { + try { + const result = await verifyMatrixRecoveryKey(key, { accountId: options.account }); + if (options.json) { + console.log(JSON.stringify(result, null, 2)); + } else if (result.success) { + console.log("Device verification completed successfully."); + console.log(`User: ${result.userId ?? "unknown"}`); + console.log(`Device: ${result.deviceId ?? "unknown"}`); + if (result.backupVersion) { + console.log(`Backup version: ${result.backupVersion}`); + } + } else { + console.error(`Verification failed: ${result.error ?? "unknown error"}`); + process.exitCode = 1; + } + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + if (options.json) { + console.log(JSON.stringify({ success: false, error: message }, null, 2)); + } else { + console.error(`Verification failed: ${message}`); + } + process.exitCode = 1; + } + }); +} diff --git a/extensions/matrix-js/src/matrix/actions.ts b/extensions/matrix-js/src/matrix/actions.ts index 5614ff92f9d..86eeb7f8865 100644 --- a/extensions/matrix-js/src/matrix/actions.ts +++ b/extensions/matrix-js/src/matrix/actions.ts @@ -13,17 +13,20 @@ export { listMatrixReactions, removeMatrixReactions } from "./actions/reactions. export { pinMatrixMessage, unpinMatrixMessage, listMatrixPins } from "./actions/pins.js"; export { getMatrixMemberInfo, getMatrixRoomInfo } from "./actions/room.js"; export { + bootstrapMatrixVerification, acceptMatrixVerification, cancelMatrixVerification, confirmMatrixVerificationReciprocateQr, confirmMatrixVerificationSas, generateMatrixVerificationQr, getMatrixEncryptionStatus, + getMatrixVerificationStatus, getMatrixVerificationSas, listMatrixVerifications, mismatchMatrixVerificationSas, requestMatrixVerification, scanMatrixVerificationQr, startMatrixVerification, + verifyMatrixRecoveryKey, } from "./actions/verification.js"; export { reactMatrixMessage } from "./send.js"; diff --git a/extensions/matrix-js/src/matrix/actions/verification.ts b/extensions/matrix-js/src/matrix/actions/verification.ts index d4f0564e03c..6150428d2f0 100644 --- a/extensions/matrix-js/src/matrix/actions/verification.ts +++ b/extensions/matrix-js/src/matrix/actions/verification.ts @@ -5,7 +5,9 @@ function requireCrypto( client: import("../sdk.js").MatrixClient, ): NonNullable { if (!client.crypto) { - throw new Error("Matrix encryption is not available (enable channels.matrix.encryption=true)"); + throw new Error( + "Matrix encryption is not available (enable channels.matrix-js.encryption=true)", + ); } return client.crypto; } @@ -218,3 +220,61 @@ export async function getMatrixEncryptionStatus( } } } + +export async function getMatrixVerificationStatus( + opts: MatrixActionClientOpts & { includeRecoveryKey?: boolean } = {}, +) { + const { client, stopOnDone } = await resolveActionClient(opts); + try { + const status = await client.getOwnDeviceVerificationStatus(); + const payload = { + ...status, + pendingVerifications: client.crypto ? (await client.crypto.listVerifications()).length : 0, + }; + if (!opts.includeRecoveryKey) { + return payload; + } + const recoveryKey = client.crypto ? await client.crypto.getRecoveryKey() : null; + return { + ...payload, + recoveryKey: recoveryKey?.encodedPrivateKey ?? null, + }; + } finally { + if (stopOnDone) { + client.stop(); + } + } +} + +export async function verifyMatrixRecoveryKey( + recoveryKey: string, + opts: MatrixActionClientOpts = {}, +) { + const { client, stopOnDone } = await resolveActionClient(opts); + try { + return await client.verifyWithRecoveryKey(recoveryKey); + } finally { + if (stopOnDone) { + client.stop(); + } + } +} + +export async function bootstrapMatrixVerification( + opts: MatrixActionClientOpts & { + recoveryKey?: string; + forceResetCrossSigning?: boolean; + } = {}, +) { + const { client, stopOnDone } = await resolveActionClient(opts); + try { + return await client.bootstrapOwnDeviceVerification({ + recoveryKey: opts.recoveryKey?.trim() || undefined, + forceResetCrossSigning: opts.forceResetCrossSigning === true, + }); + } finally { + if (stopOnDone) { + client.stop(); + } + } +} diff --git a/extensions/matrix-js/src/matrix/monitor/auto-join.test.ts b/extensions/matrix-js/src/matrix/monitor/auto-join.test.ts index 74670becc72..8af091ba394 100644 --- a/extensions/matrix-js/src/matrix/monitor/auto-join.test.ts +++ b/extensions/matrix-js/src/matrix/monitor/auto-join.test.ts @@ -41,7 +41,7 @@ describe("registerMatrixAutoJoin", () => { const { client, getInviteHandler, joinRoom } = createClientStub(); const cfg: CoreConfig = { channels: { - matrix: { + "matrix-js": { autoJoin: "always", }, }, @@ -71,7 +71,7 @@ describe("registerMatrixAutoJoin", () => { }); const cfg: CoreConfig = { channels: { - matrix: { + "matrix-js": { autoJoin: "allowlist", autoJoinAllowlist: ["#allowed:example.org"], }, @@ -102,7 +102,7 @@ describe("registerMatrixAutoJoin", () => { }); const cfg: CoreConfig = { channels: { - matrix: { + "matrix-js": { autoJoin: "allowlist", autoJoinAllowlist: [" #allowed:example.org "], }, diff --git a/extensions/matrix-js/src/matrix/monitor/auto-join.ts b/extensions/matrix-js/src/matrix/monitor/auto-join.ts index 37bf3b27c6d..8077df1f322 100644 --- a/extensions/matrix-js/src/matrix/monitor/auto-join.ts +++ b/extensions/matrix-js/src/matrix/monitor/auto-join.ts @@ -16,9 +16,9 @@ export function registerMatrixAutoJoin(params: { } runtime.log?.(message); }; - const autoJoin = cfg.channels?.matrix?.autoJoin ?? "always"; + const autoJoin = cfg.channels?.["matrix-js"]?.autoJoin ?? "always"; const autoJoinAllowlist = new Set( - (cfg.channels?.matrix?.autoJoinAllowlist ?? []) + (cfg.channels?.["matrix-js"]?.autoJoinAllowlist ?? []) .map((entry) => String(entry).trim()) .filter(Boolean), ); diff --git a/extensions/matrix-js/src/matrix/monitor/events.ts b/extensions/matrix-js/src/matrix/monitor/events.ts index 3608991da16..7cce564c65d 100644 --- a/extensions/matrix-js/src/matrix/monitor/events.ts +++ b/extensions/matrix-js/src/matrix/monitor/events.ts @@ -75,7 +75,7 @@ export function registerMatrixMonitorEvents(params: { if (auth.encryption !== true && !warnedEncryptedRooms.has(roomId)) { warnedEncryptedRooms.add(roomId); const warning = - "matrix: encrypted event received without encryption enabled; set channels.matrix.encryption=true and verify the device to decrypt"; + "matrix: encrypted event received without encryption enabled; set channels.matrix-js.encryption=true and verify the device to decrypt"; logger.warn({ roomId }, warning); } if (auth.encryption === true && !client.crypto && !warnedCryptoMissingRooms.has(roomId)) { diff --git a/extensions/matrix-js/src/matrix/monitor/handler.ts b/extensions/matrix-js/src/matrix/monitor/handler.ts index da4a5d9c33f..797d8eb0ae5 100644 --- a/extensions/matrix-js/src/matrix/monitor/handler.ts +++ b/extensions/matrix-js/src/matrix/monitor/handler.ts @@ -234,10 +234,10 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam const senderName = await getMemberDisplayName(roomId, senderId); const storeAllowFrom = await core.channel.pairing - .readAllowFromStore("matrix") + .readAllowFromStore("matrix-js") .catch(() => []); const effectiveAllowFrom = normalizeMatrixAllowList([...allowFrom, ...storeAllowFrom]); - const groupAllowFrom = cfg.channels?.matrix?.groupAllowFrom ?? []; + const groupAllowFrom = cfg.channels?.["matrix-js"]?.groupAllowFrom ?? []; const effectiveGroupAllowFrom = normalizeMatrixAllowList(groupAllowFrom); const groupAllowConfigured = effectiveGroupAllowFrom.length > 0; @@ -254,7 +254,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam if (!allowMatch.allowed) { if (dmPolicy === "pairing") { const { code, created } = await core.channel.pairing.upsertPairingRequest({ - channel: "matrix", + channel: "matrix-js", id: senderId, meta: { name: senderName }, }); @@ -271,7 +271,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam `Pairing code: ${code}`, "", "Ask the bot owner to approve with:", - "openclaw pairing approve matrix ", + "openclaw pairing approve matrix-js ", ].join("\n"), { client }, ); @@ -375,7 +375,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam }); const allowTextCommands = core.channel.commands.shouldHandleTextCommands({ cfg, - surface: "matrix", + surface: "matrix-js", }); const useAccessGroups = cfg.commands?.useAccessGroups !== false; const senderAllowedForCommands = resolveMatrixAllowListMatches({ @@ -410,7 +410,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam if (isRoom && commandGate.shouldBlock) { logInboundDrop({ log: logVerboseMessage, - channel: "matrix", + channel: "matrix-js", reason: "control command (unauthorized)", target: senderId, }); @@ -451,7 +451,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam const route = core.channel.routing.resolveAgentRoute({ cfg, - channel: "matrix", + channel: "matrix-js", peer: { kind: isDirectMessage ? "dm" : "channel", id: isDirectMessage ? senderId : roomId, @@ -493,8 +493,8 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam GroupSubject: isRoom ? (roomName ?? roomId) : undefined, GroupChannel: isRoom ? (roomInfo.canonicalAlias ?? roomId) : undefined, GroupSystemPrompt: isRoom ? groupSystemPrompt : undefined, - Provider: "matrix" as const, - Surface: "matrix" as const, + Provider: "matrix-js" as const, + Surface: "matrix-js" as const, WasMentioned: isRoom ? wasMentioned : undefined, MessageSid: messageId, ReplyToId: threadTarget ? undefined : (replyToEventId ?? undefined), @@ -506,7 +506,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam ...locationPayload?.context, CommandAuthorized: commandAuthorized, CommandSource: "text" as const, - OriginatingChannel: "matrix" as const, + OriginatingChannel: "matrix-js" as const, OriginatingTo: `room:${roomId}`, }); @@ -517,7 +517,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam updateLastRoute: isDirectMessage ? { sessionKey: route.mainSessionKey, - channel: "matrix", + channel: "matrix-js", to: `room:${roomId}`, accountId: route.accountId, } @@ -576,13 +576,13 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam let didSendReply = false; const tableMode = core.channel.text.resolveMarkdownTableMode({ cfg, - channel: "matrix", + channel: "matrix-js", accountId: route.accountId, }); const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({ cfg, agentId: route.agentId, - channel: "matrix", + channel: "matrix-js", accountId: route.accountId, }); const typingCallbacks = createTypingCallbacks({ @@ -591,7 +591,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam onStartError: (err) => { logTypingFailure({ log: logVerboseMessage, - channel: "matrix", + channel: "matrix-js", action: "start", target: roomId, error: err, @@ -600,7 +600,7 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam onStopError: (err) => { logTypingFailure({ log: logVerboseMessage, - channel: "matrix", + channel: "matrix-js", action: "stop", target: roomId, error: err, diff --git a/extensions/matrix-js/src/matrix/monitor/index.ts b/extensions/matrix-js/src/matrix/monitor/index.ts index 8e4b1ba1c64..b263113346c 100644 --- a/extensions/matrix-js/src/matrix/monitor/index.ts +++ b/extensions/matrix-js/src/matrix/monitor/index.ts @@ -43,7 +43,7 @@ export async function monitorMatrixProvider(opts: MonitorMatrixOpts = {}): Promi } const core = getMatrixRuntime(); let cfg = core.config.loadConfig() as CoreConfig; - if (cfg.channels?.matrix?.enabled === false) { + if (cfg.channels?.["matrix-js"]?.enabled === false) { return; } @@ -220,10 +220,10 @@ export async function monitorMatrixProvider(opts: MonitorMatrixOpts = {}): Promi ...cfg, channels: { ...cfg.channels, - matrix: { - ...cfg.channels?.matrix, + "matrix-js": { + ...cfg.channels?.["matrix-js"], dm: { - ...cfg.channels?.matrix?.dm, + ...cfg.channels?.["matrix-js"]?.dm, allowFrom, }, groupAllowFrom, @@ -253,13 +253,13 @@ export async function monitorMatrixProvider(opts: MonitorMatrixOpts = {}): Promi const defaultGroupPolicy = resolveDefaultGroupPolicy(cfg); const { groupPolicy: groupPolicyRaw, providerMissingFallbackApplied } = resolveAllowlistProviderRuntimeGroupPolicy({ - providerConfigPresent: cfg.channels?.matrix !== undefined, + providerConfigPresent: cfg.channels?.["matrix-js"] !== undefined, groupPolicy: accountConfig.groupPolicy, defaultGroupPolicy, }); warnMissingProviderGroupPolicyFallbackOnce({ providerMissingFallbackApplied, - providerKey: "matrix", + providerKey: "matrix-js", accountId: account.accountId, blockedLabel: GROUP_POLICY_BLOCKED_LABEL.room, log: (message) => logVerboseMessage(message), @@ -271,7 +271,7 @@ export async function monitorMatrixProvider(opts: MonitorMatrixOpts = {}): Promi const dmEnabled = dmConfig?.enabled ?? true; const dmPolicyRaw = dmConfig?.policy ?? "pairing"; const dmPolicy = allowlistOnly && dmPolicyRaw !== "disabled" ? "allowlist" : dmPolicyRaw; - const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "matrix"); + const textLimit = core.channel.text.resolveTextChunkLimit(cfg, "matrix-js"); const mediaMaxMb = opts.mediaMaxMb ?? accountConfig.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB; const mediaMaxBytes = Math.max(1, mediaMaxMb) * 1024 * 1024; const startupMs = Date.now(); @@ -329,18 +329,19 @@ export async function monitorMatrixProvider(opts: MonitorMatrixOpts = {}): Promi // Shared client is already started via resolveSharedMatrixClient. logger.info(`matrix: logged in as ${auth.userId}`); - // If E2EE is enabled, trigger device verification + // If E2EE is enabled, report device verification status and guidance. if (auth.encryption && client.crypto) { try { - // Request verification from other sessions - const verificationRequest = await ( - client.crypto as { requestOwnUserVerification?: () => Promise } - ).requestOwnUserVerification?.(); - if (verificationRequest) { - logger.info("matrix: device verification requested - please verify in another client"); + const status = await client.getOwnDeviceVerificationStatus(); + if (status.verified) { + logger.info("matrix: device is verified and ready for encrypted rooms"); + } else { + logger.info( + "matrix: device not verified — run 'openclaw matrix-js verify recovery-key ' to enable E2EE", + ); } } catch (err) { - logger.debug?.("Device verification request failed (may already be verified)", { + logger.debug?.("Failed to resolve matrix-js verification status (non-fatal)", { error: String(err), }); } diff --git a/extensions/matrix-js/src/matrix/monitor/replies.ts b/extensions/matrix-js/src/matrix/monitor/replies.ts index 575f472f403..cdbd98322e2 100644 --- a/extensions/matrix-js/src/matrix/monitor/replies.ts +++ b/extensions/matrix-js/src/matrix/monitor/replies.ts @@ -20,7 +20,7 @@ export async function deliverMatrixReplies(params: { params.tableMode ?? core.channel.text.resolveMarkdownTableMode({ cfg, - channel: "matrix", + channel: "matrix-js", accountId: params.accountId, }); const logVerbose = (message: string) => { @@ -29,7 +29,7 @@ export async function deliverMatrixReplies(params: { } }; const chunkLimit = Math.min(params.textLimit, 4000); - const chunkMode = core.channel.text.resolveChunkMode(cfg, "matrix", params.accountId); + const chunkMode = core.channel.text.resolveChunkMode(cfg, "matrix-js", params.accountId); let hasReplied = false; for (const reply of params.replies) { const hasMedia = Boolean(reply?.mediaUrl) || (reply?.mediaUrls?.length ?? 0) > 0; diff --git a/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.test.ts b/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.test.ts index a0f79bff94d..95d88f7b8b9 100644 --- a/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.test.ts +++ b/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.test.ts @@ -98,6 +98,25 @@ describe("MatrixCryptoBootstrapper", () => { ); }); + it("fails in strict mode when cross-signing keys are still unpublished", async () => { + const deps = createBootstrapperDeps(); + const crypto = createCryptoApi({ + bootstrapCrossSigning: vi.fn(async () => {}), + isCrossSigningReady: vi.fn(async () => false), + userHasCrossSigningKeys: vi.fn(async () => false), + getDeviceVerificationStatus: vi.fn(async () => ({ + isVerified: () => true, + })), + }); + const bootstrapper = new MatrixCryptoBootstrapper( + deps as unknown as MatrixCryptoBootstrapperDeps, + ); + + await expect(bootstrapper.bootstrap(crypto, { strict: true })).rejects.toThrow( + "Cross-signing bootstrap finished but server keys are still not published", + ); + }); + it("uses password UIA fallback when null and dummy auth fail", async () => { const deps = createBootstrapperDeps(); const bootstrapCrossSigning = vi.fn(async () => {}); diff --git a/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.ts b/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.ts index e1207b06116..6c756aa32d9 100644 --- a/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.ts +++ b/extensions/matrix-js/src/matrix/sdk/crypto-bootstrap.ts @@ -22,15 +22,38 @@ export type MatrixCryptoBootstrapperDeps = { decryptBridge: Pick, "bindCryptoRetrySignals">; }; +export type MatrixCryptoBootstrapOptions = { + forceResetCrossSigning?: boolean; + strict?: boolean; +}; + +export type MatrixCryptoBootstrapResult = { + crossSigningReady: boolean; + crossSigningPublished: boolean; + ownDeviceVerified: boolean | null; +}; + export class MatrixCryptoBootstrapper { constructor(private readonly deps: MatrixCryptoBootstrapperDeps) {} - async bootstrap(crypto: MatrixCryptoBootstrapApi): Promise { - await this.bootstrapSecretStorage(crypto); - await this.bootstrapCrossSigning(crypto); - await this.bootstrapSecretStorage(crypto); - await this.ensureOwnDeviceTrust(crypto); + async bootstrap( + crypto: MatrixCryptoBootstrapApi, + options: MatrixCryptoBootstrapOptions = {}, + ): Promise { + const strict = options.strict === true; + await this.bootstrapSecretStorage(crypto, strict); + const crossSigning = await this.bootstrapCrossSigning(crypto, { + forceResetCrossSigning: options.forceResetCrossSigning === true, + strict, + }); + await this.bootstrapSecretStorage(crypto, strict); + const ownDeviceVerified = await this.ensureOwnDeviceTrust(crypto, strict); this.registerVerificationRequestHandler(crypto); + return { + crossSigningReady: crossSigning.ready, + crossSigningPublished: crossSigning.published, + ownDeviceVerified, + }; } private createSigningKeysUiAuthCallback(params: { @@ -47,7 +70,7 @@ export class MatrixCryptoBootstrapper { } catch { if (!params.password?.trim()) { throw new Error( - "Matrix cross-signing key upload requires UIA; provide matrix.password for m.login.password fallback", + "Matrix cross-signing key upload requires UIA; provide matrix-js.password for m.login.password fallback", ); } return await makeRequest({ @@ -60,7 +83,10 @@ export class MatrixCryptoBootstrapper { }; } - private async bootstrapCrossSigning(crypto: MatrixCryptoBootstrapApi): Promise { + private async bootstrapCrossSigning( + crypto: MatrixCryptoBootstrapApi, + options: { forceResetCrossSigning: boolean; strict: boolean }, + ): Promise<{ ready: boolean; published: boolean }> { const userId = await this.deps.getUserId(); const authUploadDeviceSigningKeys = this.createSigningKeysUiAuthCallback({ userId, @@ -87,6 +113,37 @@ export class MatrixCryptoBootstrapper { } }; + const finalize = async (): Promise<{ ready: boolean; published: boolean }> => { + const ready = await isCrossSigningReady(); + const published = await hasPublishedCrossSigningKeys(); + if (ready && published) { + LogService.info("MatrixClientLite", "Cross-signing bootstrap complete"); + return { ready, published }; + } + const message = "Cross-signing bootstrap finished but server keys are still not published"; + LogService.warn("MatrixClientLite", message); + if (options.strict) { + throw new Error(message); + } + return { ready, published }; + }; + + if (options.forceResetCrossSigning) { + try { + await crypto.bootstrapCrossSigning({ + setupNewCrossSigning: true, + authUploadDeviceSigningKeys, + }); + } catch (err) { + LogService.warn("MatrixClientLite", "Forced cross-signing reset failed:", err); + if (options.strict) { + throw err instanceof Error ? err : new Error(String(err)); + } + return { ready: false, published: false }; + } + return await finalize(); + } + // First pass: preserve existing cross-signing identity and ensure public keys are uploaded. try { await crypto.bootstrapCrossSigning({ @@ -105,7 +162,10 @@ export class MatrixCryptoBootstrapper { }); } catch (resetErr) { LogService.warn("MatrixClientLite", "Failed to bootstrap cross-signing:", resetErr); - return; + if (options.strict) { + throw resetErr instanceof Error ? resetErr : new Error(String(resetErr)); + } + return { ready: false, published: false }; } } @@ -113,7 +173,7 @@ export class MatrixCryptoBootstrapper { const firstPassPublished = await hasPublishedCrossSigningKeys(); if (firstPassReady && firstPassPublished) { LogService.info("MatrixClientLite", "Cross-signing bootstrap complete"); - return; + return { ready: true, published: true }; } // Fallback: recover from broken local/server state by creating a fresh identity. @@ -124,27 +184,27 @@ export class MatrixCryptoBootstrapper { }); } catch (err) { LogService.warn("MatrixClientLite", "Fallback cross-signing bootstrap failed:", err); - return; + if (options.strict) { + throw err instanceof Error ? err : new Error(String(err)); + } + return { ready: false, published: false }; } - const finalReady = await isCrossSigningReady(); - const finalPublished = await hasPublishedCrossSigningKeys(); - if (finalReady && finalPublished) { - LogService.info("MatrixClientLite", "Cross-signing bootstrap complete"); - return; - } - LogService.warn( - "MatrixClientLite", - "Cross-signing bootstrap finished but server keys are still not published", - ); + return await finalize(); } - private async bootstrapSecretStorage(crypto: MatrixCryptoBootstrapApi): Promise { + private async bootstrapSecretStorage( + crypto: MatrixCryptoBootstrapApi, + strict = false, + ): Promise { try { await this.deps.recoveryKeyStore.bootstrapSecretStorageWithRecoveryKey(crypto); LogService.info("MatrixClientLite", "Secret storage bootstrap complete"); } catch (err) { LogService.warn("MatrixClientLite", "Failed to bootstrap secret storage:", err); + if (strict) { + throw err instanceof Error ? err : new Error(String(err)); + } } } @@ -188,10 +248,13 @@ export class MatrixCryptoBootstrapper { LogService.info("MatrixClientLite", "Verification request handler registered"); } - private async ensureOwnDeviceTrust(crypto: MatrixCryptoBootstrapApi): Promise { + private async ensureOwnDeviceTrust( + crypto: MatrixCryptoBootstrapApi, + strict = false, + ): Promise { const deviceId = this.deps.getDeviceId()?.trim(); if (!deviceId) { - return; + return null; } const userId = await this.deps.getUserId(); @@ -206,7 +269,7 @@ export class MatrixCryptoBootstrapper { deviceStatus?.signedByOwner === true; if (alreadyVerified) { - return; + return true; } if (typeof crypto.setDeviceVerified === "function") { @@ -222,5 +285,19 @@ export class MatrixCryptoBootstrapper { await crypto.crossSignDevice(deviceId); } } + + const refreshedStatus = + typeof crypto.getDeviceVerificationStatus === "function" + ? await crypto.getDeviceVerificationStatus(userId, deviceId).catch(() => null) + : null; + const verified = + refreshedStatus?.isVerified?.() === true || + refreshedStatus?.localVerified === true || + refreshedStatus?.crossSigningVerified === true || + refreshedStatus?.signedByOwner === true; + if (!verified && strict) { + throw new Error(`Matrix own device ${deviceId} is not verified after bootstrap`); + } + return verified; } } diff --git a/extensions/matrix-js/src/matrix/sdk/idb-persistence.ts b/extensions/matrix-js/src/matrix/sdk/idb-persistence.ts index edaff65a1fd..d6e355ca212 100644 --- a/extensions/matrix-js/src/matrix/sdk/idb-persistence.ts +++ b/extensions/matrix-js/src/matrix/sdk/idb-persistence.ts @@ -124,7 +124,7 @@ function resolveDefaultIdbSnapshotPath(): string { process.env.OPENCLAW_STATE_DIR || process.env.MOLTBOT_STATE_DIR || path.join(process.env.HOME || "/tmp", ".openclaw"); - return path.join(stateDir, "credentials", "matrix", "crypto-idb-snapshot.json"); + return path.join(stateDir, "credentials", "matrix-js", "crypto-idb-snapshot.json"); } export async function restoreIdbFromDisk(snapshotPath?: string): Promise { diff --git a/extensions/matrix-js/src/matrix/sdk/recovery-key-store.test.ts b/extensions/matrix-js/src/matrix/sdk/recovery-key-store.test.ts index e16f3c50ebc..060ad8d989d 100644 --- a/extensions/matrix-js/src/matrix/sdk/recovery-key-store.test.ts +++ b/extensions/matrix-js/src/matrix/sdk/recovery-key-store.test.ts @@ -1,6 +1,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; +import { encodeRecoveryKey } from "matrix-js-sdk/lib/crypto-api/recovery-key.js"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { MatrixRecoveryKeyStore } from "./recovery-key-store.js"; import type { MatrixCryptoBootstrapApi } from "./types.js"; @@ -173,4 +174,29 @@ describe("MatrixRecoveryKeyStore", () => { encodedPrivateKey: "encoded-recovered-key", }); }); + + it("stores an encoded recovery key and decodes its private key material", () => { + const recoveryKeyPath = createTempRecoveryKeyPath(); + const store = new MatrixRecoveryKeyStore(recoveryKeyPath); + const encoded = encodeRecoveryKey(new Uint8Array(Array.from({ length: 32 }, (_, i) => i + 1))); + expect(encoded).toBeTypeOf("string"); + + const summary = store.storeEncodedRecoveryKey({ + encodedPrivateKey: encoded as string, + keyId: "SSSSKEY", + }); + + expect(summary.keyId).toBe("SSSSKEY"); + expect(summary.encodedPrivateKey).toBe(encoded); + const persisted = JSON.parse(fs.readFileSync(recoveryKeyPath, "utf8")) as { + privateKeyBase64?: string; + keyId?: string; + }; + expect(persisted.keyId).toBe("SSSSKEY"); + expect( + Buffer.from(persisted.privateKeyBase64 ?? "", "base64").equals( + Buffer.from(Array.from({ length: 32 }, (_, i) => i + 1)), + ), + ).toBe(true); + }); }); diff --git a/extensions/matrix-js/src/matrix/sdk/recovery-key-store.ts b/extensions/matrix-js/src/matrix/sdk/recovery-key-store.ts index dec591f825f..ab04600c5b5 100644 --- a/extensions/matrix-js/src/matrix/sdk/recovery-key-store.ts +++ b/extensions/matrix-js/src/matrix/sdk/recovery-key-store.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { decodeRecoveryKey } from "matrix-js-sdk/lib/crypto-api/recovery-key.js"; import { LogService } from "./logger.js"; import type { MatrixCryptoBootstrapApi, @@ -88,6 +89,43 @@ export class MatrixRecoveryKeyStore { }; } + storeEncodedRecoveryKey(params: { + encodedPrivateKey: string; + keyId?: string | null; + keyInfo?: MatrixStoredRecoveryKey["keyInfo"]; + }): { + encodedPrivateKey?: string; + keyId?: string | null; + createdAt?: string; + } { + const encodedPrivateKey = params.encodedPrivateKey.trim(); + if (!encodedPrivateKey) { + throw new Error("Matrix recovery key is required"); + } + let privateKey: Uint8Array; + try { + privateKey = decodeRecoveryKey(encodedPrivateKey); + } catch (err) { + throw new Error( + `Invalid Matrix recovery key: ${err instanceof Error ? err.message : String(err)}`, + ); + } + + const normalizedKeyId = + typeof params.keyId === "string" && params.keyId.trim() ? params.keyId.trim() : null; + const keyInfo = params.keyInfo ?? this.loadStoredRecoveryKey()?.keyInfo; + this.saveRecoveryKeyToDisk({ + keyId: normalizedKeyId, + keyInfo, + privateKey, + encodedPrivateKey, + }); + if (normalizedKeyId) { + this.rememberSecretStorageKey(normalizedKeyId, privateKey, keyInfo); + } + return this.getRecoveryKeySummary() ?? {}; + } + async bootstrapSecretStorageWithRecoveryKey(crypto: MatrixCryptoBootstrapApi): Promise { let status: MatrixSecretStorageStatus | null = null; if (typeof crypto.getSecretStorageStatus === "function") { diff --git a/extensions/matrix-js/src/tool-actions.ts b/extensions/matrix-js/src/tool-actions.ts index 0a37784af51..22da9b32c8d 100644 --- a/extensions/matrix-js/src/tool-actions.ts +++ b/extensions/matrix-js/src/tool-actions.ts @@ -7,6 +7,7 @@ import { readStringParam, } from "openclaw/plugin-sdk"; import { + bootstrapMatrixVerification, acceptMatrixVerification, cancelMatrixVerification, confirmMatrixVerificationReciprocateQr, @@ -15,6 +16,7 @@ import { editMatrixMessage, generateMatrixVerificationQr, getMatrixEncryptionStatus, + getMatrixVerificationStatus, getMatrixMemberInfo, getMatrixRoomInfo, getMatrixVerificationSas, @@ -30,6 +32,7 @@ import { sendMatrixMessage, startMatrixVerification, unpinMatrixMessage, + verifyMatrixRecoveryKey, } from "./matrix/actions.js"; import { reactMatrixMessage } from "./matrix/send.js"; import type { CoreConfig } from "./types.js"; @@ -50,6 +53,9 @@ const verificationActions = new Set([ "verificationConfirm", "verificationMismatch", "verificationConfirmQr", + "verificationStatus", + "verificationBootstrap", + "verificationRecoveryKey", ]); function readRoomId(params: Record, required = true): string { @@ -68,7 +74,8 @@ export async function handleMatrixAction( cfg: CoreConfig, ): Promise> { const action = readStringParam(params, "action", { required: true }); - const isActionEnabled = createActionGate(cfg.channels?.matrix?.actions); + const accountId = readStringParam(params, "accountId") ?? undefined; + const isActionEnabled = createActionGate(cfg.channels?.["matrix-js"]?.actions); if (reactionActions.has(action)) { if (!isActionEnabled("reactions")) { @@ -198,11 +205,37 @@ export async function handleMatrixAction( if (action === "encryptionStatus") { const includeRecoveryKey = params.includeRecoveryKey === true; - const status = await getMatrixEncryptionStatus({ includeRecoveryKey }); + const status = await getMatrixEncryptionStatus({ includeRecoveryKey, accountId }); return jsonResult({ ok: true, status }); } + if (action === "verificationStatus") { + const includeRecoveryKey = params.includeRecoveryKey === true; + const status = await getMatrixVerificationStatus({ includeRecoveryKey, accountId }); + return jsonResult({ ok: true, status }); + } + if (action === "verificationBootstrap") { + const recoveryKey = + readStringParam(params, "recoveryKey", { trim: false }) ?? + readStringParam(params, "key", { trim: false }); + const result = await bootstrapMatrixVerification({ + recoveryKey: recoveryKey ?? undefined, + forceResetCrossSigning: params.forceResetCrossSigning === true, + accountId, + }); + return jsonResult({ ok: result.success, result }); + } + if (action === "verificationRecoveryKey") { + const recoveryKey = + readStringParam(params, "recoveryKey", { trim: false }) ?? + readStringParam(params, "key", { trim: false }); + const result = await verifyMatrixRecoveryKey( + readStringParam({ recoveryKey }, "recoveryKey", { required: true, trim: false }), + { accountId }, + ); + return jsonResult({ ok: result.success, result }); + } if (action === "verificationList") { - const verifications = await listMatrixVerifications(); + const verifications = await listMatrixVerifications({ accountId }); return jsonResult({ ok: true, verifications }); } if (action === "verificationRequest") { @@ -215,12 +248,14 @@ export async function handleMatrixAction( userId: userId ?? undefined, deviceId: deviceId ?? undefined, roomId: roomId ?? undefined, + accountId, }); return jsonResult({ ok: true, verification }); } if (action === "verificationAccept") { const verification = await acceptMatrixVerification( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, verification }); } @@ -229,7 +264,7 @@ export async function handleMatrixAction( const code = readStringParam(params, "code"); const verification = await cancelMatrixVerification( readStringParam({ requestId }, "requestId", { required: true }), - { reason: reason ?? undefined, code: code ?? undefined }, + { reason: reason ?? undefined, code: code ?? undefined, accountId }, ); return jsonResult({ ok: true, verification }); } @@ -243,13 +278,14 @@ export async function handleMatrixAction( } const verification = await startMatrixVerification( readStringParam({ requestId }, "requestId", { required: true }), - { method: "sas" }, + { method: "sas", accountId }, ); return jsonResult({ ok: true, verification }); } if (action === "verificationGenerateQr") { const qr = await generateMatrixVerificationQr( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, ...qr }); } @@ -261,30 +297,35 @@ export async function handleMatrixAction( const verification = await scanMatrixVerificationQr( readStringParam({ requestId }, "requestId", { required: true }), readStringParam({ qrDataBase64 }, "qrDataBase64", { required: true }), + { accountId }, ); return jsonResult({ ok: true, verification }); } if (action === "verificationSas") { const sas = await getMatrixVerificationSas( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, sas }); } if (action === "verificationConfirm") { const verification = await confirmMatrixVerificationSas( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, verification }); } if (action === "verificationMismatch") { const verification = await mismatchMatrixVerificationSas( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, verification }); } if (action === "verificationConfirmQr") { const verification = await confirmMatrixVerificationReciprocateQr( readStringParam({ requestId }, "requestId", { required: true }), + { accountId }, ); return jsonResult({ ok: true, verification }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85fe19921d7..60c9d6f9fcf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -371,14 +371,42 @@ importers: '@matrix-org/matrix-sdk-crypto-nodejs': specifier: ^0.4.0 version: 0.4.0 - '@vector-im/matrix-bot-sdk': - specifier: 0.8.0-element.3 - version: 0.8.0-element.3(@cypress/request@3.0.10) + fake-indexeddb: + specifier: ^6.2.5 + version: 6.2.5 markdown-it: - specifier: 14.1.1 - version: 14.1.1 + specifier: 14.1.0 + version: 14.1.0 + matrix-js-sdk: + specifier: ^40.1.0 + version: 40.2.0 music-metadata: - specifier: ^11.12.1 + specifier: ^11.11.2 + version: 11.12.1 + zod: + specifier: ^4.3.6 + version: 4.3.6 + devDependencies: + openclaw: + specifier: workspace:* + version: link:../.. + + extensions/matrix-js: + dependencies: + '@matrix-org/matrix-sdk-crypto-nodejs': + specifier: ^0.4.0 + version: 0.4.0 + fake-indexeddb: + specifier: ^6.2.5 + version: 6.2.5 + markdown-it: + specifier: 14.1.0 + version: 14.1.0 + matrix-js-sdk: + specifier: ^40.1.0 + version: 40.2.0 + music-metadata: + specifier: ^11.11.2 version: 11.12.1 zod: specifier: ^4.3.6 @@ -867,16 +895,6 @@ packages: '@cloudflare/workers-types@4.20260120.0': resolution: {integrity: sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==} - '@cypress/request-promise@5.0.0': - resolution: {integrity: sha512-eKdYVpa9cBEw2kTBlHeu1PP16Blwtum6QHg/u9s/MoHkZfuo1pRGka1VlUHXF5kdew82BvOJVVGk0x8X0nbp+w==} - engines: {node: '>=0.10.0'} - peerDependencies: - '@cypress/request': ^3.0.0 - - '@cypress/request@3.0.10': - resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} - engines: {node: '>= 6'} - '@d-fischer/cache-decorators@4.0.1': resolution: {integrity: sha512-HNYLBLWs/t28GFZZeqdIBqq8f37mqDIFO6xNPof94VjpKvuP6ROqCZGafx88dk5zZUlBfViV9jD8iNNlXfc4CA==} @@ -1510,6 +1528,10 @@ packages: resolution: {integrity: sha512-+qqgpn39XFSbsD0dFjssGO9vHEP7sTyfs8yTpt8vuqWpUpF20QMwpCZi0jpYw7GxjErNTsMshopuo8677DfGEA==} engines: {node: '>= 22'} + '@matrix-org/matrix-sdk-crypto-wasm@17.1.0': + resolution: {integrity: sha512-yKPqBvKlHSqkt/UJh+Z+zLKQP8bd19OxokXYXh3VkKbW0+C44nPHsidSwd3SH+RxT+Ck2PDRwVcVXEnUft+/2g==} + engines: {node: '>= 18'} + '@microsoft/agents-activity@1.3.1': resolution: {integrity: sha512-4k44NrfEqXiSg49ofj8geV8ylPocqDLtZKKt0PFL9BvFV0n57X3y1s/fEbsf7Fkl3+P/R2XLyMB5atEGf/eRGg==} engines: {node: '>=20.0.0'} @@ -2606,9 +2628,6 @@ packages: '@scure/bip39@2.0.1': resolution: {integrity: sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg==} - '@selderee/plugin-htmlparser2@0.11.0': - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@silvia-odwyer/photon-node@0.3.4': resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} @@ -2892,9 +2911,6 @@ packages: '@types/bun@1.3.9': resolution: {integrity: sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw==} - '@types/caseless@0.12.5': - resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2913,15 +2929,12 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + '@types/events@3.0.3': + resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} '@types/express-serve-static-core@5.1.1': resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} - '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} @@ -2949,9 +2962,6 @@ packages: '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -2976,27 +2986,15 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/request@2.48.13': - resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} - '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -3050,10 +3048,6 @@ packages: resolution: {integrity: sha512-N8/FHc/lmlMDCumMuTXyRHCxlov5KZY6unmJ9QR2GOw+OpROZMBsXYGwE+ZMtvN21ql9+Xb8KhGNBj08IrG3Wg==} engines: {node: '>=16', npm: '>=8'} - '@vector-im/matrix-bot-sdk@0.8.0-element.3': - resolution: {integrity: sha512-2FFo/Kz2vTnOZDv59Q0s803LHf7KzuQ2EwOYYAtO0zUKJ8pV5CPsVC/IHyFb+Fsxl3R9XWFiX529yhslb4v9cQ==} - engines: {node: '>=22.0.0'} - '@vitest/browser-playwright@4.0.18': resolution: {integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==} peerDependencies: @@ -3131,8 +3125,8 @@ packages: link-preview-js: optional: true - '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': - resolution: {tarball: https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67} + '@whiskeysockets/libsignal-node@git+https://git@github.com:whiskeysockets/libsignal-node.git#1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': + resolution: {commit: 1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67, repo: git@github.com:whiskeysockets/libsignal-node.git, type: git} version: 2.0.1 abbrev@1.1.1: @@ -3142,10 +3136,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -3237,16 +3227,6 @@ packages: resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} engines: {node: '>=12.17'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3262,9 +3242,6 @@ packages: ast-v8-to-istanbul@0.3.11: resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} - async-lock@1.4.1: - resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} - async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -3288,12 +3265,6 @@ packages: resolution: {integrity: sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==} engines: {node: '>=14'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axios@1.13.5: resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} @@ -3301,20 +3272,16 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - basic-ftp@5.1.0: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} @@ -3324,13 +3291,6 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.2: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} @@ -3348,6 +3308,9 @@ packages: resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} engines: {node: 18 || 20 || >=22} + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -3376,9 +3339,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -3475,10 +3435,6 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -3487,9 +3443,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -3498,9 +3451,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3525,10 +3475,6 @@ packages: curve25519-js@0.0.4: resolution: {integrity: sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -3537,14 +3483,6 @@ packages: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3558,10 +3496,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -3580,10 +3514,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -3634,9 +3564,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -3703,10 +3630,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -3742,14 +3665,14 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - express@5.2.1: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} @@ -3757,9 +3680,9 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} + engines: {node: '>=18'} fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -3799,10 +3722,6 @@ packages: resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} engines: {node: '>=16'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -3827,9 +3746,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - form-data@2.5.4: resolution: {integrity: sha512-Y/3MmRiR8Nd+0CUtrbvcKtKzLWiUfpQ7DFVggH8PwmGt/0r7RSy32GuP4hpCJlQNEBusisSx1DLtD8uD386HJQ==} engines: {node: '>= 0.12'} @@ -3843,10 +3759,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -3916,12 +3828,6 @@ packages: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -3977,9 +3883,6 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hashery@1.5.0: resolution: {integrity: sha512-nhQ6ExaOIqti2FDWoEMWARUqIKyjr2VcZzXShrI+A3zpeiuPWzx6iPftt44LhP74E5sW36B75N6VHbvRtpvO6Q==} engines: {node: '>=20'} @@ -4011,19 +3914,9 @@ packages: html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - html-to-text@9.0.5: - resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} - engines: {node: '>=14'} - - htmlencode@0.0.4: - resolution: {integrity: sha512-0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w==} - htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -4032,10 +3925,6 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-signature@1.4.0: - resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} - engines: {node: '>=0.10'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4044,10 +3933,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -4114,12 +3999,9 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -4128,9 +4010,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -4149,9 +4028,6 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -4177,9 +4053,6 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -4199,12 +4072,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -4217,10 +4084,6 @@ packages: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -4234,6 +4097,10 @@ packages: jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} @@ -4244,9 +4111,6 @@ packages: koffi@2.15.1: resolution: {integrity: sha512-mnc0C0crx/xMSljb5s9QbnLrlFHprioFO1hkXyuSuO/QtbpLDa0l/uM21944UfQunMKmp3/r789DTDxVyyH6aA==} - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -4389,9 +4253,6 @@ packages: lodash.pickby@4.6.0: resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -4400,16 +4261,16 @@ packages: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - lowdb@1.0.0: - resolution: {integrity: sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==} - engines: {node: '>=4'} - lowdb@7.0.1: resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} engines: {node: '>=18'} @@ -4446,6 +4307,10 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-it@14.1.1: resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true @@ -4464,13 +4329,19 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + matrix-events-sdk@0.0.1: + resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} + + matrix-js-sdk@40.2.0: + resolution: {integrity: sha512-wqb1Oq34WB9r0njxw8XiNsm8DIvYeGfCn3wrVrDwj8HMoTI0TvLSY1sQ+x6J2Eg27abfVwInxLKyxLp+dROFXQ==} + engines: {node: '>=22.0.0'} + + matrix-widget-api@1.17.0: + resolution: {integrity: sha512-5FHoo3iEP3Bdlv5jsYPWOqj+pGdFQNLWnJLiB0V7Ygne7bb+Gsj3ibyFyHWC6BVw+Z+tSW4ljHpO17I9TwStwQ==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -4478,17 +4349,10 @@ packages: memory-stream@1.0.0: resolution: {integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -4505,18 +4369,10 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.2.1: resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} engines: {node: 20 || >=22} @@ -4532,18 +4388,9 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - module-details-from-path@1.0.4: resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - morgan@1.10.1: - resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} - engines: {node: '>= 0.8.0'} - mpg123-decoder@1.0.3: resolution: {integrity: sha512-+fjxnWigodWJm3+4pndi+KUg9TBojgn31DPk85zEsim7C6s0X5Ztc/hQYdytXkwuGXH+aB0/aEkG40Emukv6oQ==} @@ -4551,9 +4398,6 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4574,10 +4418,6 @@ packages: engines: {node: ^18 || >=20} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -4687,22 +4527,18 @@ packages: ogg-opus-decoder@1.7.3: resolution: {integrity: sha512-w47tiZpkLgdkpa+34VzYD8mHUj8I9kfWVZa82mBbNwDvB1byfLXSSzW/HxA4fI3e9kVlICSpXGFwMLV1LPdjwg==} + oidc-client-ts@3.4.1: + resolution: {integrity: sha512-jNdst/U28Iasukx/L5MP6b274Vr7ftQs6qAhPBCvz6Wt5rPCA+Q/tUmCzfCHHWweWw5szeMy2Gfrm1rITwUKrw==} + engines: {node: '>=18'} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -4783,6 +4619,10 @@ packages: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} + p-retry@7.1.1: + resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} + engines: {node: '>=20'} + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -4813,9 +4653,6 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse-srcset@1.0.2: - resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} - parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -4825,9 +4662,6 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parseley@0.12.1: - resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4851,9 +4685,6 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -4864,12 +4695,6 @@ packages: resolution: {integrity: sha512-sm6TxKTtWv1Oh6n3C6J6a8odejb5uO4A4zo/2dgkHuC0iu8ZMAXOezEODkVaoVp8nX1Xzr+0WxFJJmUr45hQzg==} engines: {node: '>=20.16.0 || >=22.3.0'} - peberminta@0.9.0: - resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4877,10 +4702,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -4913,10 +4734,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - postgres@3.4.8: - resolution: {integrity: sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==} - engines: {node: '>=12'} - pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -4978,17 +4795,10 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - qified@0.6.0: resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} engines: {node: '>=20'} @@ -5007,9 +4817,6 @@ packages: quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -5017,10 +4824,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -5047,12 +4850,6 @@ packages: reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - request-promise-core@1.1.3: - resolution: {integrity: sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==} - engines: {node: '>=0.10.0'} - peerDependencies: - request: ^2.34 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5065,9 +4862,6 @@ packages: resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -5138,11 +4932,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-html@2.17.1: - resolution: {integrity: sha512-ehFCW+q1a4CSOWRAdX97BX/6/PDEkCqw7/0JXZAGQV57FQB3YOkTa/rrzHPeJ+Aghy4vZAFfWMYyfxIiB7F/gw==} - - selderee@0.11.0: - resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + sdp-transform@3.0.0: + resolution: {integrity: sha512-gfYVRGxjHkGF2NPeUWHw5u6T/KGFtS5/drPms73gaSuMaVHKCY3lpLnGDfswVQO0kddeePoti09AwhYP4zA8dQ==} + hasBin: true semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -5153,18 +4945,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} @@ -5302,11 +5086,6 @@ packages: sqlite-vec@0.1.7-alpha.2: resolution: {integrity: sha512-rNgRCv+4V4Ed3yc33Qr+nNmjhtrMnnHzXfLVPeGb28Dx5mmDL3Ngw/Wk8vhCGjj76+oC6gnkmMG8y73BZWGBwQ==} - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5325,13 +5104,6 @@ packages: resolution: {integrity: sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==} engines: {node: '>=16.0.0'} - stealthy-require@1.1.1: - resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} - engines: {node: '>=0.10.0'} - - steno@0.4.4: - resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==} - steno@4.0.2: resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} engines: {node: '>=18'} @@ -5431,10 +5203,6 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -5486,16 +5254,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -5539,16 +5297,15 @@ packages: resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} + unhomoglyph@1.0.6: + resolution: {integrity: sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==} + universal-github-app-jwt@2.2.2: resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -5570,20 +5327,17 @@ packages: url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -5596,10 +5350,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6440,37 +6190,6 @@ snapshots: '@cloudflare/workers-types@4.20260120.0': optional: true - '@cypress/request-promise@5.0.0(@cypress/request@3.0.10)(@cypress/request@3.0.10)': - dependencies: - '@cypress/request': 3.0.10 - bluebird: 3.7.2 - request-promise-core: 1.1.3(@cypress/request@3.0.10) - stealthy-require: 1.1.1 - tough-cookie: 4.1.3 - transitivePeerDependencies: - - request - - '@cypress/request@3.0.10': - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.5.4 - http-signature: 1.4.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.14.2 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - '@d-fischer/cache-decorators@4.0.1': dependencies: '@d-fischer/shared-utils': 3.6.4 @@ -6890,7 +6609,7 @@ snapshots: '@larksuiteoapi/node-sdk@1.59.0': dependencies: - axios: 1.13.5 + axios: 1.13.5(debug@4.4.3) lodash.identity: 3.0.0 lodash.merge: 4.6.2 lodash.pickby: 4.6.0 @@ -6906,7 +6625,7 @@ snapshots: dependencies: '@types/node': 24.10.13 optionalDependencies: - axios: 1.13.5 + axios: 1.13.5(debug@4.4.3) transitivePeerDependencies: - debug @@ -7082,6 +6801,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@matrix-org/matrix-sdk-crypto-wasm@17.1.0': {} + '@microsoft/agents-activity@1.3.1': dependencies: debug: 4.4.3 @@ -7095,7 +6816,7 @@ snapshots: '@azure/core-auth': 1.10.1 '@azure/msal-node': 5.0.4 '@microsoft/agents-activity': 1.3.1 - axios: 1.13.5 + axios: 1.13.5(debug@4.4.3) jsonwebtoken: 9.0.3 jwks-rsa: 3.2.2 object-path: 0.11.8 @@ -7980,11 +7701,6 @@ snapshots: '@noble/hashes': 2.0.1 '@scure/base': 2.0.0 - '@selderee/plugin-htmlparser2@0.11.0': - dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - '@silvia-odwyer/photon-node@0.3.4': {} '@sinclair/typebox@0.34.48': {} @@ -7997,7 +7713,7 @@ snapshots: '@slack/types': 2.20.0 '@slack/web-api': 7.14.1 '@types/express': 5.0.6 - axios: 1.13.5 + axios: 1.13.5(debug@4.4.3) express: 5.2.1 path-to-regexp: 8.3.0 raw-body: 3.0.2 @@ -8043,7 +7759,7 @@ snapshots: '@slack/types': 2.20.0 '@types/node': 25.3.0 '@types/retry': 0.12.0 - axios: 1.13.5 + axios: 1.13.5(debug@4.4.3) eventemitter3: 5.0.4 form-data: 2.5.4 is-electron: 2.2.2 @@ -8453,8 +8169,6 @@ snapshots: bun-types: 1.3.9 optional: true - '@types/caseless@0.12.5': {} - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -8472,12 +8186,7 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.8': - dependencies: - '@types/node': 25.3.0 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + '@types/events@3.0.3': {} '@types/express-serve-static-core@5.1.1': dependencies: @@ -8486,13 +8195,6 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 1.2.1 - '@types/express@4.17.25': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.10 - '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.6 @@ -8521,8 +8223,6 @@ snapshots: '@types/mime-types@2.1.4': {} - '@types/mime@1.3.5': {} - '@types/ms@2.1.0': {} '@types/node@10.17.60': {} @@ -8545,37 +8245,17 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/request@2.48.13': - dependencies: - '@types/caseless': 0.12.5 - '@types/node': 25.3.0 - '@types/tough-cookie': 4.0.5 - form-data: 2.5.4 - '@types/retry@0.12.0': {} - '@types/send@0.17.6': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 25.3.0 - '@types/send@1.2.1': dependencies: '@types/node': 25.3.0 - '@types/serve-static@1.15.10': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 25.3.0 - '@types/send': 0.17.6 - '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 '@types/node': 25.3.0 - '@types/tough-cookie@4.0.5': {} - '@types/trusted-types@2.0.7': {} '@types/ws@8.18.1': @@ -8623,31 +8303,6 @@ snapshots: '@urbit/aura@3.0.0': {} - '@vector-im/matrix-bot-sdk@0.8.0-element.3(@cypress/request@3.0.10)': - dependencies: - '@matrix-org/matrix-sdk-crypto-nodejs': 0.4.0 - '@types/express': 4.17.25 - '@types/request': 2.48.13 - another-json: 0.2.0 - async-lock: 1.4.1 - chalk: 4.1.2 - express: 4.22.1 - glob-to-regexp: 0.4.1 - hash.js: 1.1.7 - html-to-text: 9.0.5 - htmlencode: 0.0.4 - lowdb: 1.0.0 - lru-cache: 10.4.3 - mkdirp: 3.0.1 - morgan: 1.10.1 - postgres: 3.4.8 - request: '@cypress/request@3.0.10' - request-promise: '@cypress/request-promise@5.0.0(@cypress/request@3.0.10)(@cypress/request@3.0.10)' - sanitize-html: 2.17.1 - transitivePeerDependencies: - - '@cypress/request' - - supports-color - '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': dependencies: '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) @@ -8761,7 +8416,7 @@ snapshots: '@cacheable/node-cache': 1.7.6 '@hapi/boom': 9.1.4 async-mutex: 0.5.0 - libsignal: '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67' + libsignal: '@whiskeysockets/libsignal-node@git+https://git@github.com:whiskeysockets/libsignal-node.git#1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67' lru-cache: 11.2.6 music-metadata: 11.12.1 p-queue: 9.1.0 @@ -8776,7 +8431,7 @@ snapshots: - supports-color - utf-8-validate - '@whiskeysockets/libsignal-node@https://codeload.github.com/whiskeysockets/libsignal-node/tar.gz/1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': + '@whiskeysockets/libsignal-node@git+https://git@github.com:whiskeysockets/libsignal-node.git#1c30d7d7e76a3b0aa120b04dc6a26f5a12dccf67': dependencies: curve25519-js: 0.0.4 protobufjs: 6.8.8 @@ -8788,11 +8443,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - accepts@2.0.0: dependencies: mime-types: 3.0.2 @@ -8873,14 +8523,6 @@ snapshots: array-back@6.2.2: {} - array-flatten@1.1.1: {} - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - assertion-error@2.0.1: {} ast-kit@3.0.0-beta.1: @@ -8899,8 +8541,6 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 - async-lock@1.4.1: {} - async-mutex@0.5.0: dependencies: tslib: 2.8.1 @@ -8931,18 +8571,6 @@ snapshots: audio-type@2.2.1: optional: true - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - - axios@1.13.5: - dependencies: - follow-redirects: 1.15.11 - form-data: 2.5.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.13.5(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) @@ -8953,43 +8581,18 @@ snapshots: balanced-match@4.0.4: {} + base-x@5.0.1: {} + base64-js@1.5.1: {} - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - basic-ftp@5.1.0: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - before-after-hook@4.0.0: {} bignumber.js@9.3.1: {} birpc@4.0.0: {} - bluebird@3.7.2: {} - - body-parser@1.20.4: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.14.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@2.2.2: dependencies: bytes: 3.1.2 @@ -9014,6 +8617,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} @@ -9045,8 +8652,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - caseless@0.12.0: {} - chai@6.2.2: {} chalk-template@0.4.0: @@ -9151,22 +8756,14 @@ snapshots: console-control-strings@1.1.0: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - content-disposition@1.0.1: {} content-type@1.0.5: {} - cookie-signature@1.0.7: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - core-util-is@1.0.2: {} - core-util-is@1.0.3: {} croner@10.0.1: {} @@ -9191,26 +8788,16 @@ snapshots: curve25519-js@0.0.4: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.4.3: dependencies: ms: 2.1.3 deep-extend@0.6.0: {} - deepmerge@4.3.1: {} - defu@6.1.4: {} degenerator@5.0.1: @@ -9225,8 +8812,6 @@ snapshots: depd@2.0.0: {} - destroy@1.2.0: {} - detect-libc@2.1.2: {} diff@8.0.3: {} @@ -9269,11 +8854,6 @@ snapshots: eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 @@ -9346,8 +8926,6 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} - escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -9374,43 +8952,9 @@ snapshots: eventemitter3@5.0.4: {} - expect-type@1.3.0: {} + events@3.3.0: {} - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.14.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + expect-type@1.3.0: {} express@5.2.1: dependencies: @@ -9447,7 +8991,7 @@ snapshots: extend@3.0.2: {} - extsprintf@1.3.0: {} + fake-indexeddb@6.2.5: {} fast-content-type-parse@3.0.0: {} @@ -9483,18 +9027,6 @@ snapshots: dependencies: filename-reserved-regex: 3.0.0 - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -9512,8 +9044,6 @@ snapshots: flatbuffers@24.12.23: {} - follow-redirects@1.15.11: {} - follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: debug: 4.4.3 @@ -9523,8 +9053,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - form-data@2.5.4: dependencies: asynckit: 0.4.0 @@ -9540,8 +9068,6 @@ snapshots: forwarded@0.2.0: {} - fresh@0.5.2: {} - fresh@2.0.0: {} fs-extra@11.3.3: @@ -9638,12 +9164,6 @@ snapshots: transitivePeerDependencies: - supports-color - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - glob-to-regexp@0.4.1: {} - glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -9716,11 +9236,6 @@ snapshots: has-unicode@2.0.1: {} - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - hashery@1.5.0: dependencies: hookified: 1.15.1 @@ -9746,16 +9261,6 @@ snapshots: html-escaper@3.0.3: {} - html-to-text@9.0.5: - dependencies: - '@selderee/plugin-htmlparser2': 0.11.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.11.0 - - htmlencode@0.0.4: {} - htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 @@ -9763,13 +9268,6 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -9785,12 +9283,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-signature@1.4.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -9806,10 +9298,6 @@ snapshots: transitivePeerDependencies: - supports-color - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -9892,16 +9380,12 @@ snapshots: is-interactive@2.0.0: {} - is-plain-object@5.0.0: {} - - is-promise@2.2.2: {} + is-network-error@1.3.0: {} is-promise@4.0.0: {} is-stream@2.0.1: {} - is-typedarray@1.0.0: {} - is-unicode-supported@1.3.0: {} is-unicode-supported@2.1.0: {} @@ -9912,8 +9396,6 @@ snapshots: isexe@3.1.5: {} - isstream@0.1.2: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -9939,8 +9421,6 @@ snapshots: js-tokens@10.0.0: {} - jsbn@0.1.1: {} - jsesc@3.1.0: {} json-bigint@1.0.0: @@ -9956,10 +9436,6 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema@0.4.0: {} - - json-stringify-safe@5.0.1: {} - json5@2.2.3: {} jsonfile@6.2.0: @@ -9981,13 +9457,6 @@ snapshots: ms: 2.1.3 semver: 7.7.4 - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jszip@3.10.1: dependencies: lie: 3.3.0 @@ -10016,6 +9485,8 @@ snapshots: jwa: 2.0.1 safe-buffer: 5.2.1 + jwt-decode@4.0.0: {} + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -10024,8 +9495,6 @@ snapshots: koffi@2.15.1: {} - leac@0.6.0: {} - lie@3.3.0: dependencies: immediate: 3.0.6 @@ -10140,8 +9609,6 @@ snapshots: lodash.pickby@4.6.0: {} - lodash@4.17.23: {} - log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -10152,18 +9619,12 @@ snapshots: is-unicode-supported: 2.1.0 yoctocolors: 2.1.2 + loglevel@1.9.2: {} + long@4.0.0: {} long@5.3.2: {} - lowdb@1.0.0: - dependencies: - graceful-fs: 4.2.11 - is-promise: 2.2.2 - lodash: 4.17.23 - pify: 3.0.0 - steno: 0.4.4 - lowdb@7.0.1: dependencies: steno: 4.0.2 @@ -10202,6 +9663,15 @@ snapshots: dependencies: semver: 7.7.4 + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-it@14.1.1: dependencies: argparse: 2.0.1 @@ -10217,9 +9687,31 @@ snapshots: math-intrinsics@1.1.0: {} - mdurl@2.0.0: {} + matrix-events-sdk@0.0.1: {} - media-typer@0.3.0: {} + matrix-js-sdk@40.2.0: + dependencies: + '@babel/runtime': 7.28.6 + '@matrix-org/matrix-sdk-crypto-wasm': 17.1.0 + another-json: 0.2.0 + bs58: 6.0.0 + content-type: 1.0.5 + jwt-decode: 4.0.0 + loglevel: 1.9.2 + matrix-events-sdk: 0.0.1 + matrix-widget-api: 1.17.0 + oidc-client-ts: 3.4.1 + p-retry: 7.1.1 + sdp-transform: 3.0.0 + unhomoglyph: 1.0.6 + uuid: 13.0.0 + + matrix-widget-api@1.17.0: + dependencies: + '@types/events': 3.0.3 + events: 3.3.0 + + mdurl@2.0.0: {} media-typer@1.1.0: {} @@ -10227,12 +9719,8 @@ snapshots: dependencies: readable-stream: 3.6.2 - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} - methods@1.1.2: {} - mime-db@1.52.0: {} mime-db@1.54.0: {} @@ -10245,12 +9733,8 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.6.0: {} - mimic-function@5.0.1: {} - minimalistic-assert@1.0.1: {} - minimatch@10.2.1: dependencies: brace-expansion: 5.0.3 @@ -10263,20 +9747,8 @@ snapshots: dependencies: minipass: 7.1.3 - mkdirp@3.0.1: {} - module-details-from-path@1.0.4: {} - morgan@1.10.1: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.1.0 - transitivePeerDependencies: - - supports-color - mpg123-decoder@1.0.3: dependencies: '@wasm-audio-decoders/common': 9.0.7 @@ -10284,8 +9756,6 @@ snapshots: mrmime@2.0.1: {} - ms@2.0.0: {} - ms@2.1.3: {} music-metadata@11.12.1: @@ -10313,8 +9783,6 @@ snapshots: nanoid@5.1.6: {} - negotiator@0.6.3: {} - negotiator@1.0.0: {} netmask@2.0.2: {} @@ -10470,18 +9938,16 @@ snapshots: opus-decoder: 0.7.11 optional: true - on-exit-leak-free@2.1.2: {} - - on-finished@2.3.0: + oidc-client-ts@3.4.1: dependencies: - ee-first: 1.1.1 + jwt-decode: 4.0.0 + + on-exit-leak-free@2.1.2: {} on-finished@2.4.1: dependencies: ee-first: 1.1.1 - on-headers@1.1.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -10594,6 +10060,10 @@ snapshots: '@types/retry': 0.12.0 retry: 0.13.1 + p-retry@7.1.1: + dependencies: + is-network-error: 1.3.0 + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 @@ -10626,8 +10096,6 @@ snapshots: parse-ms@4.0.0: {} - parse-srcset@1.0.2: {} - parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -10636,11 +10104,6 @@ snapshots: parse5@6.0.1: {} - parseley@0.12.1: - dependencies: - leac: 0.6.0 - peberminta: 0.9.0 - parseurl@1.3.3: {} partial-json@0.1.7: {} @@ -10660,8 +10123,6 @@ snapshots: lru-cache: 11.2.6 minipass: 7.1.3 - path-to-regexp@0.1.12: {} - path-to-regexp@8.3.0: {} pathe@2.0.3: {} @@ -10671,16 +10132,10 @@ snapshots: '@napi-rs/canvas': 0.1.94 node-readable-to-web-readable-stream: 0.4.2 - peberminta@0.9.0: {} - - performance-now@2.1.0: {} - picocolors@1.1.1: {} picomatch@4.0.3: {} - pify@3.0.0: {} - pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -10721,8 +10176,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres@3.4.8: {} - pretty-bytes@6.1.1: {} pretty-ms@8.0.0: @@ -10814,14 +10267,8 @@ snapshots: proxy-from-env@1.1.0: {} - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode.js@2.3.1: {} - punycode@2.3.1: {} - qified@0.6.0: dependencies: hookified: 1.15.1 @@ -10839,19 +10286,10 @@ snapshots: quansync@1.0.0: {} - querystringify@2.2.0: {} - quick-format-unescaped@4.0.4: {} range-parser@1.2.1: {} - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -10888,11 +10326,6 @@ snapshots: reflect-metadata@0.2.2: {} - request-promise-core@1.1.3(@cypress/request@3.0.10): - dependencies: - lodash: 4.17.23 - request: '@cypress/request@3.0.10' - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -10904,8 +10337,6 @@ snapshots: transitivePeerDependencies: - supports-color - requires-port@1.0.0: {} - resolve-pkg-maps@1.0.0: {} restore-cursor@5.1.0: @@ -11012,42 +10443,13 @@ snapshots: safer-buffer@2.1.2: {} - sanitize-html@2.17.1: - dependencies: - deepmerge: 4.3.1 - escape-string-regexp: 4.0.0 - htmlparser2: 8.0.2 - is-plain-object: 5.0.0 - parse-srcset: 1.0.2 - postcss: 8.5.6 - - selderee@0.11.0: - dependencies: - parseley: 0.12.1 + sdp-transform@3.0.0: {} semver@6.3.1: optional: true semver@7.7.4: {} - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - send@1.2.1: dependencies: debug: 4.4.3 @@ -11064,15 +10466,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -11244,18 +10637,6 @@ snapshots: sqlite-vec-linux-x64: 0.1.7-alpha.2 sqlite-vec-windows-x64: 0.1.7-alpha.2 - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - stackback@0.0.2: {} statuses@2.0.2: {} @@ -11271,12 +10652,6 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.2 - stealthy-require@1.1.1: {} - - steno@0.4.4: - dependencies: - graceful-fs: 4.2.11 - steno@4.0.2: {} string-width@4.2.3: @@ -11375,13 +10750,6 @@ snapshots: totalist@3.0.1: {} - tough-cookie@4.1.3: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - tr46@0.0.3: {} tree-kill@1.2.2: {} @@ -11428,17 +10796,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl@0.14.5: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -11470,12 +10827,12 @@ snapshots: undici@7.22.0: {} + unhomoglyph@1.0.6: {} + universal-github-app-jwt@2.2.2: {} universal-user-agent@7.0.3: {} - universalify@0.2.0: {} - universalify@2.0.1: {} unpipe@1.0.0: {} @@ -11486,29 +10843,18 @@ snapshots: url-join@4.0.1: {} - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@11.1.0: {} + uuid@13.0.0: {} + uuid@8.3.2: {} validate-npm-package-name@6.0.2: {} vary@1.1.2: {} - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - vite@7.3.1(@types/node@25.3.0)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3