This commit is contained in:
MomentQYC 2024-10-06 17:17:45 +08:00
parent 4ff47f5cf2
commit 309b259515
20 changed files with 600 additions and 92 deletions

12
locales/index.d.ts vendored
View File

@ -730,6 +730,14 @@ export interface Locale extends ILocale {
* *
*/ */
"flagAsCatDescription": string; "flagAsCatDescription": string;
/**
* TTS機能が欲しい
*/
"flagAsVI": string;
/**
* TTS機能が必要な場合は有効にしてください TTS機能を有効にします
*/
"flagAsVIDescription": string;
/** /**
* *
*/ */
@ -6913,6 +6921,10 @@ export interface Locale extends ILocale {
* botユーザー * botユーザー
*/ */
"isBot": string; "isBot": string;
/**
* TTSユーザー
*/
"isVI": string;
/** /**
* *
*/ */

View File

@ -178,6 +178,8 @@ flagAsBot: "Botとして設定"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。" flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
flagAsCat: "にゃああああああああああああああ!!!!!!!!!!!!" flagAsCat: "にゃああああああああああああああ!!!!!!!!!!!!"
flagAsCatDescription: "にゃにゃにゃ??" flagAsCatDescription: "にゃにゃにゃ??"
flagAsVI: "自動TTS機能が欲しい。"
flagAsVIDescription: "自動TTS機能が必要な場合は有効にしてください。 権限のあるユーザーグループに所属している場合、特定の範囲で自動TTS機能を有効にします。"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する" flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。" flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認" autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
@ -1786,6 +1788,7 @@ _role:
isRemote: "リモートユーザー" isRemote: "リモートユーザー"
isCat: "猫ユーザー" isCat: "猫ユーザー"
isBot: "botユーザー" isBot: "botユーザー"
isVI: "TTSユーザー"
isSuspended: "サスペンド済みユーザー" isSuspended: "サスペンド済みユーザー"
isLocked: "鍵アカウントユーザー" isLocked: "鍵アカウントユーザー"
isExplorable: "「アカウントを見つけやすくする」が有効なユーザー" isExplorable: "「アカウントを見つけやすくする」が有効なユーザー"

View File

@ -7,10 +7,13 @@ export class TTSIntegration1724683952000 {
constructor() { constructor() {
this.name = 'TTSIntegration1724683952000'; this.name = 'TTSIntegration1724683952000';
} }
async up(queryRunner) { async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "hfAuthKey" character varying(128)`); await queryRunner.query(`ALTER TABLE "meta" ADD "hfAuthKey" character varying(128)`);
} }
async down(queryRunner) { async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfAuthKey"`); await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfAuthKey"`);
} }
} }

View File

@ -0,0 +1,45 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class TTSIntegration1724683962000 {
constructor() {
this.name = 'TTSIntegration1724683962000';
}
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" ADD "isVI" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`COMMENT ON COLUMN "user"."isVI" IS 'Whether the User needs auto TTS.'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfSpace" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfSpaceName" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfexampleAudioURL" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfexampleText" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfexampleLang" character varying(128)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfslice" character varying(128) DEFAULT 'Slice once every 4 sentences'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hftopK" INTEGER DEFAULT 15`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hftopP" NUMERIC(4, 2) DEFAULT 1.00`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfTemperature" NUMERIC(4, 2) DEFAULT 1.00`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfnrm" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfSpeedRate" NUMERIC(4, 2) DEFAULT 1.25`);
await queryRunner.query(`ALTER TABLE "meta" ADD "hfdas" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "user"."isVI" IS NULL`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isVI"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfSpace"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfSpaceName"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfexampleAudioURL"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfexampleText"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfexampleLang"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfslice"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hftopK"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hftopP"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfTemperature"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfnrm"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfSpeedRate"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "hfdas"`);
}
}

View File

@ -79,6 +79,7 @@
"@fastify/multipart": "9.0.1", "@fastify/multipart": "9.0.1",
"@fastify/static": "8.0.1", "@fastify/static": "8.0.1",
"@fastify/view": "10.0.1", "@fastify/view": "10.0.1",
"@gradio/client": "1.6.0-beta.3",
"@misskey-dev/sharp-read-bmp": "1.2.0", "@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.1.0", "@misskey-dev/summaly": "5.1.0",
"@napi-rs/canvas": "0.1.56", "@napi-rs/canvas": "0.1.56",
@ -132,8 +133,8 @@
"json5": "2.2.3", "json5": "2.2.3",
"jsonld": "8.3.2", "jsonld": "8.3.2",
"jsrsasign": "11.1.0", "jsrsasign": "11.1.0",
"meilisearch": "0.42.0",
"juice": "11.0.0", "juice": "11.0.0",
"meilisearch": "0.42.0",
"mfm-js": "0.24.0", "mfm-js": "0.24.0",
"microformats-parser": "2.0.2", "microformats-parser": "2.0.2",
"mime-types": "2.1.35", "mime-types": "2.1.35",

View File

@ -256,6 +256,10 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
case 'isCat': { case 'isCat': {
return user.isCat; return user.isCat;
} }
// Auto TTS
case 'isVI': {
return user.isVI;
}
// 「ユーザを見つけやすくする」が有効なアカウント // 「ユーザを見つけやすくする」が有効なアカウント
case 'isExplorable': { case 'isExplorable': {
return user.isExplorable; return user.isExplorable;

View File

@ -490,6 +490,7 @@ export class UserEntityService implements OnModuleInit {
}))) : [], }))) : [],
isBot: user.isBot, isBot: user.isBot,
isCat: user.isCat, isCat: user.isCat,
isVI: user.isVI,
instance: user.host ? this.federatedInstanceService.federatedInstanceCache.fetch(user.host).then(instance => instance ? { instance: user.host ? this.federatedInstanceService.federatedInstanceCache.fetch(user.host).then(instance => instance ? {
name: instance.name, name: instance.name,
softwareName: instance.softwareName, softwareName: instance.softwareName,

View File

@ -355,6 +355,72 @@ export class MiMeta {
}) })
public hfAuthKey: string | null; public hfAuthKey: string | null;
@Column('boolean', {
default: false,
})
public hfSpace: boolean;
@Column('varchar', {
length: 1024,
nullable: true,
})
public hfSpaceName: string | null;
@Column('varchar', {
length: 1024,
nullable: true,
})
public hfexampleAudioURL: string;
@Column('varchar', {
length: 1024,
nullable: true,
})
public hfexampleText: string | null;
@Column('varchar', {
length: 1024,
nullable: true,
})
public hfexampleLang: string;
@Column('varchar', {
length: 1024,
default: 'Slice once every 4 sentences',
nullable: true,
})
public hfslice: string;
@Column('varchar', {
default: 15,
})
public hftopK: number;
@Column('varchar', {
default: 1.00,
})
public hftopP: number;
@Column('varchar', {
default: 1.00,
})
public hfTemperature: number;
@Column('varchar', {
default: false,
})
public hfnrm: boolean;
@Column('varchar', {
default: 1.25,
})
public hfSpeedRate: number;
@Column('varchar', {
default: false,
})
public hfdas: boolean;
@Column('varchar', { @Column('varchar', {
length: 1024, length: 1024,
nullable: true, nullable: true,

View File

@ -83,6 +83,13 @@ type CondFormulaValueIsCat = {
type: 'isCat'; type: 'isCat';
}; };
/**
* Auto TTS
*/
type CondFormulaValueIsVI = {
type: 'isVI';
};
/** /**
* *
*/ */
@ -164,6 +171,7 @@ export type RoleCondFormulaValue = { id: string } & (
CondFormulaValueIsLocked | CondFormulaValueIsLocked |
CondFormulaValueIsBot | CondFormulaValueIsBot |
CondFormulaValueIsCat | CondFormulaValueIsCat |
CondFormulaValueIsVI |
CondFormulaValueIsExplorable | CondFormulaValueIsExplorable |
CondFormulaValueRoleAssignedTo | CondFormulaValueRoleAssignedTo |
CondFormulaValueCreatedLessThan | CondFormulaValueCreatedLessThan |

View File

@ -184,6 +184,12 @@ export class MiUser {
}) })
public isCat: boolean; public isCat: boolean;
@Column('boolean', {
default: false,
comment: 'Whether the User needs auto TTS.',
})
public isVI: boolean;
@Column('boolean', { @Column('boolean', {
default: false, default: false,
comment: 'Whether the User is the root.', comment: 'Whether the User is the root.',

View File

@ -66,7 +66,7 @@ export const packedRoleCondFormulaValueUserSettingBooleanSchema = {
type: { type: {
type: 'string', type: 'string',
nullable: false, optional: false, nullable: false, optional: false,
enum: ['isSuspended', 'isLocked', 'isBot', 'isCat', 'isExplorable'], enum: ['isSuspended', 'isLocked', 'isBot', 'isCat','isVI' , 'isExplorable'],
}, },
}, },
} as const; } as const;

View File

@ -115,6 +115,10 @@ export const packedUserLiteSchema = {
type: 'boolean', type: 'boolean',
nullable: false, optional: true, nullable: false, optional: true,
}, },
isVI: {
type: 'boolean',
nullable: false, optional: true,
},
instance: { instance: {
type: 'object', type: 'object',
nullable: false, optional: true, nullable: false, optional: true,

View File

@ -93,6 +93,18 @@ export const paramDef = {
deeplAuthKey: { type: 'string', nullable: true }, deeplAuthKey: { type: 'string', nullable: true },
deeplIsPro: { type: 'boolean' }, deeplIsPro: { type: 'boolean' },
hfAuthKey: { type: 'string', nullable: true }, hfAuthKey: { type: 'string', nullable: true },
hfSpace: { type: 'boolean', default: false },
hfSpaceName: { type: 'string', length: 1024, nullable: true },
hfexampleAudioURL: { type: 'string', length: 1024, nullable: true },
hfexampleText: { type: 'string', length: 1024, nullable: true },
hfexampleLang: { type: 'string', length: 1024, nullable: true },
hfslice: { type: 'string', length: 1024, default: 'Slice once every 4 sentences', nullable: true },
hftopK: { type: 'integer', default: 15 },
hftopP: { type: 'numeric', precision: 4, scale: 2, default: 1.00 },
hfTemperature: { type: 'numeric', precision: 4, scale: 2, default: 1.00 },
hfnrm: { type: 'boolean', default: false },
hfSpeedRate: { type: 'numeric', precision: 4, scale: 2, default: 1.25 },
hfdas: { type: 'boolean', default: false },
enableEmail: { type: 'boolean' }, enableEmail: { type: 'boolean' },
email: { type: 'string', nullable: true }, email: { type: 'string', nullable: true },
smtpSecure: { type: 'boolean' }, smtpSecure: { type: 'boolean' },
@ -525,6 +537,74 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.hfAuthKey = ps.hfAuthKey; set.hfAuthKey = ps.hfAuthKey;
} }
} }
if (ps.hfSpace !== undefined) {
set.hfSpace = ps.hfSpace;
}
if (ps.hfSpaceName !== undefined) {
if (ps.hfSpaceName === '') {
set.hfSpaceName = null;
} else {
set.hfSpaceName = ps.hfSpaceName;
}
}
if (ps.hfexampleAudioURL !== undefined) {
if (ps.hfexampleAudioURL === '') {
set.hfexampleAudioURL = null;
} else {
set.hfexampleAudioURL = ps.hfexampleAudioURL;
}
}
if (ps.hfexampleText !== undefined) {
if (ps.hfexampleText === '') {
set.hfexampleText = null;
} else {
set.hfexampleText = ps.hfexampleText;
}
}
if (ps.hfexampleLang !== undefined) {
if (ps.hfexampleLang === '') {
set.hfexampleLang = null;
} else {
set.hfexampleLang = ps.hfexampleLang;
}
}
if (ps.hfslice !== undefined) {
if (ps.hfslice === '') {
set.hfslice = null;
} else {
set.hfslice = ps.hfslice;
}
}
if (ps.hftopK !== undefined) {
set.hftopK = ps.hftopK;
}
if (ps.hftopP !== undefined) {
set.hftopP = ps.hftopP;
}
if (ps.hfTemperature !== undefined) {
set.hfTemperature = ps.hfTemperature;
}
if (ps.hfnrm !== undefined) {
set.hfnrm = ps.hfnrm;
}
if (ps.hfSpeedRate !== undefined) {
set.hfSpeedRate = ps.hfSpeedRate;
}
if (ps.hfdas !== undefined) {
set.hfdas = ps.hfdas;
}
if (ps.enableIpLogging !== undefined) { if (ps.enableIpLogging !== undefined) {
set.enableIpLogging = ps.enableIpLogging; set.enableIpLogging = ps.enableIpLogging;

View File

@ -173,6 +173,7 @@ export const paramDef = {
preventAiLearning: { type: 'boolean' }, preventAiLearning: { type: 'boolean' },
isBot: { type: 'boolean' }, isBot: { type: 'boolean' },
isCat: { type: 'boolean' }, isCat: { type: 'boolean' },
isVI: { type: 'boolean' },
injectFeaturedNote: { type: 'boolean' }, injectFeaturedNote: { type: 'boolean' },
receiveAnnouncementEmail: { type: 'boolean' }, receiveAnnouncementEmail: { type: 'boolean' },
alwaysMarkNsfw: { type: 'boolean' }, alwaysMarkNsfw: { type: 'boolean' },
@ -323,6 +324,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle; if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle;
if (typeof ps.preventAiLearning === 'boolean') profileUpdates.preventAiLearning = ps.preventAiLearning; if (typeof ps.preventAiLearning === 'boolean') profileUpdates.preventAiLearning = ps.preventAiLearning;
if (typeof ps.isCat === 'boolean') updates.isCat = ps.isCat; if (typeof ps.isCat === 'boolean') updates.isCat = ps.isCat;
if (typeof ps.isVI === 'boolean') updates.isVI = ps.isVI;
if (typeof ps.injectFeaturedNote === 'boolean') profileUpdates.injectFeaturedNote = ps.injectFeaturedNote; if (typeof ps.injectFeaturedNote === 'boolean') profileUpdates.injectFeaturedNote = ps.injectFeaturedNote;
if (typeof ps.receiveAnnouncementEmail === 'boolean') profileUpdates.receiveAnnouncementEmail = ps.receiveAnnouncementEmail; if (typeof ps.receiveAnnouncementEmail === 'boolean') profileUpdates.receiveAnnouncementEmail = ps.receiveAnnouncementEmail;
if (typeof ps.alwaysMarkNsfw === 'boolean') { if (typeof ps.alwaysMarkNsfw === 'boolean') {

View File

@ -4,6 +4,7 @@
*/ */
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { Client } from "@gradio/client";
import { Endpoint } from '@/server/api/endpoint-base.js'; import { Endpoint } from '@/server/api/endpoint-base.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { MetaService } from '@/core/MetaService.js'; import { MetaService } from '@/core/MetaService.js';
@ -25,6 +26,11 @@ export const meta = {
}, },
errors: { errors: {
incorrectconfig: {
message: 'Incorrect configuration.',
code: 'INCORRECT_CONFIG',
id: '8d171e60-83b8-11ef-b98c-a7506d6c1de4',
},
unavailable: { unavailable: {
message: 'Convert of notes unavailable.', message: 'Convert of notes unavailable.',
code: 'UNAVAILABLE', code: 'UNAVAILABLE',
@ -85,29 +91,85 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.unavailable); throw new ApiError(meta.errors.unavailable);
} }
const endpoint = 'https://api-inference.huggingface.co/models/suno/bark'; if (instance.hfSpace) {
const langlist = ['Chinese', 'English', 'Japanese', 'Yue', 'Korean', 'Chinese-English Mixed', 'Japanese-English Mixed', 'Yue-English Mixed', 'Korean-English Mixed', 'Multilingual Mixed', 'Multilingual Mixed(Yue)'];
const slicelist = ['No slice', 'Slice once every 4 sentences', 'Slice per 50 characters', 'Slice by Chinese punct', 'Slice by English punct', 'Slice by every punct'];
let exampleAudio;
let app;
const res = await this.httpRequestService.send(endpoint, { try {
method: 'POST', const example = await fetch(instance.hfexampleAudioURL);
headers: { exampleAudio = await example.blob();
'Content-Type': 'application/json', } catch {
'Authorization': 'Bearer ' + instance.hfAuthKey, throw new ApiError(meta.errors.unavailable);
Accept: 'audio/flac, */*', }
},
body: JSON.stringify({
inputs: note.text,
}),
timeout: 60000,
});
let contentType = res.headers.get('Content-Type') || 'application/octet-stream'; if (((!instance.hfnrm) && (!instance.hfexampleText)) || (!langlist.includes(instance.hfexampleLang)) || (!slicelist.includes(instance.hfslice)) || (!instance.hfSpaceName) || (!(instance.hfSpeedRate >= 0.6 && instance.hfSpeedRate <= 1.65)) || (!(instance.hfTemperature >= 0 && instance.hfTemperature <= 1)) || (!(instance.hftopK >= 0 && instance.hftopK <= 100)) || (!(instance.hftopP >= 0 && instance.hftopP <= 1))) {
throw new ApiError(meta.errors.incorrectconfig);
}
if (contentType === 'audio/flac') { try {
return res.body; app = await Client.connect(instance.hfSpaceName, { hf_token: instance.hfAuthKey });
} catch {
throw new ApiError(meta.errors.unavailable);
}
const result = await app.predict("/get_tts_wav", [
exampleAudio,
instance.hfexampleText,
instance.hfexampleLang,
note.text,
"Multilingual Mixed",
instance.hfslice,
instance.hftopK,
instance.hftopP,
instance.hfTemperature,
instance.hfnrm,
instance.hfSpeedRate,
instance.hfdas,
]);
let resurl = JSON.parse(result)[0].url;
const res = await this.httpRequestService.send(resurl, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + instance.hfAuthKey,
},
timeout: 60000,
});
let contentType = res.headers.get('Content-Type') || 'application/octet-stream';
if (contentType === 'audio/flac') {
return res.body;
} else {
throw new ApiError(meta.errors.unavailable);
}
} else { } else {
throw new ApiError(meta.errors.unavailable); const endpoint = 'https://api-inference.huggingface.co/models/suno/bark';
const res = await this.httpRequestService.send(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + instance.hfAuthKey,
Accept: 'audio/flac, */*',
},
body: JSON.stringify({
inputs: note.text,
}),
timeout: 60000,
});
let contentType = res.headers.get('Content-Type') || 'application/octet-stream';
if (contentType === 'audio/flac') {
return res.body;
} else {
throw new ApiError(meta.errors.unavailable);
}
} }
}); });
} }
} }

View File

@ -52,6 +52,7 @@ const exampleNote = reactive<Misskey.entities.Note>({
avatarBlurhash: 'eiKmhHIByXxZ~qWXs:-pR*NbR*s:xuRjoL-oR*WCt6WWf6WVf6oeWB', avatarBlurhash: 'eiKmhHIByXxZ~qWXs:-pR*NbR*s:xuRjoL-oR*WCt6WWf6WVf6oeWB',
isBot: false, isBot: false,
isCat: true, isCat: true,
isVI: false,
emojis: {}, emojis: {},
onlineStatus: 'unknown', onlineStatus: 'unknown',
badgeRoles: [], badgeRoles: [],

View File

@ -13,6 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<option value="isLocked">{{ i18n.ts._role._condition.isLocked }}</option> <option value="isLocked">{{ i18n.ts._role._condition.isLocked }}</option>
<option value="isBot">{{ i18n.ts._role._condition.isBot }}</option> <option value="isBot">{{ i18n.ts._role._condition.isBot }}</option>
<option value="isCat">{{ i18n.ts._role._condition.isCat }}</option> <option value="isCat">{{ i18n.ts._role._condition.isCat }}</option>
<option value="isVI">{{ i18n.ts._role._condition.isVI }}</option>
<option value="isExplorable">{{ i18n.ts._role._condition.isExplorable }}</option> <option value="isExplorable">{{ i18n.ts._role._condition.isExplorable }}</option>
<option value="roleAssignedTo">{{ i18n.ts._role._condition.roleAssignedTo }}</option> <option value="roleAssignedTo">{{ i18n.ts._role._condition.roleAssignedTo }}</option>
<option value="createdLessThan">{{ i18n.ts._role._condition.createdLessThan }}</option> <option value="createdLessThan">{{ i18n.ts._role._condition.createdLessThan }}</option>

View File

@ -5,36 +5,123 @@ SPDX-License-Identifier: AGPL-3.0-only
<template> <template>
<MkStickyContainer> <MkStickyContainer>
<template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template> <template #header><XHeader :actions="headerActions" :tabs="headerTabs"/></template>
<MkSpacer :contentMax="700" :marginMin="16" :marginMax="32"> <MkSpacer :contentMax="700" :marginMin="16" :marginMax="32">
<FormSuspense :p="init"> <FormSuspense :p="init">
<MkFolder> <MkFolder>
<template #label>DeepL Translation</template> <template #label>DeepL Translation</template>
<div class="_gaps_m"> <div class="_gaps_m">
<MkInput v-model="deeplAuthKey"> <MkInput v-model="deeplAuthKey">
<template #prefix><i class="ti ti-key"></i></template> <template #prefix><i class="ti ti-key"></i></template>
<template #label>DeepL Auth Key</template> <template #label>DeepL Auth Key</template>
</MkInput> </MkInput>
<MkSwitch v-model="deeplIsPro"> <MkSwitch v-model="deeplIsPro">
<template #label>Pro account</template> <template #label>Pro account</template>
</MkSwitch> </MkSwitch>
<MkButton primary @click="save_deepl">Save</MkButton> <MkButton primary @click="save_deepl">Save</MkButton>
</div> </div>
</MkFolder> </MkFolder>
<br /> <br />
<MkFolder> <MkFolder>
<template #label>Text-To-Speech</template> <template #label>Text-To-Speech</template>
<div class="_gaps_m"> <div class="_gaps_m">
<MkInput v-model="hfAuthKey"> <MkInput v-model="hfAuthKey">
<template #prefix><i class="ti ti-key"></i></template> <template #prefix><i class="ti ti-key"></i></template>
<template #label>HuggingFace Auth Key</template> <template #label>HuggingFace Auth Key</template>
</MkInput> </MkInput>
<MkButton primary @click="save_deepl">Save</MkButton> <MkSwitch v-model="hfSpace">
</div> <template #label>HuggingFace Space</template>
</MkFolder> </MkSwitch>
</FormSuspense> <div v-if="hfSpace">
</MkSpacer> <MkInput v-model="hfSpaceName">
<template #label>Space Name</template>
</MkInput>
<MkInput v-model="hfexampleAudioURL">
<template #label>Example Audio URL</template>
</MkInput>
<MkSwitch v-model="hfnrm">
<template #label>Enable no reference mode</template>
</MkSwitch>
<div v-if="!hfnrm">
<MkInput v-model="hfexampleText">
<template #label>Example Text</template>
</MkInput>
</div>
<label for="exampleLanguage">Example Language</label>
<select v-model="hfexampleLang" id="exampleLanguage">
<option value="" disabled> </option>
<option value="Chinese">中文</option>
<option value="English">English</option>
<option value="Japanese">日本語</option>
<option value="Yue">中文 (粤语)</option>
<option value="Korean">한국어</option>
<option value="Chinese-English Mixed">中文 - English</option>
<option value="Japanese-English Mixed">日本語 - English</option>
<option value="Yue-English Mixed">中文 (粤语) - English</option>
<option value="Korean-English Mixed">한국어 - English</option>
<option value="Multilingual Mixed">Multilingual Mixed</option>
<option value="Multilingual Mixed(Yue)">Multilingual Mixed (Yue)</option>
</select>
<MkSwitch v-model="hfdas">
<template #label>Whether to directly adjust the speech rate and timebre of the last synthesis result to prevent randomness</template>
</MkSwitch>
<label for="ttsslice">Slice</label>
<select v-model="hfslice" id="ttsslice">
<option value="" disabled> </option>
<option value="No slice">No slice</option>
<option value="Slice once every 4 sentences">Slice once every 4 sentences</option>
<option value="Slice per 50 characters">Slice per 50 characters</option>
<option value="Slice by Chinese punct">Slice by Chinese punct</option>
<option value="Slice by English punct">Slice by English punct</option>
<option value="Slice by every punct">Slice by every punct</option>
</select>
<label>Set top_k Value: {{ value }}</label>
<input
type="range"
v-model="hftopK"
:value="value = 15"
:min="0"
:max="100"
:step="1"
@input="value"
/>
<label>Set top_p Value: {{ value.toFixed(2) }}</label>
<input
type="range"
v-model="hftopP"
:value="value = 1"
:min="0"
:max="1"
:step="0.05"
@input="value = (Math.round(event.target.value / step) * step).toFixed(2)"
/>
<label>Set Temperature Value: {{ value.toFixed(2) }}</label>
<input
type="range"
v-model="hfTemperature"
:value="value = 1"
:min="0"
:max="1"
:step="0.05"
@input="value = (Math.round(event.target.value / step) * step).toFixed(2)"
/>
<label>Set Speed Rate Value: {{ value.toFixed(2) }}</label>
<input
type="range"
v-model="hfSpeedRate"
:value="value = 1.2"
:min="0.6"
:max="1.65"
:step="0.05"
@input="value = (Math.round(event.target.value / step) * step).toFixed(2)"
/>
</div>
<MkButton primary @click="save_tts">Save</MkButton>
</div>
</MkFolder>
</FormSuspense>
</MkSpacer>
</MkStickyContainer> </MkStickyContainer>
</template> </template>
@ -55,22 +142,66 @@ import MkFolder from '@/components/MkFolder.vue';
const deeplAuthKey = ref<string>(''); const deeplAuthKey = ref<string>('');
const deeplIsPro = ref<boolean>(false); const deeplIsPro = ref<boolean>(false);
const hfAuthKey = ref<string>(''); const hfAuthKey = ref<string>('');
const hfSpace = ref<boolean>(false);
const hfSpaceName = ref<string | null>(null);
const hfexampleAudioURL = ref<string | null>(null);
const hfexampleText = ref<string | null>(null);
const hfexampleLang = ref<string | null>(null);
const hfslice = ref<string | null>('Slice once every 4 sentences');
const hftopK = ref<number>(15);
const hftopP = ref<number>(1.00);
const hfTemperature = ref<number>(1.00);
const hfnrm = ref<boolean>(false);
const hfSpeedRate = ref<number>(1.25);
const hfdas = ref<boolean>(false);
async function init() { async function init() {
const meta = await misskeyApi('admin/meta'); const meta = await misskeyApi('admin/meta');
deeplAuthKey.value = meta.deeplAuthKey; deeplAuthKey.value = meta.deeplAuthKey;
deeplIsPro.value = meta.deeplIsPro; deeplIsPro.value = meta.deeplIsPro;
hfAuthKey.value = meta.hfAuthkey; hfAuthKey.value = meta.hfAuthkey;
hfSpace.value = meta.hfSpace,
hfSpaceName.value = meta.hfSpaceName,
hfexampleAudioURL.value = meta.hfexampleAudioURL,
hfexampleText.value = meta.hfexampleText,
hfexampleLang.value = meta.hfexampleLang,
hfslice.value = meta.hfslice,
hftopK.value = meta.hftopK,
hftopP.value = meta.hftopP,
hfTemperature.value = meta.hfTemperature,
hfnrm.value = meta.hfnrm,
hfSpeedRate.value = meta.hfSpeedRate,
hfdas.value = meta.hfdas,
} }
function save_deepl() { function save_deepl() {
os.apiWithDialog('admin/update-meta', { os.apiWithDialog('admin/update-meta', {
deeplAuthKey: deeplAuthKey.value, deeplAuthKey: deeplAuthKey.value,
deeplIsPro: deeplIsPro.value, deeplIsPro: deeplIsPro.value,
hfAuthKey: hfAuthKey.value, }).then(() => {
}).then(() => { fetchInstance(true);
fetchInstance(true); });
}); }
function save_tts() {
os.apiWithDialog('admin/update-meta', {
hfAuthKey: hfAuthKey.value,
hfSpace: hfSpace.value,
hfSpaceName: hfSpaceName.value,
hfexampleAudioURL: hfexampleAudioURL.value,
hfexampleText: hfexampleText.value,
hfexampleLang: hfexampleLang.value,
hfslice: hfslice.value,
hftopK: hftopK.value,
hftopP: hftopP.value,
hfTemperature: hfTemperature.value,
hfnrm: hfnrm.value,
hfSpeedRate: hfSpeedRate.value,
hfdas: hfdas.value,
}).then(() => {
fetchInstance(true);
});
} }
const headerActions = computed(() => []); const headerActions = computed(() => []);
@ -78,7 +209,7 @@ const headerActions = computed(() => []);
const headerTabs = computed(() => []); const headerTabs = computed(() => []);
definePageMetadata(() => ({ definePageMetadata(() => ({
title: i18n.ts.externalServices, title: i18n.ts.externalServices,
icon: 'ti ti-link', icon: 'ti ti-link',
})); }));
</script> </script>

View File

@ -110,6 +110,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div class="_gaps_m"> <div class="_gaps_m">
<MkSwitch v-model="profile.isCat">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></MkSwitch> <MkSwitch v-model="profile.isCat">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></MkSwitch>
<MkSwitch v-model="profile.isBot">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></MkSwitch> <MkSwitch v-model="profile.isBot">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></MkSwitch>
<MkSwitch v-model="profile.isVI">{{ i18n.ts.flagAsVI }}<template #caption>{{ i18n.ts.flagAsVIDescription }}</template></MkSwitch>
</div> </div>
</MkFolder> </MkFolder>
</div> </div>
@ -151,6 +152,7 @@ const profile = reactive({
lang: $i.lang, lang: $i.lang,
isBot: $i.isBot ?? false, isBot: $i.isBot ?? false,
isCat: $i.isCat ?? false, isCat: $i.isCat ?? false,
isVI: $i.isVI ?? false,
}); });
watch(() => profile, () => { watch(() => profile, () => {
@ -202,6 +204,7 @@ function save() {
lang: profile.lang || null, lang: profile.lang || null,
isBot: !!profile.isBot, isBot: !!profile.isBot,
isCat: !!profile.isCat, isCat: !!profile.isCat,
isVI: !!profile.isVI,
}); });
globalEvents.emit('requestClearPageCache'); globalEvents.emit('requestClearPageCache');
claimAchievement('profileFilled'); claimAchievement('profileFilled');

View File

@ -125,6 +125,9 @@ importers:
'@fastify/view': '@fastify/view':
specifier: 10.0.1 specifier: 10.0.1
version: 10.0.1 version: 10.0.1
'@gradio/client':
specifier: 1.6.0-beta.3
version: 1.6.0-beta.3(utf-8-validate@6.0.3)
'@misskey-dev/sharp-read-bmp': '@misskey-dev/sharp-read-bmp':
specifier: 1.2.0 specifier: 1.2.0
version: 1.2.0 version: 1.2.0
@ -1163,7 +1166,7 @@ importers:
version: 7.17.0(eslint@9.11.0)(typescript@5.6.2) version: 7.17.0(eslint@9.11.0)(typescript@5.6.2)
'@vitest/coverage-v8': '@vitest/coverage-v8':
specifier: 1.6.0 specifier: 1.6.0
version: 1.6.0(vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(sass@1.79.4)(terser@5.33.0)) version: 1.6.0(vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1)(sass@1.79.4)(terser@5.33.0))
'@vue/runtime-core': '@vue/runtime-core':
specifier: 3.5.11 specifier: 3.5.11
version: 3.5.11 version: 3.5.11
@ -2772,6 +2775,10 @@ packages:
resolution: {integrity: sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==} resolution: {integrity: sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==}
hasBin: true hasBin: true
'@gradio/client@1.6.0-beta.3':
resolution: {integrity: sha512-mJZVQ4UpfrSu71J4SkbSrpnbRotmB5ziy4fg7zqZhqXwXGZM3cHR9fUGkTFM0eXYnsaeBoiqn+1bcUh32Zcgkg==}
engines: {node: '>=18.0.0'}
'@hapi/boom@10.0.1': '@hapi/boom@10.0.1':
resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==}
@ -4633,6 +4640,9 @@ packages:
'@types/estree@1.0.6': '@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/eventsource@1.1.15':
resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==}
'@types/express-serve-static-core@4.17.33': '@types/express-serve-static-core@4.17.33':
resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==}
@ -6833,6 +6843,10 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'} engines: {node: '>=0.8.x'}
eventsource@2.0.2:
resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==}
engines: {node: '>=12.0.0'}
execa@0.7.0: execa@0.7.0:
resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -6975,6 +6989,9 @@ packages:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13} engines: {node: ^12.20 || >= 14.13}
fetch-event-stream@0.1.5:
resolution: {integrity: sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==}
figures@3.2.0: figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -10236,6 +10253,10 @@ packages:
seedrandom@3.0.5: seedrandom@3.0.5:
resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
semiver@1.1.0:
resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==}
engines: {node: '>=6'}
semver-regex@4.0.5: semver-regex@4.0.5:
resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -10806,6 +10827,9 @@ packages:
textarea-caret@3.1.0: textarea-caret@3.1.0:
resolution: {integrity: sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q==} resolution: {integrity: sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q==}
textlinestream@1.1.1:
resolution: {integrity: sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==}
thenify-all@1.6.0: thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
@ -13245,6 +13269,20 @@ snapshots:
'@github/webauthn-json@2.1.1': {} '@github/webauthn-json@2.1.1': {}
'@gradio/client@1.6.0-beta.3(utf-8-validate@6.0.3)':
dependencies:
'@types/eventsource': 1.1.15
bufferutil: 4.0.7
eventsource: 2.0.2
fetch-event-stream: 0.1.5
msw: 2.4.9(typescript@5.6.2)
semiver: 1.1.0
textlinestream: 1.1.1
typescript: 5.6.2
ws: 8.18.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)
transitivePeerDependencies:
- utf-8-validate
'@hapi/boom@10.0.1': '@hapi/boom@10.0.1':
dependencies: dependencies:
'@hapi/hoek': 11.0.4 '@hapi/hoek': 11.0.4
@ -15573,6 +15611,8 @@ snapshots:
'@types/estree@1.0.6': {} '@types/estree@1.0.6': {}
'@types/eventsource@1.1.15': {}
'@types/express-serve-static-core@4.17.33': '@types/express-serve-static-core@4.17.33':
dependencies: dependencies:
'@types/node': 20.14.12 '@types/node': 20.14.12
@ -15962,7 +16002,7 @@ snapshots:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.17.0
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
optionalDependencies: optionalDependencies:
typescript: 5.5.4 typescript: 5.5.4
@ -15975,7 +16015,7 @@ snapshots:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.17.0
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
@ -15988,7 +16028,7 @@ snapshots:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.17.0
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.8.0 eslint: 9.8.0
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
@ -16009,7 +16049,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3) '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.3.3)
'@typescript-eslint/utils': 7.1.0(eslint@9.11.0)(typescript@5.3.3) '@typescript-eslint/utils': 7.1.0(eslint@9.11.0)(typescript@5.3.3)
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
ts-api-utils: 1.0.1(typescript@5.3.3) ts-api-utils: 1.0.1(typescript@5.3.3)
optionalDependencies: optionalDependencies:
@ -16021,7 +16061,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4)
'@typescript-eslint/utils': 7.17.0(eslint@9.11.0)(typescript@5.5.4) '@typescript-eslint/utils': 7.17.0(eslint@9.11.0)(typescript@5.5.4)
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
ts-api-utils: 1.3.0(typescript@5.5.4) ts-api-utils: 1.3.0(typescript@5.5.4)
optionalDependencies: optionalDependencies:
@ -16033,7 +16073,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2)
'@typescript-eslint/utils': 7.17.0(eslint@9.11.0)(typescript@5.6.2) '@typescript-eslint/utils': 7.17.0(eslint@9.11.0)(typescript@5.6.2)
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
ts-api-utils: 1.3.0(typescript@5.6.2) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
@ -16045,7 +16085,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.6.2)
'@typescript-eslint/utils': 7.17.0(eslint@9.8.0)(typescript@5.6.2) '@typescript-eslint/utils': 7.17.0(eslint@9.8.0)(typescript@5.6.2)
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.8.0 eslint: 9.8.0
ts-api-utils: 1.3.0(typescript@5.6.2) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
@ -16061,7 +16101,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/types': 7.1.0 '@typescript-eslint/types': 7.1.0
'@typescript-eslint/visitor-keys': 7.1.0 '@typescript-eslint/visitor-keys': 7.1.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.3 minimatch: 9.0.3
@ -16076,7 +16116,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.17.0
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.4 minimatch: 9.0.4
@ -16091,7 +16131,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/types': 7.17.0 '@typescript-eslint/types': 7.17.0
'@typescript-eslint/visitor-keys': 7.17.0 '@typescript-eslint/visitor-keys': 7.17.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.4 minimatch: 9.0.4
@ -16175,7 +16215,7 @@ snapshots:
dependencies: dependencies:
'@ampproject/remapping': 2.2.1 '@ampproject/remapping': 2.2.1
'@bcoe/v8-coverage': 0.2.3 '@bcoe/v8-coverage': 0.2.3
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1 istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.4 istanbul-lib-source-maps: 5.0.4
@ -16190,11 +16230,11 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(sass@1.79.4)(terser@5.33.0))': '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1)(sass@1.79.4)(terser@5.33.0))':
dependencies: dependencies:
'@ampproject/remapping': 2.2.1 '@ampproject/remapping': 2.2.1
'@bcoe/v8-coverage': 0.2.3 '@bcoe/v8-coverage': 0.2.3
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1 istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.4 istanbul-lib-source-maps: 5.0.4
@ -16205,7 +16245,7 @@ snapshots:
std-env: 3.7.0 std-env: 3.7.0
strip-literal: 2.1.0 strip-literal: 2.1.0
test-exclude: 6.0.0 test-exclude: 6.0.0
vitest: 1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(sass@1.79.4)(terser@5.33.0) vitest: 1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1)(sass@1.79.4)(terser@5.33.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -16515,7 +16555,7 @@ snapshots:
agent-base@7.1.0: agent-base@7.1.0:
dependencies: dependencies:
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -17001,7 +17041,6 @@ snapshots:
bufferutil@4.0.7: bufferutil@4.0.7:
dependencies: dependencies:
node-gyp-build: 4.6.0 node-gyp-build: 4.6.0
optional: true
bufferutil@4.0.8: bufferutil@4.0.8:
dependencies: dependencies:
@ -18638,6 +18677,8 @@ snapshots:
events@3.3.0: {} events@3.3.0: {}
eventsource@2.0.2: {}
execa@0.7.0: execa@0.7.0:
dependencies: dependencies:
cross-spawn: 5.1.0 cross-spawn: 5.1.0
@ -18885,6 +18926,8 @@ snapshots:
node-domexception: 1.0.0 node-domexception: 1.0.0
web-streams-polyfill: 3.2.1 web-streams-polyfill: 3.2.1
fetch-event-stream@0.1.5: {}
figures@3.2.0: figures@3.2.0:
dependencies: dependencies:
escape-string-regexp: 1.0.5 escape-string-regexp: 1.0.5
@ -19487,7 +19530,7 @@ snapshots:
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
dependencies: dependencies:
agent-base: 7.1.0 agent-base: 7.1.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -19526,7 +19569,7 @@ snapshots:
https-proxy-agent@5.0.1: https-proxy-agent@5.0.1:
dependencies: dependencies:
agent-base: 6.0.2 agent-base: 6.0.2
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
optional: true optional: true
@ -19534,14 +19577,14 @@ snapshots:
https-proxy-agent@7.0.2: https-proxy-agent@7.0.2:
dependencies: dependencies:
agent-base: 7.1.0 agent-base: 7.1.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
https-proxy-agent@7.0.5: https-proxy-agent@7.0.5:
dependencies: dependencies:
agent-base: 7.1.0 agent-base: 7.1.0
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -19914,7 +19957,7 @@ snapshots:
istanbul-lib-source-maps@5.0.4: istanbul-lib-source-maps@5.0.4:
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -20315,6 +20358,35 @@ snapshots:
jsdoc-type-pratt-parser@4.1.0: {} jsdoc-type-pratt-parser@4.1.0: {}
jsdom@24.1.1:
dependencies:
cssstyle: 4.0.1
data-urls: 5.0.0
decimal.js: 10.4.3
form-data: 4.0.0
html-encoding-sniffer: 4.0.0
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.5
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.12
parse5: 7.1.2
rrweb-cssom: 0.7.1
saxes: 6.0.0
symbol-tree: 3.2.4
tough-cookie: 4.1.4
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
optional: true
jsdom@24.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3): jsdom@24.1.1(bufferutil@4.0.7)(utf-8-validate@6.0.3):
dependencies: dependencies:
cssstyle: 4.0.1 cssstyle: 4.0.1
@ -21361,8 +21433,7 @@ snapshots:
node-gyp-build-optional-packages@5.0.7: node-gyp-build-optional-packages@5.0.7:
optional: true optional: true
node-gyp-build@4.6.0: node-gyp-build@4.6.0: {}
optional: true
node-gyp@10.2.0: node-gyp@10.2.0:
dependencies: dependencies:
@ -22741,6 +22812,8 @@ snapshots:
seedrandom@3.0.5: {} seedrandom@3.0.5: {}
semiver@1.1.0: {}
semver-regex@4.0.5: {} semver-regex@4.0.5: {}
semver-truncate@2.0.0: semver-truncate@2.0.0:
@ -22889,7 +22962,7 @@ snapshots:
dependencies: dependencies:
'@hapi/hoek': 11.0.4 '@hapi/hoek': 11.0.4
'@hapi/wreck': 18.0.1 '@hapi/wreck': 18.0.1
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
joi: 17.11.0 joi: 17.11.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -23376,6 +23449,8 @@ snapshots:
textarea-caret@3.1.0: {} textarea-caret@3.1.0: {}
textlinestream@1.1.1: {}
thenify-all@1.6.0: thenify-all@1.6.0:
dependencies: dependencies:
thenify: 3.3.1 thenify: 3.3.1
@ -23849,7 +23924,7 @@ snapshots:
vite-node@1.6.0(@types/node@20.14.12)(sass@1.79.3)(terser@5.33.0): vite-node@1.6.0(@types/node@20.14.12)(sass@1.79.3)(terser@5.33.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.0.1 picocolors: 1.0.1
vite: 5.4.8(@types/node@20.14.12)(sass@1.79.3)(terser@5.33.0) vite: 5.4.8(@types/node@20.14.12)(sass@1.79.3)(terser@5.33.0)
@ -23867,7 +23942,7 @@ snapshots:
vite-node@1.6.0(@types/node@20.14.12)(sass@1.79.4)(terser@5.33.0): vite-node@1.6.0(@types/node@20.14.12)(sass@1.79.4)(terser@5.33.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
pathe: 1.1.2 pathe: 1.1.2
picocolors: 1.0.1 picocolors: 1.0.1
vite: 5.4.8(@types/node@20.14.12)(sass@1.79.4)(terser@5.33.0) vite: 5.4.8(@types/node@20.14.12)(sass@1.79.4)(terser@5.33.0)
@ -23949,7 +24024,7 @@ snapshots:
- supports-color - supports-color
- terser - terser
vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(sass@1.79.4)(terser@5.33.0): vitest@1.6.0(@types/node@20.14.12)(happy-dom@10.0.3)(jsdom@24.1.1)(sass@1.79.4)(terser@5.33.0):
dependencies: dependencies:
'@vitest/expect': 1.6.0 '@vitest/expect': 1.6.0
'@vitest/runner': 1.6.0 '@vitest/runner': 1.6.0
@ -23974,7 +24049,7 @@ snapshots:
optionalDependencies: optionalDependencies:
'@types/node': 20.14.12 '@types/node': 20.14.12
happy-dom: 10.0.3 happy-dom: 10.0.3
jsdom: 24.1.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) jsdom: 24.1.1
transitivePeerDependencies: transitivePeerDependencies:
- less - less
- lightningcss - lightningcss
@ -24046,7 +24121,7 @@ snapshots:
vue-eslint-parser@9.4.3(eslint@9.11.0): vue-eslint-parser@9.4.3(eslint@9.11.0):
dependencies: dependencies:
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@8.1.1)
eslint: 9.11.0 eslint: 9.11.0
eslint-scope: 7.2.2 eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3