diff --git a/packages/frontend/src/components/MkNoteSub.vue b/packages/frontend/src/components/MkNoteSub.vue
index 422e9094c..1e901a1fd 100644
--- a/packages/frontend/src/components/MkNoteSub.vue
+++ b/packages/frontend/src/components/MkNoteSub.vue
@@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index d163ea248..07c721320 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -73,7 +73,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
@@ -72,6 +77,7 @@ import FormLink from '@/components/form/link.vue';
let enableRegistration: boolean = $ref(false);
let emailRequiredForSignup: boolean = $ref(false);
let sensitiveWords: string = $ref('');
+let hiddenTags: string = $ref('');
let preservedUsernames: string = $ref('');
let tosUrl: string | null = $ref(null);
let privacyPolicyUrl: string | null = $ref(null);
@@ -81,6 +87,7 @@ async function init() {
enableRegistration = !meta.disableRegistration;
emailRequiredForSignup = meta.emailRequiredForSignup;
sensitiveWords = meta.sensitiveWords.join('\n');
+ hiddenTags = meta.hiddenTags.join('\n');
preservedUsernames = meta.preservedUsernames.join('\n');
tosUrl = meta.tosUrl;
privacyPolicyUrl = meta.privacyPolicyUrl;
@@ -93,6 +100,7 @@ function save() {
tosUrl,
privacyPolicyUrl,
sensitiveWords: sensitiveWords.split('\n'),
+ hiddenTags: hiddenTags.split('\n'),
preservedUsernames: preservedUsernames.split('\n'),
}).then(() => {
fetchInstance();
From 47a10f6a6df1bfbb90af519e1b34996a328d28ca Mon Sep 17 00:00:00 2001
From: Kisaragi <48310258+KisaragiEffective@users.noreply.github.com>
Date: Thu, 30 Nov 2023 14:46:16 +0900
Subject: [PATCH 11/76] refactor(frontend): give local variable to explicit
type annotation to avoid TS7043 (#12495)
* refactor: give local variable to explicit type annotation to avoid TS7043
* chore: fix lint error
---
.../src/components/global/MkMisskeyFlavoredMarkdown.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
index c5f247bce..d4c3ef60a 100644
--- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
+++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
@@ -103,7 +103,7 @@ export default function(props: MfmProps) {
case 'fn': {
// TODO: CSSを文字列で組み立てていくと token.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる
- let style;
+ let style: string | undefined;
switch (token.props.name) {
case 'tada': {
const speed = validTime(token.props.args.speed) ?? '1s';
@@ -268,7 +268,7 @@ export default function(props: MfmProps) {
]);
}
}
- if (style == null) {
+ if (style === undefined) {
return h('span', {}, ['$[', token.props.name, ' ', ...genEl(token.children, scale), ']']);
} else {
return h('span', {
From 4f6e0985423950d1ad1d279cb2c019cf8814828d Mon Sep 17 00:00:00 2001
From: Cocoa Hoto
Date: Thu, 30 Nov 2023 14:47:08 +0900
Subject: [PATCH 12/76] fix(docker): cannot build docker image on some
environments (#12494)
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 028a3976d..38aa5bc7b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -67,8 +67,8 @@ RUN apt-get update \
&& corepack enable \
&& groupadd -g "${GID}" misskey \
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
- && find / -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
- && find / -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
+ && find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
+ && find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists
From 22d6fa1fdf1dd4b61673d10cac6ca866dd5f26d8 Mon Sep 17 00:00:00 2001
From: yukineko <27853966+hideki0403@users.noreply.github.com>
Date: Thu, 30 Nov 2023 14:48:02 +0900
Subject: [PATCH 13/76] =?UTF-8?q?enhance(dev):=20=E9=96=8B=E7=99=BA?=
=?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E6=99=82=E3=81=ABlocale=E3=81=A8?=
=?UTF-8?q?=E5=9E=8B=E5=AE=9A=E7=BE=A9=E3=81=8C=E8=87=AA=E5=8B=95=E7=9A=84?=
=?UTF-8?q?=E3=81=AB=E5=86=8D=E7=94=9F=E6=88=90=E3=81=95=E3=82=8C=E3=82=8B?=
=?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=20(#12481)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* enhance: localeを任意のタイミングでリビルドできるように
* enhance: localeも監視し、必要であればlocaleをリビルドするように
* feat: devモードの時のみナビゲーションバーからキャッシュクリアができるように
* refactor: キャッシュクリア部分を共通化
* fix: localesのファイル変更イベントが取れないのを修正
* fix: replaceAllでコケるのを修正
* change: 開発モードに関係なくナビゲーションバーからキャッシュクリアできるように
* refactor: 必要のないリビルドをしないように
* update: CHANGELOG.md
---------
Co-authored-by: syuilo
---
CHANGELOG.md | 1 +
locales/generateDTS.js | 12 ++++
locales/index.d.ts | 1 +
locales/index.js | 58 ++++++++++---------
packages/frontend/src/navbar.ts | 8 +++
.../frontend/src/pages/settings/index.vue | 12 +---
packages/frontend/src/scripts/clear-cache.ts | 14 +++++
scripts/build-assets.mjs | 18 +++---
8 files changed, 80 insertions(+), 44 deletions(-)
create mode 100644 packages/frontend/src/scripts/clear-cache.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a41c2cef..db26ffc8e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@
- Enhance: ユーザーのRawデータを表示するページが復活
- Enhance: リアクション選択時に音を鳴らせるように
- Enhance: サウンドにドライブのファイルを使用できるように
+- Enhance: ナビゲーションバーに項目「キャッシュを削除」を追加
- Enhance: Shareページで投稿を完了すると、親ウィンドウ(親フレーム)にpostMessageするように
- Enhance: チャンネル、クリップ、ページ、Play、ギャラリーにURLのコピーボタンを設置 #11305
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
diff --git a/locales/generateDTS.js b/locales/generateDTS.js
index 7af773f3b..d3afdd6e1 100644
--- a/locales/generateDTS.js
+++ b/locales/generateDTS.js
@@ -56,6 +56,18 @@ export default function generateDTS() {
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags,
),
),
+ ts.factory.createFunctionDeclaration(
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
+ undefined,
+ ts.factory.createIdentifier('build'),
+ undefined,
+ [],
+ ts.factory.createTypeReferenceNode(
+ ts.factory.createIdentifier('Locale'),
+ undefined,
+ ),
+ undefined,
+ ),
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
];
const printed = ts.createPrinter({
diff --git a/locales/index.d.ts b/locales/index.d.ts
index d72e7d29f..6036c6fa6 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -2505,4 +2505,5 @@ export interface Locale {
declare const locales: {
[lang: string]: Locale;
};
+export function build(): Locale;
export default locales;
diff --git a/locales/index.js b/locales/index.js
index 67a406d98..650e55233 100644
--- a/locales/index.js
+++ b/locales/index.js
@@ -51,33 +51,37 @@ const primaries = {
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
-const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
+export function build() {
+ const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
-// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
-const removeEmpty = (obj) => {
- for (const [k, v] of Object.entries(obj)) {
- if (v === '') {
- delete obj[k];
- } else if (typeof v === 'object') {
- removeEmpty(v);
+ // 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
+ const removeEmpty = (obj) => {
+ for (const [k, v] of Object.entries(obj)) {
+ if (v === '') {
+ delete obj[k];
+ } else if (typeof v === 'object') {
+ removeEmpty(v);
+ }
}
- }
- return obj;
-};
-removeEmpty(locales);
+ return obj;
+ };
+ removeEmpty(locales);
-export default Object.entries(locales)
- .reduce((a, [k ,v]) => (a[k] = (() => {
- const [lang] = k.split('-');
- switch (k) {
- case 'ja-JP': return v;
- case 'ja-KS':
- case 'en-US': return merge(locales['ja-JP'], v);
- default: return merge(
- locales['ja-JP'],
- locales['en-US'],
- locales[`${lang}-${primaries[lang]}`] ?? {},
- v
- );
- }
- })(), a), {});
+ return Object.entries(locales)
+ .reduce((a, [k, v]) => (a[k] = (() => {
+ const [lang] = k.split('-');
+ switch (k) {
+ case 'ja-JP': return v;
+ case 'ja-KS':
+ case 'en-US': return merge(locales['ja-JP'], v);
+ default: return merge(
+ locales['ja-JP'],
+ locales['en-US'],
+ locales[`${lang}-${primaries[lang]}`] ?? {},
+ v
+ );
+ }
+ })(), a), {});
+}
+
+export default build();
diff --git a/packages/frontend/src/navbar.ts b/packages/frontend/src/navbar.ts
index f0ed773f8..78a0945dd 100644
--- a/packages/frontend/src/navbar.ts
+++ b/packages/frontend/src/navbar.ts
@@ -12,6 +12,7 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { ui } from '@/config.js';
import { unisonReload } from '@/scripts/unison-reload.js';
+import { clearCache } from './scripts/clear-cache.js';
export const navbarItemDef = reactive({
notifications: {
@@ -171,4 +172,11 @@ export const navbarItemDef = reactive({
show: computed(() => $i != null),
to: `/@${$i?.username}`,
},
+ cacheClear: {
+ title: i18n.ts.cacheClear,
+ icon: 'ti ti-trash',
+ action: (ev) => {
+ clearCache();
+ },
+ },
});
diff --git a/packages/frontend/src/pages/settings/index.vue b/packages/frontend/src/pages/settings/index.vue
index 361a6c8c7..5a1a9aedb 100644
--- a/packages/frontend/src/pages/settings/index.vue
+++ b/packages/frontend/src/pages/settings/index.vue
@@ -33,13 +33,11 @@ import { i18n } from '@/i18n.js';
import MkInfo from '@/components/MkInfo.vue';
import MkSuperMenu from '@/components/MkSuperMenu.vue';
import { signout, $i } from '@/account.js';
-import { unisonReload } from '@/scripts/unison-reload.js';
+import { clearCache } from '@/scripts/clear-cache.js';
import { instance } from '@/instance.js';
import { useRouter } from '@/router.js';
import { definePageMetadata, provideMetadataReceiver } from '@/scripts/page-metadata.js';
import * as os from '@/os.js';
-import { miLocalStorage } from '@/local-storage.js';
-import { fetchCustomEmojis } from '@/custom-emojis.js';
const indexInfo = {
title: i18n.ts.settings,
@@ -182,13 +180,7 @@ const menuDef = computed(() => [{
icon: 'ti ti-trash',
text: i18n.ts.clearCache,
action: async () => {
- os.waiting();
- miLocalStorage.removeItem('locale');
- miLocalStorage.removeItem('theme');
- miLocalStorage.removeItem('emojis');
- miLocalStorage.removeItem('lastEmojisFetchedAt');
- await fetchCustomEmojis(true);
- unisonReload();
+ await clearCache();
},
}, {
type: 'button',
diff --git a/packages/frontend/src/scripts/clear-cache.ts b/packages/frontend/src/scripts/clear-cache.ts
new file mode 100644
index 000000000..5f27254b8
--- /dev/null
+++ b/packages/frontend/src/scripts/clear-cache.ts
@@ -0,0 +1,14 @@
+import { unisonReload } from '@/scripts/unison-reload.js';
+import * as os from '@/os.js';
+import { miLocalStorage } from '@/local-storage.js';
+import { fetchCustomEmojis } from '@/custom-emojis.js';
+
+export async function clearCache() {
+ os.waiting();
+ miLocalStorage.removeItem('locale');
+ miLocalStorage.removeItem('theme');
+ miLocalStorage.removeItem('emojis');
+ miLocalStorage.removeItem('lastEmojisFetchedAt');
+ await fetchCustomEmojis(true);
+ unisonReload();
+}
diff --git a/scripts/build-assets.mjs b/scripts/build-assets.mjs
index 1ffcec8aa..f8f09ec2f 100644
--- a/scripts/build-assets.mjs
+++ b/scripts/build-assets.mjs
@@ -9,10 +9,12 @@ import cssnano from 'cssnano';
import postcss from 'postcss';
import * as terser from 'terser';
-import locales from '../locales/index.js';
+import { build as buildLocales } from '../locales/index.js';
import generateDTS from '../locales/generateDTS.js';
import meta from '../package.json' assert { type: "json" };
+let locales = buildLocales();
+
async function copyFrontendFonts() {
await fs.cp('./packages/frontend/node_modules/three/examples/fonts', './built/_frontend_dist_/fonts', { dereference: true, recursive: true });
}
@@ -89,10 +91,12 @@ async function build() {
await build();
if (process.argv.includes("--watch")) {
- const watcher = fs.watch('./packages', { recursive: true });
- for await (const event of watcher) {
- if (/^[a-z]+\/src/.test(event.filename)) {
- await build();
- }
- }
+ const watcher = fs.watch('./locales');
+ for await (const event of watcher) {
+ const filename = event.filename?.replaceAll('\\', '/');
+ if (/^[a-z]+-[A-Z]+\.yml/.test(filename)) {
+ locales = buildLocales();
+ await copyFrontendLocales()
+ }
+ }
}
From b05d71fabff55ac5653994a1188c6db88048e8ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?=
<67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Thu, 30 Nov 2023 14:49:26 +0900
Subject: [PATCH 14/76] =?UTF-8?q?feat(frontend):=20=E4=BB=8A=E6=97=A5?=
=?UTF-8?q?=E8=AA=95=E7=94=9F=E6=97=A5=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AD?=
=?UTF-8?q?=E3=83=BC=E4=B8=AD=E3=81=AE=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?=
=?UTF-8?q?=E3=82=92=E4=B8=80=E8=A6=A7=E8=A1=A8=E7=A4=BA=E3=81=A7=E3=81=8D?=
=?UTF-8?q?=E3=82=8B=E3=82=A6=E3=82=A3=E3=82=B8=E3=82=A7=E3=83=83=E3=83=88?=
=?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20(#12450)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* (add) 今日誕生日のフォロイー一覧表示
* Update Changelog
* Update Changelog
* 実装漏れ
* create index
* (fix) index
---
CHANGELOG.md | 1 +
locales/index.d.ts | 1 +
locales/ja-JP.yml | 1 +
.../migration/1700902349231-add-bday-index.js | 16 +++
packages/backend/src/models/UserProfile.ts | 1 +
.../server/api/endpoints/users/following.ts | 23 ++++
.../src/widgets/WidgetBirthdayFollowings.vue | 127 ++++++++++++++++++
packages/frontend/src/widgets/index.ts | 2 +
8 files changed, 172 insertions(+)
create mode 100644 packages/backend/migration/1700902349231-add-bday-index.js
create mode 100644 packages/frontend/src/widgets/WidgetBirthdayFollowings.vue
diff --git a/CHANGELOG.md b/CHANGELOG.md
index db26ffc8e..e40c5f0fd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@
- Fix: MFM `$[unixtime ]` に不正な値を入力した際に発生する各種エラーを修正
### Client
+- Feat: 今日誕生日のフォロー中のユーザーを一覧表示できるウィジェットを追加
- Enhance: 絵文字のオートコンプリート機能強化 #12364
- Enhance: ユーザーのRawデータを表示するページが復活
- Enhance: リアクション選択時に音を鳴らせるように
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 6036c6fa6..d46281649 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -2110,6 +2110,7 @@ export interface Locale {
"chooseList": string;
};
"clicker": string;
+ "birthdayFollowings": string;
};
"_cw": {
"hide": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 0f4164652..aa3cdf075 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -2014,6 +2014,7 @@ _widgets:
_userList:
chooseList: "リストを選択"
clicker: "クリッカー"
+ birthdayFollowings: "今日誕生日のユーザー"
_cw:
hide: "隠す"
diff --git a/packages/backend/migration/1700902349231-add-bday-index.js b/packages/backend/migration/1700902349231-add-bday-index.js
new file mode 100644
index 000000000..251526fc2
--- /dev/null
+++ b/packages/backend/migration/1700902349231-add-bday-index.js
@@ -0,0 +1,16 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class AddBdayIndex1700902349231 {
+ name = 'AddBdayIndex1700902349231'
+
+ async up(queryRunner) {
+ await queryRunner.query(`CREATE INDEX "IDX_de22cd2b445eee31ae51cdbe99" ON "user_profile" (SUBSTR("birthday", 6, 5))`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`DROP INDEX "public"."IDX_de22cd2b445eee31ae51cdbe99"`);
+ }
+}
diff --git a/packages/backend/src/models/UserProfile.ts b/packages/backend/src/models/UserProfile.ts
index 8a43b6003..6659a0141 100644
--- a/packages/backend/src/models/UserProfile.ts
+++ b/packages/backend/src/models/UserProfile.ts
@@ -29,6 +29,7 @@ export class MiUserProfile {
})
public location: string | null;
+ @Index()
@Column('char', {
length: 10, nullable: true,
comment: 'The birthday (YYYY-MM-DD) of the User.',
diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts
index 03487275a..ead7ba8c4 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -42,6 +42,12 @@ export const meta = {
code: 'FORBIDDEN',
id: 'f6cdb0df-c19f-ec5c-7dbb-0ba84a1f92ba',
},
+
+ birthdayInvalid: {
+ message: 'Birthday date format is invalid.',
+ code: 'BIRTHDAY_DATE_FORMAT_INVALID',
+ id: 'a2b007b9-4782-4eba-abd3-93b05ed4130d',
+ },
},
} as const;
@@ -59,6 +65,8 @@ export const paramDef = {
nullable: true,
description: 'The local host is represented with `null`.',
},
+
+ birthday: { type: 'string', nullable: true },
},
anyOf: [
{ required: ['userId'] },
@@ -117,6 +125,21 @@ export default class extends Endpoint { // eslint-
.andWhere('following.followerId = :userId', { userId: user.id })
.innerJoinAndSelect('following.followee', 'followee');
+ if (ps.birthday) {
+ try {
+ const d = new Date(ps.birthday);
+ d.setHours(0, 0, 0, 0);
+ const birthday = `${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`;
+ const birthdayUserQuery = this.userProfilesRepository.createQueryBuilder('user_profile');
+ birthdayUserQuery.select('user_profile.userId')
+ .where(`SUBSTR(user_profile.birthday, 6, 5) = '${birthday}'`);
+
+ query.andWhere(`following.followeeId IN (${ birthdayUserQuery.getQuery() })`);
+ } catch (err) {
+ throw new ApiError(meta.errors.birthdayInvalid);
+ }
+ }
+
const followings = await query
.limit(ps.limit)
.getMany();
diff --git a/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue b/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue
new file mode 100644
index 000000000..7c4455516
--- /dev/null
+++ b/packages/frontend/src/widgets/WidgetBirthdayFollowings.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+ {{ i18n.ts._widgets.birthdayFollowings }}
+
+
+
+
+
+
+
+
![]()
+
{{ i18n.ts.nothing }}
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/widgets/index.ts b/packages/frontend/src/widgets/index.ts
index 405c49ab0..36925e1bd 100644
--- a/packages/frontend/src/widgets/index.ts
+++ b/packages/frontend/src/widgets/index.ts
@@ -33,6 +33,7 @@ export default function(app: App) {
app.component('WidgetAichan', defineAsyncComponent(() => import('./WidgetAichan.vue')));
app.component('WidgetUserList', defineAsyncComponent(() => import('./WidgetUserList.vue')));
app.component('WidgetClicker', defineAsyncComponent(() => import('./WidgetClicker.vue')));
+ app.component('WidgetBirthdayFollowings', defineAsyncComponent(() => import('./WidgetBirthdayFollowings.vue')));
}
export const widgets = [
@@ -63,4 +64,5 @@ export const widgets = [
'aichan',
'userList',
'clicker',
+ 'birthdayFollowings',
];
From e500fe2586cdf9a60ac75b45f33be99dfd4122bf Mon Sep 17 00:00:00 2001
From: Srgr0 <66754887+Srgr0@users.noreply.github.com>
Date: Thu, 30 Nov 2023 14:59:42 +0900
Subject: [PATCH 15/76] =?UTF-8?q?=E7=B5=B5=E6=96=87=E5=AD=97=E8=A9=B3?=
=?UTF-8?q?=E7=B4=B0=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=AB=E8=A8=98=E8=BC=89?=
=?UTF-8?q?=E3=81=99=E3=82=8B=E6=83=85=E5=A0=B1=E3=82=92=E8=BF=BD=E5=8A=A0?=
=?UTF-8?q?=20(#12417)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Update emojis.emoji.vue
* Update CHANGELOG.md
---------
Co-authored-by: syuilo
---
CHANGELOG.md | 1 +
packages/frontend/src/pages/emojis.emoji.vue | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e40c5f0fd..d32b46f63 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -32,6 +32,7 @@
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
- fix: 「設定のバックアップ」で一部の項目がバックアップに含まれていなかった問題を修正
- Fix: ウィジェットのジョブキューにて音声の発音方法変更に追従できていなかったのを修正 #12367
+- Enhance: 絵文字の詳細ページに記載される情報を追加
- Fix: コードエディタが正しく表示されない問題を修正
- Fix: プロフィールの「ファイル」にセンシティブな画像がある際のデザインを修正
- Fix: 一度に大量の通知が入った際に通知音が音割れする問題を修正
diff --git a/packages/frontend/src/pages/emojis.emoji.vue b/packages/frontend/src/pages/emojis.emoji.vue
index 9aaa7890a..9ba9047ca 100644
--- a/packages/frontend/src/pages/emojis.emoji.vue
+++ b/packages/frontend/src/pages/emojis.emoji.vue
@@ -46,7 +46,7 @@ function menu(ev) {
os.apiGet('emoji', { name: props.emoji.name }).then(res => {
os.alert({
type: 'info',
- text: `License: ${res.license}`,
+ text: `Name: ${res.name}\nAliases: ${res.aliases.join(' ')}\nCategory: ${res.category}\nisSensitive: ${res.isSensitive}\nlocalOnly: ${res.localOnly}\nLicense: ${res.license}\nURL: ${res.url}`,
});
});
},
From ca424df80e3072ee5f3971f0c3e97e7d3f34b57c Mon Sep 17 00:00:00 2001
From: yupix
Date: Thu, 30 Nov 2023 15:56:25 +0900
Subject: [PATCH 16/76] =?UTF-8?q?fix:=20invite=E7=B3=BB=E3=81=AE=E6=88=BB?=
=?UTF-8?q?=E3=82=8A=E5=80=A4=E3=81=8C=E9=96=93=E9=81=95=E3=81=A3=E3=81=A6?=
=?UTF-8?q?=E3=81=84=E3=82=8B=20close=20#12517=20(#12518)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/server/api/endpoints/admin/invite/create.ts | 8 +-------
.../backend/src/server/api/endpoints/admin/invite/list.ts | 1 +
.../backend/src/server/api/endpoints/invite/create.ts | 8 +-------
packages/backend/src/server/api/endpoints/invite/list.ts | 2 +-
4 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/packages/backend/src/server/api/endpoints/admin/invite/create.ts b/packages/backend/src/server/api/endpoints/admin/invite/create.ts
index 4a22fd482..c6ee45735 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite/create.ts
@@ -33,13 +33,7 @@ export const meta = {
items: {
type: 'object',
optional: false, nullable: false,
- properties: {
- code: {
- type: 'string',
- optional: false, nullable: false,
- example: 'GR6S02ERUA5VR',
- },
- },
+ ref: 'InviteCode',
},
},
} as const;
diff --git a/packages/backend/src/server/api/endpoints/admin/invite/list.ts b/packages/backend/src/server/api/endpoints/admin/invite/list.ts
index f25d3fcb3..ff57940d4 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite/list.ts
@@ -21,6 +21,7 @@ export const meta = {
items: {
type: 'object',
optional: false, nullable: false,
+ ref: 'InviteCode',
},
},
} as const;
diff --git a/packages/backend/src/server/api/endpoints/invite/create.ts b/packages/backend/src/server/api/endpoints/invite/create.ts
index 94836283f..d82fa50e4 100644
--- a/packages/backend/src/server/api/endpoints/invite/create.ts
+++ b/packages/backend/src/server/api/endpoints/invite/create.ts
@@ -31,13 +31,7 @@ export const meta = {
res: {
type: 'object',
optional: false, nullable: false,
- properties: {
- code: {
- type: 'string',
- optional: false, nullable: false,
- example: 'GR6S02ERUA5VR',
- },
- },
+ ref: 'InviteCode',
},
} as const;
diff --git a/packages/backend/src/server/api/endpoints/invite/list.ts b/packages/backend/src/server/api/endpoints/invite/list.ts
index 06139b680..2107516ce 100644
--- a/packages/backend/src/server/api/endpoints/invite/list.ts
+++ b/packages/backend/src/server/api/endpoints/invite/list.ts
@@ -9,7 +9,6 @@ import type { RegistrationTicketsRepository } from '@/models/_.js';
import { InviteCodeEntityService } from '@/core/entities/InviteCodeEntityService.js';
import { QueryService } from '@/core/QueryService.js';
import { DI } from '@/di-symbols.js';
-import { ApiError } from '../../error.js';
export const meta = {
tags: ['meta'],
@@ -23,6 +22,7 @@ export const meta = {
items: {
type: 'object',
optional: false, nullable: false,
+ ref: 'InviteCode',
},
},
} as const;
From 5cd4c36cad1fa38080f2b596b936d6b44db45cc7 Mon Sep 17 00:00:00 2001
From: nullnyat
Date: Fri, 1 Dec 2023 11:19:33 +0900
Subject: [PATCH 17/76] rename docker-compose.yml.example to
docker-compose_example.yml (#12530)
* rename docker-compose.yml.example to docker-compose_example.yml
* fix: dockle.yml
---
.github/workflows/dockle.yml | 2 +-
docker-compose.yml.example => docker-compose_example.yml | 0
2 files changed, 1 insertion(+), 1 deletion(-)
rename docker-compose.yml.example => docker-compose_example.yml (100%)
diff --git a/.github/workflows/dockle.yml b/.github/workflows/dockle.yml
index edb18b04d..eee7a78fe 100644
--- a/.github/workflows/dockle.yml
+++ b/.github/workflows/dockle.yml
@@ -20,7 +20,7 @@ jobs:
sudo dpkg -i dockle.deb
- run: |
cp .config/docker_example.env .config/docker.env
- cp ./docker-compose.yml.example ./docker-compose.yml
+ cp ./docker-compose_example.yml ./docker-compose.yml
- run: |
docker compose up -d web
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
diff --git a/docker-compose.yml.example b/docker-compose_example.yml
similarity index 100%
rename from docker-compose.yml.example
rename to docker-compose_example.yml
From c927d6824c3003078410e5cf38d394544accb711 Mon Sep 17 00:00:00 2001
From: Qwreey
Date: Sat, 2 Dec 2023 09:28:00 +0900
Subject: [PATCH 18/76] Fix: missing receiver warn is not disappear (#12538)
---
packages/frontend/src/components/MkPostForm.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index 07c721320..9b04f5165 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -366,8 +366,8 @@ function checkMissingMention() {
return;
}
}
- hasNotSpecifiedMentions = false;
}
+ hasNotSpecifiedMentions = false;
}
function addMissingMention() {
From a5f0b5ec74940b0c53242dfc64c322139c91e362 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?=
<46447427+samunohito@users.noreply.github.com>
Date: Sat, 2 Dec 2023 11:37:31 +0900
Subject: [PATCH 19/76] fix #12528 (#12536)
---
packages/frontend/src/scripts/theme.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/frontend/src/scripts/theme.ts b/packages/frontend/src/scripts/theme.ts
index b6383487c..bc97f971e 100644
--- a/packages/frontend/src/scripts/theme.ts
+++ b/packages/frontend/src/scripts/theme.ts
@@ -44,7 +44,7 @@ export const getBuiltinThemes = () => Promise.all(
'd-cherry',
'd-ice',
'd-u0',
- ].map(name => import(`../themes/${name}.json5`).then(({ default: _default }): Theme => _default)),
+ ].map(name => import(`${__dirname}/../themes/${name}.json5`).then(({ default: _default }): Theme => _default)),
);
export const getBuiltinThemesRef = () => {
From 43c9ab20725d50d337474b3ef3f3854adda9c971 Mon Sep 17 00:00:00 2001
From: zyoshoka <107108195+zyoshoka@users.noreply.github.com>
Date: Sat, 2 Dec 2023 12:04:11 +0900
Subject: [PATCH 20/76] =?UTF-8?q?fix(frontend):=20=E9=95=B7=E3=81=84?=
=?UTF-8?q?=E5=90=8D=E5=89=8D=E3=81=AE=E3=83=81=E3=83=A3=E3=83=B3=E3=83=8D?=
=?UTF-8?q?=E3=83=AB=E3=81=AB=E3=81=8A=E3=81=91=E3=82=8B=E6=8A=95=E7=A8=BF?=
=?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=83=A0=E3=81=AE=E8=A1=A8=E7=A4=BA?=
=?UTF-8?q?=E3=81=8C=E5=B4=A9=E3=82=8C=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92?=
=?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#12524)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(frontend): 長い名前のチャンネルにおける投稿フォームの表示が崩れる問題を修正
* Update CHANGELOG.md
---
CHANGELOG.md | 1 +
packages/frontend/src/components/MkPostForm.vue | 5 +++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d32b46f63..a51204781 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -38,6 +38,7 @@
- Fix: 一度に大量の通知が入った際に通知音が音割れする問題を修正
- Fix: 共有機能をサポートしていないブラウザの場合は共有ボタンを非表示にする #11305
- Fix: 通知のグルーピング設定を変更してもリロードされるまで表示が変わらない問題を修正 #12470
+- Fix: 長い名前のチャンネルにおける投稿フォームの表示が崩れる問題を修正
### Server
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index 9b04f5165..3244f743a 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -1059,8 +1059,9 @@ defineExpose({
.visibility {
overflow: clip;
- text-overflow: ellipsis;
- white-space: nowrap;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 210px;
&:enabled {
> .headerRightButtonText {
From da0ecb650e55c46c4878d9f0200109b4bd7cc4c8 Mon Sep 17 00:00:00 2001
From: anatawa12
Date: Sat, 2 Dec 2023 12:04:30 +0900
Subject: [PATCH 21/76] =?UTF-8?q?chore:=20=E3=83=95=E3=82=A9=E3=83=AD?=
=?UTF-8?q?=E3=83=BC=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=ABHTL?=
=?UTF-8?q?=E3=82=92=E3=83=91=E3=83=BC=E3=82=B8=E3=81=97=E3=81=AA=E3=81=8F?=
=?UTF-8?q?=E3=81=99=E3=82=8B=20(#12522)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/backend/src/core/UserFollowingService.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/packages/backend/src/core/UserFollowingService.ts b/packages/backend/src/core/UserFollowingService.ts
index 3062999c0..d600ffb9d 100644
--- a/packages/backend/src/core/UserFollowingService.ts
+++ b/packages/backend/src/core/UserFollowingService.ts
@@ -304,8 +304,6 @@ export class UserFollowingService implements OnModuleInit {
});
}
});
-
- this.fanoutTimelineService.purge(`homeTimeline:${follower.id}`);
}
// Publish followed event
@@ -373,8 +371,6 @@ export class UserFollowingService implements OnModuleInit {
});
}
});
-
- this.fanoutTimelineService.purge(`homeTimeline:${follower.id}`);
}
if (this.userEntityService.isLocalUser(follower) && this.userEntityService.isRemoteUser(followee)) {
From b37e8ffa69b20fa05ae6a999f872fb5cd4772291 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?=
<67428053+kakkokari-gtyih@users.noreply.github.com>
Date: Sat, 2 Dec 2023 12:05:03 +0900
Subject: [PATCH 22/76] =?UTF-8?q?(fix)=20=E7=BF=BB=E8=A8=B3=E3=81=AE?=
=?UTF-8?q?=E3=83=80=E3=83=96=E3=82=8A=E3=82=92=E8=A7=A3=E6=B6=88=20(#1251?=
=?UTF-8?q?9)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
locales/index.d.ts | 1 -
locales/ja-JP.yml | 1 -
packages/frontend/src/components/MkLaunchPad.vue | 2 ++
packages/frontend/src/navbar.ts | 2 +-
4 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/locales/index.d.ts b/locales/index.d.ts
index d46281649..402c2413f 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -440,7 +440,6 @@ export interface Locale {
"notFound": string;
"notFoundDescription": string;
"uploadFolder": string;
- "cacheClear": string;
"markAsReadAllNotifications": string;
"markAsReadAllUnreadNotes": string;
"markAsReadAllTalkMessages": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index aa3cdf075..2b2f05aa8 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -437,7 +437,6 @@ share: "共有"
notFound: "見つかりません"
notFoundDescription: "指定されたURLに該当するページはありませんでした。"
uploadFolder: "既定アップロード先"
-cacheClear: "キャッシュを削除"
markAsReadAllNotifications: "すべての通知を既読にする"
markAsReadAllUnreadNotes: "すべての投稿を既読にする"
markAsReadAllTalkMessages: "すべてのチャットを既読にする"
diff --git a/packages/frontend/src/components/MkLaunchPad.vue b/packages/frontend/src/components/MkLaunchPad.vue
index 87f15a110..b16c05f57 100644
--- a/packages/frontend/src/components/MkLaunchPad.vue
+++ b/packages/frontend/src/components/MkLaunchPad.vue
@@ -101,6 +101,8 @@ function close() {
vertical-align: bottom;
height: 100px;
border-radius: 10px;
+ padding: 10px;
+ box-sizing: border-box;
&:hover {
color: var(--accent);
diff --git a/packages/frontend/src/navbar.ts b/packages/frontend/src/navbar.ts
index 78a0945dd..95fd6bf29 100644
--- a/packages/frontend/src/navbar.ts
+++ b/packages/frontend/src/navbar.ts
@@ -173,7 +173,7 @@ export const navbarItemDef = reactive({
to: `/@${$i?.username}`,
},
cacheClear: {
- title: i18n.ts.cacheClear,
+ title: i18n.ts.clearCache,
icon: 'ti ti-trash',
action: (ev) => {
clearCache();
From b6b838416d40c96a58dfcf271287ccea0400f9a1 Mon Sep 17 00:00:00 2001
From: anatawa12
Date: Sat, 2 Dec 2023 12:05:53 +0900
Subject: [PATCH 23/76] chore: remove unimplemented excludeNsfw (#12520)
---
.../backend/src/server/api/endpoints/notes/local-timeline.ts | 1 -
packages/backend/src/server/api/endpoints/users/notes.ts | 1 -
.../lib/rollup-plugin-unwind-css-module-class-name.test.ts | 2 --
packages/frontend/src/pages/user/index.files.vue | 1 -
4 files changed, 5 deletions(-)
diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
index 7d8dec7b8..886707005 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -48,7 +48,6 @@ export const paramDef = {
withFiles: { type: 'boolean', default: false },
withRenotes: { type: 'boolean', default: true },
withReplies: { type: 'boolean', default: false },
- excludeNsfw: { type: 'boolean', default: false },
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index a775b58f0..76033ddb0 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -53,7 +53,6 @@ export const paramDef = {
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
withFiles: { type: 'boolean', default: false },
- excludeNsfw: { type: 'boolean', default: false },
},
required: ['userId'],
} as const;
diff --git a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts
index a7b8cbb03..759f27039 100644
--- a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts
+++ b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts
@@ -89,7 +89,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
api("users/notes", {
userId: props.user.id,
fileType: image,
- excludeNsfw: defaultStore.state.nsfw !== "ignore",
limit: 10
}).then((notes) => {
for (const note of notes) {
@@ -198,7 +197,6 @@ const _sfc_main = defineComponent({
api("users/notes", {
userId: props.user.id,
fileType: image,
- excludeNsfw: defaultStore.state.nsfw !== "ignore",
limit: 10
}).then(notes => {
for (const note of notes) {
diff --git a/packages/frontend/src/pages/user/index.files.vue b/packages/frontend/src/pages/user/index.files.vue
index f9328b8d6..72f95ec1a 100644
--- a/packages/frontend/src/pages/user/index.files.vue
+++ b/packages/frontend/src/pages/user/index.files.vue
@@ -64,7 +64,6 @@ onMounted(() => {
os.api('users/notes', {
userId: props.user.id,
withFiles: true,
- excludeNsfw: defaultStore.state.nsfw !== 'ignore',
limit: 15,
}).then(notes => {
for (const note of notes) {
From c190b720d3d4f3aa93a0556f63be4b09e241108c Mon Sep 17 00:00:00 2001
From: meron
Date: Sat, 2 Dec 2023 15:26:46 +0900
Subject: [PATCH 24/76] =?UTF-8?q?feat(frontend):=20=E7=B5=B5=E6=96=87?=
=?UTF-8?q?=E5=AD=97=E3=83=94=E3=83=83=E3=82=AB=E3=83=BC=E3=81=AE=E3=82=AB?=
=?UTF-8?q?=E3=83=86=E3=82=B4=E3=83=AA=E3=82=92=E5=A4=9A=E9=9A=8E=E5=B1=A4?=
=?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=81=A7=E5=88=86=E9=A1=9E?=
=?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20(#1213?=
=?UTF-8?q?2)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Update CHANGELOG.md
* Feat:emoji picker folder select
* Fix: lint error
* Fix: lint error 2
* Fix: lint error 3
* カスタム絵文字のカテゴリ表示部分が長かったので短くした
* エフェクトが壊れて出ないのを修正
* padding 18px -> 9px
* Update CHANGELOG.md
* Revert: en-US.yml
* chg: Folder -> folder
* chg: isChildrenExits -> isChildren
* chg: isChildren -> categoryFolderFlag
* カテゴリ末尾が / の場合ピッカーから消失するので「その他」と扱い対応
* 特定のパターンのカテゴリ名でピッカーに出てこないのを修正
「i18n.ts.other」や「/」始まりの場合壊れる
* chg: categoryFolderFlag -> hasChildSection
* code format
* Del: ti-fw
* fix
* 絵文字とフォルダの表示順序入れ替え
* ネストした場合にパネルでどこまでがどのフォルダのものかをわかりやすくした
* fix lint
* カテゴリの名前が長いと表示がおかしくなる問題を修正
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
---------
Co-authored-by: tamaina
Co-authored-by: syuilo
Co-authored-by: atsuchan <83960488+atsu1125@users.noreply.github.com>
Co-authored-by: Masaya Suzuki <15100604+massongit@users.noreply.github.com>
Co-authored-by: Kagami Sascha Rosylight
Co-authored-by: taiy <53635909+taiyme@users.noreply.github.com>
Co-authored-by: xianon
Co-authored-by: kabo2468 <28654659+kabo2468@users.noreply.github.com>
Co-authored-by: YS <47836716+yszkst@users.noreply.github.com>
Co-authored-by: Khsmty
Co-authored-by: Soni L
Co-authored-by: mei23
Co-authored-by: daima3629 <52790780+daima3629@users.noreply.github.com>
Co-authored-by: Windymelt <1113940+windymelt@users.noreply.github.com>
Co-authored-by: Ebise Lutica <7106976+EbiseLutica@users.noreply.github.com>
Co-authored-by: nenohi
Co-authored-by: Acid Chicken (硫酸鶏)
Co-authored-by: rinsuki <428rinsuki+git@gmail.com>
Co-authored-by: FineArchs <133759614+FineArchs@users.noreply.github.com>
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
---
CHANGELOG.md | 1 +
locales/index.d.ts | 1 +
locales/ja-JP.yml | 1 +
.../src/components/MkEmojiPicker.section.vue | 47 ++++++++++++++--
.../frontend/src/components/MkEmojiPicker.vue | 53 ++++++++++++++++---
packages/frontend/src/scripts/emojilist.ts | 6 +++
6 files changed, 98 insertions(+), 11 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a51204781..4f7389c31 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -177,6 +177,7 @@
### Client
- Enhance: TLの返信表示オプションを記憶するように
- Enhance: 投稿されてから時間が経過しているノートであることを視覚的に分かりやすく
+- Feat: 絵文字ピッカーのカテゴリに「/」を入れることでフォルダ分け表示できるように
### Server
- Enhance: タイムライン取得時のパフォーマンスを向上
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 402c2413f..a8f54e2e1 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -314,6 +314,7 @@ export interface Locale {
"createFolder": string;
"renameFolder": string;
"deleteFolder": string;
+ "folder": string;
"addFile": string;
"emptyDrive": string;
"emptyFolder": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 2b2f05aa8..04fb1f947 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -311,6 +311,7 @@ folderName: "フォルダー名"
createFolder: "フォルダーを作成"
renameFolder: "フォルダー名を変更"
deleteFolder: "フォルダーを削除"
+folder: "フォルダー"
addFile: "ファイルを追加"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
diff --git a/packages/frontend/src/components/MkEmojiPicker.section.vue b/packages/frontend/src/components/MkEmojiPicker.section.vue
index 08297ea5b..35de9bbb5 100644
--- a/packages/frontend/src/components/MkEmojiPicker.section.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.section.vue
@@ -5,9 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
+
- ({{ emojis.length }})
+ (:{{ emojis.length }})
+
+
+
+ (:{{ customEmojiTree.length }} :{{ emojis.length }})
+
+
+
+ {{ child.value || i18n.ts.other }}
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 5b420c499..603f676d5 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -73,18 +73,20 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.customEmojis }}
- {{ category || i18n.ts.other }}
+ {{ child.value || i18n.ts.other }}
- {{ category }}
+ {{ category }}
@@ -100,7 +102,14 @@ SPDX-License-Identifier: AGPL-3.0-only
import { ref, shallowRef, computed, watch, onMounted } from 'vue';
import * as Misskey from 'misskey-js';
import XSection from '@/components/MkEmojiPicker.section.vue';
-import { emojilist, emojiCharByCategory, UnicodeEmojiDef, unicodeEmojiCategories as categories, getEmojiName } from '@/scripts/emojilist.js';
+import {
+ emojilist,
+ emojiCharByCategory,
+ UnicodeEmojiDef,
+ unicodeEmojiCategories as categories,
+ getEmojiName,
+ CustomEmojiFolderTree
+} from '@/scripts/emojilist.js';
import MkRippleEffect from '@/components/MkRippleEffect.vue';
import * as os from '@/os.js';
import { isTouchUsing } from '@/scripts/touch.js';
@@ -144,6 +153,35 @@ const searchResultCustom = ref
([]);
const searchResultUnicode = ref([]);
const tab = ref<'index' | 'custom' | 'unicode' | 'tags'>('index');
+const customEmojiFolderRoot: CustomEmojiFolderTree = { value: "", category: "", children: [] };
+
+function parseAndMergeCategories(input: string, root: CustomEmojiFolderTree): CustomEmojiFolderTree {
+ const parts = input.split('/').map(p => p.trim());
+ let currentNode: CustomEmojiFolderTree = root;
+
+ for (const part of parts) {
+ let existingNode = currentNode.children.find((node) => node.value === part);
+
+ if (!existingNode) {
+ const newNode: CustomEmojiFolderTree = { value: part, category: input, children: [] };
+ currentNode.children.push(newNode);
+ existingNode = newNode;
+ }
+
+ currentNode = existingNode;
+ }
+
+ return currentNode;
+}
+
+customEmojiCategories.value.forEach(ec => {
+ if (ec !== null) {
+ parseAndMergeCategories(ec, customEmojiFolderRoot);
+ }
+});
+
+parseAndMergeCategories('', customEmojiFolderRoot);
+
watch(q, () => {
if (emojisEl.value) emojisEl.value.scrollTop = 0;
@@ -572,8 +610,7 @@ defineExpose({
position: sticky;
top: 0;
left: 0;
- height: 32px;
- line-height: 32px;
+ line-height: 28px;
z-index: 1;
padding: 0 8px;
font-size: 12px;
diff --git a/packages/frontend/src/scripts/emojilist.ts b/packages/frontend/src/scripts/emojilist.ts
index 4159da84c..8885bf4b7 100644
--- a/packages/frontend/src/scripts/emojilist.ts
+++ b/packages/frontend/src/scripts/emojilist.ts
@@ -43,3 +43,9 @@ export function getEmojiName(char: string): string | null {
return emojilist[idx].name;
}
}
+
+export interface CustomEmojiFolderTree {
+ value: string;
+ category: string;
+ children: CustomEmojiFolderTree[];
+}
From 8968bfd309e505f7e33796d9d2084783bcfae377 Mon Sep 17 00:00:00 2001
From: Camilla Ett
Date: Sat, 2 Dec 2023 17:07:57 +0900
Subject: [PATCH 25/76] =?UTF-8?q?fix(backend):=20=E3=82=AB=E3=82=B9?=
=?UTF-8?q?=E3=82=BF=E3=83=A0=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=AE=E3=82=A4?=
=?UTF-8?q?=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E6=99=82=E3=81=AE=E5=8B=95?=
=?UTF-8?q?=E4=BD=9C=E3=82=92=E4=BF=AE=E6=AD=A3=20(#12360)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: syuilo
---
.../server/api/endpoints/admin/emoji/copy.ts | 42 +++++++++----------
.../src/pages/custom-emojis-manager.vue | 4 +-
2 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
index a65e4e762..5b41dfb51 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
@@ -6,11 +6,10 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import type { EmojisRepository } from '@/models/_.js';
-import { IdService } from '@/core/IdService.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import { DI } from '@/di-symbols.js';
import { DriveService } from '@/core/DriveService.js';
-import { GlobalEventService } from '@/core/GlobalEventService.js';
+import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { EmojiEntityService } from '@/core/entities/EmojiEntityService.js';
import { ApiError } from '../../../error.js';
@@ -26,6 +25,11 @@ export const meta = {
code: 'NO_SUCH_EMOJI',
id: 'e2785b66-dca3-4087-9cac-b93c541cc425',
},
+ duplicateName: {
+ message: 'Duplicate name.',
+ code: 'DUPLICATE_NAME',
+ id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
+ },
},
res: {
@@ -56,15 +60,12 @@ export default class extends Endpoint { // eslint-
constructor(
@Inject(DI.emojisRepository)
private emojisRepository: EmojisRepository,
-
private emojiEntityService: EmojiEntityService,
- private idService: IdService,
- private globalEventService: GlobalEventService,
+ private customEmojiService: CustomEmojiService,
private driveService: DriveService,
) {
super(meta, paramDef, async (ps, me) => {
const emoji = await this.emojisRepository.findOneBy({ id: ps.emojiId });
-
if (emoji == null) {
throw new ApiError(meta.errors.noSuchEmoji);
}
@@ -75,28 +76,27 @@ export default class extends Endpoint { // eslint-
// Create file
driveFile = await this.driveService.uploadFromUrl({ url: emoji.originalUrl, user: null, force: true });
} catch (e) {
+ // TODO: need to return Drive Error
throw new ApiError();
}
- const copied = await this.emojisRepository.insert({
- id: this.idService.gen(),
- updatedAt: new Date(),
+ // Duplication Check
+ const isDuplicate = await this.customEmojiService.checkDuplicate(emoji.name);
+ if (isDuplicate) throw new ApiError(meta.errors.duplicateName);
+
+ const addedEmoji = await this.customEmojiService.add({
+ driveFile,
name: emoji.name,
+ category: emoji.category,
+ aliases: emoji.aliases,
host: null,
- aliases: [],
- originalUrl: driveFile.url,
- publicUrl: driveFile.webpublicUrl ?? driveFile.url,
- type: driveFile.webpublicType ?? driveFile.type,
license: emoji.license,
- }).then(x => this.emojisRepository.findOneByOrFail(x.identifiers[0]));
+ isSensitive: emoji.isSensitive,
+ localOnly: emoji.localOnly,
+ roleIdsThatCanBeUsedThisEmojiAsReaction: emoji.roleIdsThatCanBeUsedThisEmojiAsReaction,
+ }, me);
- this.globalEventService.publishBroadcastStream('emojiAdded', {
- emoji: await this.emojiEntityService.packDetailed(copied.id),
- });
-
- return {
- id: copied.id,
- };
+ return this.emojiEntityService.packDetailed(addedEmoji);
});
}
}
diff --git a/packages/frontend/src/pages/custom-emojis-manager.vue b/packages/frontend/src/pages/custom-emojis-manager.vue
index 7450cf97c..316dbaa3a 100644
--- a/packages/frontend/src/pages/custom-emojis-manager.vue
+++ b/packages/frontend/src/pages/custom-emojis-manager.vue
@@ -155,7 +155,7 @@ const edit = (emoji) => {
}, 'closed');
};
-const im = (emoji) => {
+const importEmoji = (emoji) => {
os.apiWithDialog('admin/emoji/copy', {
emojiId: emoji.id,
});
@@ -168,7 +168,7 @@ const remoteMenu = (emoji, ev: MouseEvent) => {
}, {
text: i18n.ts.import,
icon: 'ti ti-plus',
- action: () => { im(emoji); },
+ action: () => { importEmoji(emoji); },
}], ev.currentTarget ?? ev.target);
};
From cf3d45e7c89fb1d2103c04315bee27a546bef34f Mon Sep 17 00:00:00 2001
From: paihu <13479783+paihu@users.noreply.github.com>
Date: Sat, 2 Dec 2023 17:09:22 +0900
Subject: [PATCH 26/76] fix(frontend): MFM ruby nyaize (#12362)
---
CHANGELOG.md | 1 +
.../src/components/global/MkMisskeyFlavoredMarkdown.ts | 10 ++++++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4f7389c31..2d96a0232 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
### Client
- Fix: ページ一覧ページの表示がモバイル環境において崩れているのを修正
+- Fix: MFMでルビの中のテキストがnyaizeされない問題を修正
### Server
-
diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
index d4c3ef60a..fe599dcea 100644
--- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
+++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
@@ -242,11 +242,17 @@ export default function(props: MfmProps) {
case 'ruby': {
if (token.children.length === 1) {
const child = token.children[0];
- const text = child.type === 'text' ? child.props.text : '';
+ let text = child.type === 'text' ? child.props.text : '';
+ if (!disableNyaize && shouldNyaize) {
+ text = doNyaize(text);
+ }
return h('ruby', {}, [text.split(' ')[0], h('rt', text.split(' ')[1])]);
} else {
const rt = token.children.at(-1)!;
- const text = rt.type === 'text' ? rt.props.text : '';
+ let text = rt.type === 'text' ? rt.props.text : '';
+ if (!disableNyaize && shouldNyaize) {
+ text = doNyaize(text);
+ }
return h('ruby', {}, [...genEl(token.children.slice(0, token.children.length - 1), scale), h('rt', text.trim())]);
}
}
From a631b976c99a4b3977079a4bafc8a7b7de0bf269 Mon Sep 17 00:00:00 2001
From: anatawa12
Date: Sat, 2 Dec 2023 18:25:07 +0900
Subject: [PATCH 27/76] Refine fanout timeline (#12507)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* chore(endpoints/hybrid-timeline): don't pack inside getFromDb
* chore(endpoints/hybrid-timeline): Redisから取得する部分のうちSTLに依存しなそうなところを別のServiceに切り出し
* chore(endpoints/local-timeline): FanoutTimelineEndpointServiceで再実装
* chore(endpoints/channels/timeline): FanoutTimelineEndpointServiceで再実装
* chore(endpoints/timeline): FanoutTimelineEndpointServiceで再実装
* chore(endpoints/user-list-timeline): FanoutTimelineEndpointServiceで再実装
* chore(endpoints/users/notes): FanoutTimelineEndpointServiceで再実装
* chore: add useDbFallback to FanoutTimelineEndpointService.timeline and always true for channel / user note list
* style: fix lint error
* chore: split logic to multiple functions
* chore: implement redis fallback
* chore: 成功率を上げる
* fix: db fallback not working
* feat: allowPartial
* chore(frontend): set allowPartial
* chore(backend): remove fallbackIfEmpty
HTL will never be purged so it's no longer required
* fix: missing allowPartial in channel timeline
* fix: type of timelineConfig in hybrid-timeline
---------
Co-authored-by: syuilo
---
packages/backend/src/core/CoreModule.ts | 6 +
.../src/core/FanoutTimelineEndpointService.ts | 123 +++++++++++
.../server/api/endpoints/channels/timeline.ts | 112 +++++-----
.../api/endpoints/notes/hybrid-timeline.ts | 110 ++++-----
.../api/endpoints/notes/local-timeline.ts | 103 ++++-----
.../server/api/endpoints/notes/timeline.ts | 91 ++++----
.../api/endpoints/notes/user-list-timeline.ts | 78 +++----
.../src/server/api/endpoints/users/notes.ts | 208 +++++++++---------
.../frontend/src/components/MkPagination.vue | 1 +
9 files changed, 438 insertions(+), 394 deletions(-)
create mode 100644 packages/backend/src/core/FanoutTimelineEndpointService.ts
diff --git a/packages/backend/src/core/CoreModule.ts b/packages/backend/src/core/CoreModule.ts
index bf6f0ef87..bc6d24b95 100644
--- a/packages/backend/src/core/CoreModule.ts
+++ b/packages/backend/src/core/CoreModule.ts
@@ -4,6 +4,7 @@
*/
import { Module } from '@nestjs/common';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
import { AccountMoveService } from './AccountMoveService.js';
import { AccountUpdateService } from './AccountUpdateService.js';
import { AiService } from './AiService.js';
@@ -195,6 +196,7 @@ const $SearchService: Provider = { provide: 'SearchService', useExisting: Search
const $ClipService: Provider = { provide: 'ClipService', useExisting: ClipService };
const $FeaturedService: Provider = { provide: 'FeaturedService', useExisting: FeaturedService };
const $FanoutTimelineService: Provider = { provide: 'FanoutTimelineService', useExisting: FanoutTimelineService };
+const $FanoutTimelineEndpointService: Provider = { provide: 'FanoutTimelineEndpointService', useExisting: FanoutTimelineEndpointService };
const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService', useExisting: ChannelFollowingService };
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
@@ -331,6 +333,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
ClipService,
FeaturedService,
FanoutTimelineService,
+ FanoutTimelineEndpointService,
ChannelFollowingService,
RegistryApiService,
ChartLoggerService,
@@ -460,6 +463,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$ClipService,
$FeaturedService,
$FanoutTimelineService,
+ $FanoutTimelineEndpointService,
$ChannelFollowingService,
$RegistryApiService,
$ChartLoggerService,
@@ -590,6 +594,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
ClipService,
FeaturedService,
FanoutTimelineService,
+ FanoutTimelineEndpointService,
ChannelFollowingService,
RegistryApiService,
FederationChart,
@@ -718,6 +723,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$ClipService,
$FeaturedService,
$FanoutTimelineService,
+ $FanoutTimelineEndpointService,
$ChannelFollowingService,
$RegistryApiService,
$FederationChart,
diff --git a/packages/backend/src/core/FanoutTimelineEndpointService.ts b/packages/backend/src/core/FanoutTimelineEndpointService.ts
new file mode 100644
index 000000000..157fcbe87
--- /dev/null
+++ b/packages/backend/src/core/FanoutTimelineEndpointService.ts
@@ -0,0 +1,123 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Inject, Injectable } from '@nestjs/common';
+import { DI } from '@/di-symbols.js';
+import { bindThis } from '@/decorators.js';
+import type { MiUser } from '@/models/User.js';
+import type { MiNote } from '@/models/Note.js';
+import { Packed } from '@/misc/json-schema.js';
+import type { NotesRepository } from '@/models/_.js';
+import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
+import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
+
+@Injectable()
+export class FanoutTimelineEndpointService {
+ constructor(
+ @Inject(DI.notesRepository)
+ private notesRepository: NotesRepository,
+
+ private noteEntityService: NoteEntityService,
+ private fanoutTimelineService: FanoutTimelineService,
+ ) {
+ }
+
+ @bindThis
+ async timeline(ps: {
+ untilId: string | null,
+ sinceId: string | null,
+ limit: number,
+ allowPartial: boolean,
+ me?: { id: MiUser['id'] } | undefined | null,
+ useDbFallback: boolean,
+ redisTimelines: string[],
+ noteFilter: (note: MiNote) => boolean,
+ dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise,
+ }): Promise[]> {
+ return await this.noteEntityService.packMany(await this.getMiNotes(ps), ps.me);
+ }
+
+ @bindThis
+ private async getMiNotes(ps: {
+ untilId: string | null,
+ sinceId: string | null,
+ limit: number,
+ allowPartial: boolean,
+ me?: { id: MiUser['id'] } | undefined | null,
+ useDbFallback: boolean,
+ redisTimelines: string[],
+ noteFilter: (note: MiNote) => boolean,
+ dbFallback: (untilId: string | null, sinceId: string | null, limit: number) => Promise,
+ }): Promise {
+ let noteIds: string[];
+ let shouldFallbackToDb = false;
+
+ // 呼び出し元と以下の処理をシンプルにするためにdbFallbackを置き換える
+ if (!ps.useDbFallback) ps.dbFallback = () => Promise.resolve([]);
+
+ const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
+
+ const redisResultIds = Array.from(new Set(redisResult.flat(1)));
+
+ redisResultIds.sort((a, b) => a > b ? -1 : 1);
+ noteIds = redisResultIds.slice(0, ps.limit);
+
+ shouldFallbackToDb = shouldFallbackToDb || (noteIds.length === 0);
+
+ if (!shouldFallbackToDb) {
+ const redisTimeline: MiNote[] = [];
+ let readFromRedis = 0;
+ let lastSuccessfulRate = 1; // rateをキャッシュする?
+ let trialCount = 1;
+
+ while ((redisResultIds.length - readFromRedis) !== 0) {
+ const remainingToRead = ps.limit - redisTimeline.length;
+
+ // DBからの取り直しを減らす初回と同じ割合以上で成功すると仮定するが、クエリの長さを考えて三倍まで
+ const countToGet = remainingToRead * Math.ceil(Math.min(1.1 / lastSuccessfulRate, 3));
+ noteIds = redisResultIds.slice(readFromRedis, readFromRedis + countToGet);
+
+ readFromRedis += noteIds.length;
+
+ const gotFromDb = await this.getAndFilterFromDb(noteIds, ps.noteFilter);
+ redisTimeline.push(...gotFromDb);
+ lastSuccessfulRate = gotFromDb.length / noteIds.length;
+
+ console.log(`fanoutTimelineTrial#${trialCount++}: req: ${ps.limit}, tried: ${noteIds.length}, got: ${gotFromDb.length}, rate: ${lastSuccessfulRate}, total: ${redisTimeline.length}, fromRedis: ${redisResultIds.length}`);
+
+ if (ps.allowPartial ? redisTimeline.length !== 0 : redisTimeline.length >= ps.limit) {
+ // 十分Redisからとれた
+ return redisTimeline.slice(0, ps.limit);
+ }
+ }
+
+ // まだ足りない分はDBにフォールバック
+ const remainingToRead = ps.limit - redisTimeline.length;
+ const gotFromDb = await ps.dbFallback(noteIds[noteIds.length - 1], ps.sinceId, remainingToRead);
+ redisTimeline.push(...gotFromDb);
+ console.log(`fanoutTimelineTrial#db: req: ${ps.limit}, tried: ${remainingToRead}, got: ${gotFromDb.length}, since: ${noteIds[noteIds.length - 1]}, until: ${ps.untilId}, total: ${redisTimeline.length}`);
+ return redisTimeline;
+ }
+
+ return await ps.dbFallback(ps.untilId, ps.sinceId, ps.limit);
+ }
+
+ private async getAndFilterFromDb(noteIds: string[], noteFilter: (note: MiNote) => boolean): Promise {
+ const query = this.notesRepository.createQueryBuilder('note')
+ .where('note.id IN (:...noteIds)', { noteIds: noteIds })
+ .innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('note.reply', 'reply')
+ .leftJoinAndSelect('note.renote', 'renote')
+ .leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('note.channel', 'channel');
+
+ const notes = (await query.getMany()).filter(noteFilter);
+
+ notes.sort((a, b) => a.id > b.id ? -1 : 1);
+
+ return notes;
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts
index f9207199d..9ef494d6d 100644
--- a/packages/backend/src/server/api/endpoints/channels/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts
@@ -12,10 +12,11 @@ import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
import { DI } from '@/di-symbols.js';
import { IdService } from '@/core/IdService.js';
-import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { CacheService } from '@/core/CacheService.js';
import { MetaService } from '@/core/MetaService.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
+import { MiLocalUser } from '@/models/User.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -51,6 +52,7 @@ export const paramDef = {
untilId: { type: 'string', format: 'misskey:id' },
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
},
required: ['channelId'],
} as const;
@@ -58,9 +60,6 @@ export const paramDef = {
@Injectable()
export default class extends Endpoint { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.redisForTimelines)
- private redisForTimelines: Redis.Redis,
-
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@@ -70,7 +69,7 @@ export default class extends Endpoint { // eslint-
private idService: IdService,
private noteEntityService: NoteEntityService,
private queryService: QueryService,
- private fanoutTimelineService: FanoutTimelineService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
private cacheService: CacheService,
private activeUsersChart: ActiveUsersChart,
private metaService: MetaService,
@@ -78,7 +77,6 @@ export default class extends Endpoint { // eslint-
super(meta, paramDef, async (ps, me) => {
const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null);
const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null);
- const isRangeSpecified = untilId != null && sinceId != null;
const serverSettings = await this.metaService.fetch();
@@ -92,64 +90,58 @@ export default class extends Endpoint { // eslint-
if (me) this.activeUsersChart.read(me);
- if (serverSettings.enableFanoutTimeline && (isRangeSpecified || sinceId == null)) {
- const [
- userIdsWhoMeMuting,
- ] = me ? await Promise.all([
- this.cacheService.userMutingsCache.fetch(me.id),
- ]) : [new Set()];
-
- let noteIds = await this.fanoutTimelineService.get(`channelTimeline:${channel.id}`, untilId, sinceId);
- noteIds = noteIds.slice(0, ps.limit);
-
- if (noteIds.length > 0) {
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
-
- let timeline = await query.getMany();
-
- timeline = timeline.filter(note => {
- if (me && isUserRelated(note, userIdsWhoMeMuting)) return false;
-
- return true;
- });
-
- // TODO: フィルタで件数が減った場合の埋め合わせ処理
-
- timeline.sort((a, b) => a.id > b.id ? -1 : 1);
-
- if (timeline.length > 0) {
- return await this.noteEntityService.packMany(timeline, me);
- }
- }
+ if (!serverSettings.enableFanoutTimeline) {
+ return await this.noteEntityService.packMany(await this.getFromDb({ untilId, sinceId, limit: ps.limit, channelId: channel.id }, me), me);
}
- //#region fallback to database
- const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
- .andWhere('note.channelId = :channelId', { channelId: channel.id })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
+ const [
+ userIdsWhoMeMuting,
+ ] = me ? await Promise.all([
+ this.cacheService.userMutingsCache.fetch(me.id),
+ ]) : [new Set()];
- if (me) {
- this.queryService.generateMutedUserQuery(query, me);
- this.queryService.generateBlockedUserQuery(query, me);
- }
- //#endregion
+ return await this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ me,
+ useDbFallback: true,
+ redisTimelines: [`channelTimeline:${channel.id}`],
+ noteFilter: note => {
+ if (me && isUserRelated(note, userIdsWhoMeMuting)) return false;
- const timeline = await query.limit(ps.limit).getMany();
-
- return await this.noteEntityService.packMany(timeline, me);
- //#endregion
+ return true;
+ },
+ dbFallback: async (untilId, sinceId, limit) => {
+ return await this.getFromDb({ untilId, sinceId, limit, channelId: channel.id }, me);
+ },
+ });
});
}
+
+ private async getFromDb(ps: {
+ untilId: string | null,
+ sinceId: string | null,
+ limit: number,
+ channelId: string
+ }, me: MiLocalUser | null) {
+ //#region fallback to database
+ const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId)
+ .andWhere('note.channelId = :channelId', { channelId: ps.channelId })
+ .innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('note.reply', 'reply')
+ .leftJoinAndSelect('note.renote', 'renote')
+ .leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('note.channel', 'channel');
+
+ if (me) {
+ this.queryService.generateMutedUserQuery(query, me);
+ this.queryService.generateBlockedUserQuery(query, me);
+ }
+ //#endregion
+
+ return await query.limit(ps.limit).getMany();
+ }
}
diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
index 372199844..820692626 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -5,7 +5,7 @@
import { Brackets } from 'typeorm';
import { Inject, Injectable } from '@nestjs/common';
-import type { NotesRepository, FollowingsRepository, MiNote, ChannelFollowingsRepository } from '@/models/_.js';
+import type { NotesRepository, ChannelFollowingsRepository } from '@/models/_.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
@@ -19,6 +19,7 @@ import { QueryService } from '@/core/QueryService.js';
import { UserFollowingService } from '@/core/UserFollowingService.js';
import { MetaService } from '@/core/MetaService.js';
import { MiLocalUser } from '@/models/User.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -53,6 +54,7 @@ export const paramDef = {
untilId: { type: 'string', format: 'misskey:id' },
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
includeMyRenotes: { type: 'boolean', default: true },
includeRenotedMyNotes: { type: 'boolean', default: true },
includeLocalRenotes: { type: 'boolean', default: true },
@@ -77,10 +79,10 @@ export default class extends Endpoint { // eslint-
private activeUsersChart: ActiveUsersChart,
private idService: IdService,
private cacheService: CacheService,
- private fanoutTimelineService: FanoutTimelineService,
private queryService: QueryService,
private userFollowingService: UserFollowingService,
private metaService: MetaService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
) {
super(meta, paramDef, async (ps, me) => {
const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null);
@@ -94,7 +96,7 @@ export default class extends Endpoint { // eslint-
const serverSettings = await this.metaService.fetch();
if (!serverSettings.enableFanoutTimeline) {
- return await this.getFromDb({
+ const timeline = await this.getFromDb({
untilId,
sinceId,
limit: ps.limit,
@@ -104,6 +106,12 @@ export default class extends Endpoint { // eslint-
withFiles: ps.withFiles,
withReplies: ps.withReplies,
}, me);
+
+ process.nextTick(() => {
+ this.activeUsersChart.read(me);
+ });
+
+ return await this.noteEntityService.packMany(timeline, me);
}
const [
@@ -116,51 +124,34 @@ export default class extends Endpoint { // eslint-
this.cacheService.userBlockedCache.fetch(me.id),
]);
- let noteIds: string[];
- let shouldFallbackToDb = false;
+ let timelineConfig: string[];
if (ps.withFiles) {
- const [htlNoteIds, ltlNoteIds] = await this.fanoutTimelineService.getMulti([
+ timelineConfig = [
`homeTimelineWithFiles:${me.id}`,
'localTimelineWithFiles',
- ], untilId, sinceId);
- noteIds = Array.from(new Set([...htlNoteIds, ...ltlNoteIds]));
+ ];
} else if (ps.withReplies) {
- const [htlNoteIds, ltlNoteIds, ltlReplyNoteIds] = await this.fanoutTimelineService.getMulti([
+ timelineConfig = [
`homeTimeline:${me.id}`,
'localTimeline',
'localTimelineWithReplies',
- ], untilId, sinceId);
- noteIds = Array.from(new Set([...htlNoteIds, ...ltlNoteIds, ...ltlReplyNoteIds]));
+ ];
} else {
- const [htlNoteIds, ltlNoteIds] = await this.fanoutTimelineService.getMulti([
+ timelineConfig = [
`homeTimeline:${me.id}`,
'localTimeline',
- ], untilId, sinceId);
- noteIds = Array.from(new Set([...htlNoteIds, ...ltlNoteIds]));
- shouldFallbackToDb = htlNoteIds.length === 0;
+ ];
}
- noteIds.sort((a, b) => a > b ? -1 : 1);
- noteIds = noteIds.slice(0, ps.limit);
-
- shouldFallbackToDb = shouldFallbackToDb || (noteIds.length === 0);
-
- let redisTimeline: MiNote[] = [];
-
- if (!shouldFallbackToDb) {
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
-
- redisTimeline = await query.getMany();
-
- redisTimeline = redisTimeline.filter(note => {
+ const redisTimeline = await this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ redisTimelines: timelineConfig,
+ useDbFallback: serverSettings.enableFanoutTimelineDbFallback,
+ noteFilter: (note) => {
if (note.userId === me.id) {
return true;
}
@@ -174,33 +165,24 @@ export default class extends Endpoint { // eslint-
}
return true;
- });
+ },
+ dbFallback: async (untilId, sinceId, limit) => await this.getFromDb({
+ untilId,
+ sinceId,
+ limit,
+ includeMyRenotes: ps.includeMyRenotes,
+ includeRenotedMyNotes: ps.includeRenotedMyNotes,
+ includeLocalRenotes: ps.includeLocalRenotes,
+ withFiles: ps.withFiles,
+ withReplies: ps.withReplies,
+ }, me),
+ });
- redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
- }
+ process.nextTick(() => {
+ this.activeUsersChart.read(me);
+ });
- if (redisTimeline.length > 0) {
- process.nextTick(() => {
- this.activeUsersChart.read(me);
- });
-
- return await this.noteEntityService.packMany(redisTimeline, me);
- } else {
- if (serverSettings.enableFanoutTimelineDbFallback) { // fallback to db
- return await this.getFromDb({
- untilId,
- sinceId,
- limit: ps.limit,
- includeMyRenotes: ps.includeMyRenotes,
- includeRenotedMyNotes: ps.includeRenotedMyNotes,
- includeLocalRenotes: ps.includeLocalRenotes,
- withFiles: ps.withFiles,
- withReplies: ps.withReplies,
- }, me);
- } else {
- return [];
- }
- }
+ return redisTimeline;
});
}
@@ -301,12 +283,6 @@ export default class extends Endpoint { // eslint-
}
//#endregion
- const timeline = await query.limit(ps.limit).getMany();
-
- process.nextTick(() => {
- this.activeUsersChart.read(me);
- });
-
- return await this.noteEntityService.packMany(timeline, me);
+ return await query.limit(ps.limit).getMany();
}
}
diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
index 886707005..97b05016e 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -14,10 +14,10 @@ import { RoleService } from '@/core/RoleService.js';
import { IdService } from '@/core/IdService.js';
import { CacheService } from '@/core/CacheService.js';
import { isUserRelated } from '@/misc/is-user-related.js';
-import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { QueryService } from '@/core/QueryService.js';
import { MetaService } from '@/core/MetaService.js';
import { MiLocalUser } from '@/models/User.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -51,6 +51,7 @@ export const paramDef = {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
},
@@ -68,7 +69,7 @@ export default class extends Endpoint { // eslint-
private activeUsersChart: ActiveUsersChart,
private idService: IdService,
private cacheService: CacheService,
- private fanoutTimelineService: FanoutTimelineService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
private queryService: QueryService,
private metaService: MetaService,
) {
@@ -84,13 +85,21 @@ export default class extends Endpoint { // eslint-
const serverSettings = await this.metaService.fetch();
if (!serverSettings.enableFanoutTimeline) {
- return await this.getFromDb({
+ const timeline = await this.getFromDb({
untilId,
sinceId,
limit: ps.limit,
withFiles: ps.withFiles,
withReplies: ps.withReplies,
}, me);
+
+ process.nextTick(() => {
+ if (me) {
+ this.activeUsersChart.read(me);
+ }
+ });
+
+ return await this.noteEntityService.packMany(timeline, me);
}
const [
@@ -103,36 +112,15 @@ export default class extends Endpoint { // eslint-
this.cacheService.userBlockedCache.fetch(me.id),
]) : [new Set(), new Set(), new Set()];
- let noteIds: string[];
-
- if (ps.withFiles) {
- noteIds = await this.fanoutTimelineService.get('localTimelineWithFiles', untilId, sinceId);
- } else {
- const [nonReplyNoteIds, replyNoteIds] = await this.fanoutTimelineService.getMulti([
- 'localTimeline',
- 'localTimelineWithReplies',
- ], untilId, sinceId);
- noteIds = Array.from(new Set([...nonReplyNoteIds, ...replyNoteIds]));
- noteIds.sort((a, b) => a > b ? -1 : 1);
- }
-
- noteIds = noteIds.slice(0, ps.limit);
-
- let redisTimeline: MiNote[] = [];
-
- if (noteIds.length > 0) {
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
-
- redisTimeline = await query.getMany();
-
- redisTimeline = redisTimeline.filter(note => {
+ const timeline = await this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ me,
+ useDbFallback: serverSettings.enableFanoutTimelineDbFallback,
+ redisTimelines: ps.withFiles ? ['localTimelineWithFiles'] : ['localTimeline', 'localTimelineWithReplies'],
+ noteFilter: note => {
if (me && (note.userId === me.id)) {
return true;
}
@@ -147,32 +135,23 @@ export default class extends Endpoint { // eslint-
}
return true;
- });
+ },
+ dbFallback: async (untilId, sinceId, limit) => await this.getFromDb({
+ untilId,
+ sinceId,
+ limit,
+ withFiles: ps.withFiles,
+ withReplies: ps.withReplies,
+ }, me),
+ });
- redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
- }
-
- if (redisTimeline.length > 0) {
- process.nextTick(() => {
- if (me) {
- this.activeUsersChart.read(me);
- }
- });
-
- return await this.noteEntityService.packMany(redisTimeline, me);
- } else {
- if (serverSettings.enableFanoutTimelineDbFallback) { // fallback to db
- return await this.getFromDb({
- untilId,
- sinceId,
- limit: ps.limit,
- withFiles: ps.withFiles,
- withReplies: ps.withReplies,
- }, me);
- } else {
- return [];
+ process.nextTick(() => {
+ if (me) {
+ this.activeUsersChart.read(me);
}
- }
+ });
+
+ return timeline;
});
}
@@ -213,14 +192,6 @@ export default class extends Endpoint { // eslint-
}));
}
- const timeline = await query.limit(ps.limit).getMany();
-
- process.nextTick(() => {
- if (me) {
- this.activeUsersChart.read(me);
- }
- });
-
- return await this.noteEntityService.packMany(timeline, me);
+ return await query.limit(ps.limit).getMany();
}
}
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 470abe0b1..74d0a6e0c 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -5,7 +5,7 @@
import { Brackets } from 'typeorm';
import { Inject, Injectable } from '@nestjs/common';
-import type { MiNote, NotesRepository, ChannelFollowingsRepository } from '@/models/_.js';
+import type { NotesRepository, ChannelFollowingsRepository } from '@/models/_.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { QueryService } from '@/core/QueryService.js';
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
@@ -14,10 +14,10 @@ import { DI } from '@/di-symbols.js';
import { IdService } from '@/core/IdService.js';
import { CacheService } from '@/core/CacheService.js';
import { isUserRelated } from '@/misc/is-user-related.js';
-import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { UserFollowingService } from '@/core/UserFollowingService.js';
import { MiLocalUser } from '@/models/User.js';
import { MetaService } from '@/core/MetaService.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
export const meta = {
tags: ['notes'],
@@ -43,6 +43,7 @@ export const paramDef = {
untilId: { type: 'string', format: 'misskey:id' },
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
includeMyRenotes: { type: 'boolean', default: true },
includeRenotedMyNotes: { type: 'boolean', default: true },
includeLocalRenotes: { type: 'boolean', default: true },
@@ -65,7 +66,7 @@ export default class extends Endpoint { // eslint-
private activeUsersChart: ActiveUsersChart,
private idService: IdService,
private cacheService: CacheService,
- private fanoutTimelineService: FanoutTimelineService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
private userFollowingService: UserFollowingService,
private queryService: QueryService,
private metaService: MetaService,
@@ -77,7 +78,7 @@ export default class extends Endpoint { // eslint-
const serverSettings = await this.metaService.fetch();
if (!serverSettings.enableFanoutTimeline) {
- return await this.getFromDb({
+ const timeline = await this.getFromDb({
untilId,
sinceId,
limit: ps.limit,
@@ -87,6 +88,12 @@ export default class extends Endpoint { // eslint-
withFiles: ps.withFiles,
withRenotes: ps.withRenotes,
}, me);
+
+ process.nextTick(() => {
+ this.activeUsersChart.read(me);
+ });
+
+ return await this.noteEntityService.packMany(timeline, me);
}
const [
@@ -101,24 +108,15 @@ export default class extends Endpoint { // eslint-
this.cacheService.userBlockedCache.fetch(me.id),
]);
- let noteIds = await this.fanoutTimelineService.get(ps.withFiles ? `homeTimelineWithFiles:${me.id}` : `homeTimeline:${me.id}`, untilId, sinceId);
- noteIds = noteIds.slice(0, ps.limit);
-
- let redisTimeline: MiNote[] = [];
-
- if (noteIds.length > 0) {
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
-
- redisTimeline = await query.getMany();
-
- redisTimeline = redisTimeline.filter(note => {
+ const timeline = this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ me,
+ useDbFallback: serverSettings.enableFanoutTimelineDbFallback,
+ redisTimelines: ps.withFiles ? [`homeTimelineWithFiles:${me.id}`] : [`homeTimeline:${me.id}`],
+ noteFilter: note => {
if (note.userId === me.id) {
return true;
}
@@ -135,33 +133,24 @@ export default class extends Endpoint { // eslint-
}
return true;
- });
+ },
+ dbFallback: async (untilId, sinceId, limit) => await this.getFromDb({
+ untilId,
+ sinceId,
+ limit,
+ includeMyRenotes: ps.includeMyRenotes,
+ includeRenotedMyNotes: ps.includeRenotedMyNotes,
+ includeLocalRenotes: ps.includeLocalRenotes,
+ withFiles: ps.withFiles,
+ withRenotes: ps.withRenotes,
+ }, me),
+ });
- redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
- }
+ process.nextTick(() => {
+ this.activeUsersChart.read(me);
+ });
- if (redisTimeline.length > 0) {
- process.nextTick(() => {
- this.activeUsersChart.read(me);
- });
-
- return await this.noteEntityService.packMany(redisTimeline, me);
- } else {
- if (serverSettings.enableFanoutTimelineDbFallback) { // fallback to db
- return await this.getFromDb({
- untilId,
- sinceId,
- limit: ps.limit,
- includeMyRenotes: ps.includeMyRenotes,
- includeRenotedMyNotes: ps.includeRenotedMyNotes,
- includeLocalRenotes: ps.includeLocalRenotes,
- withFiles: ps.withFiles,
- withRenotes: ps.withRenotes,
- }, me);
- } else {
- return [];
- }
- }
+ return timeline;
});
}
@@ -269,12 +258,6 @@ export default class extends Endpoint { // eslint-
}
//#endregion
- const timeline = await query.limit(ps.limit).getMany();
-
- process.nextTick(() => {
- this.activeUsersChart.read(me);
- });
-
- return await this.noteEntityService.packMany(timeline, me);
+ return await query.limit(ps.limit).getMany();
}
}
diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
index 1ac1d37f4..f39cac5c3 100644
--- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -17,6 +17,7 @@ import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { QueryService } from '@/core/QueryService.js';
import { MiLocalUser } from '@/models/User.js';
import { MetaService } from '@/core/MetaService.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -52,6 +53,7 @@ export const paramDef = {
untilId: { type: 'string', format: 'misskey:id' },
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
includeMyRenotes: { type: 'boolean', default: true },
includeRenotedMyNotes: { type: 'boolean', default: true },
includeLocalRenotes: { type: 'boolean', default: true },
@@ -82,6 +84,7 @@ export default class extends Endpoint { // eslint-
private cacheService: CacheService,
private idService: IdService,
private fanoutTimelineService: FanoutTimelineService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
private queryService: QueryService,
private metaService: MetaService,
) {
@@ -101,7 +104,7 @@ export default class extends Endpoint { // eslint-
const serverSettings = await this.metaService.fetch();
if (!serverSettings.enableFanoutTimeline) {
- return await this.getFromDb(list, {
+ const timeline = await this.getFromDb(list, {
untilId,
sinceId,
limit: ps.limit,
@@ -111,6 +114,10 @@ export default class extends Endpoint { // eslint-
withFiles: ps.withFiles,
withRenotes: ps.withRenotes,
}, me);
+
+ this.activeUsersChart.read(me);
+
+ await this.noteEntityService.packMany(timeline, me);
}
const [
@@ -123,24 +130,15 @@ export default class extends Endpoint { // eslint-
this.cacheService.userBlockedCache.fetch(me.id),
]);
- let noteIds = await this.fanoutTimelineService.get(ps.withFiles ? `userListTimelineWithFiles:${list.id}` : `userListTimeline:${list.id}`, untilId, sinceId);
- noteIds = noteIds.slice(0, ps.limit);
-
- let redisTimeline: MiNote[] = [];
-
- if (noteIds.length > 0) {
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
-
- redisTimeline = await query.getMany();
-
- redisTimeline = redisTimeline.filter(note => {
+ const timeline = await this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ me,
+ useDbFallback: serverSettings.enableFanoutTimelineDbFallback,
+ redisTimelines: ps.withFiles ? [`userListTimelineWithFiles:${list.id}`] : [`userListTimeline:${list.id}`],
+ noteFilter: note => {
if (note.userId === me.id) {
return true;
}
@@ -154,30 +152,22 @@ export default class extends Endpoint { // eslint-
}
return true;
- });
+ },
+ dbFallback: async (untilId, sinceId, limit) => await this.getFromDb(list, {
+ untilId,
+ sinceId,
+ limit,
+ includeMyRenotes: ps.includeMyRenotes,
+ includeRenotedMyNotes: ps.includeRenotedMyNotes,
+ includeLocalRenotes: ps.includeLocalRenotes,
+ withFiles: ps.withFiles,
+ withRenotes: ps.withRenotes,
+ }, me),
+ });
- redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
- }
+ this.activeUsersChart.read(me);
- if (redisTimeline.length > 0) {
- this.activeUsersChart.read(me);
- return await this.noteEntityService.packMany(redisTimeline, me);
- } else {
- if (serverSettings.enableFanoutTimelineDbFallback) { // fallback to db
- return await this.getFromDb(list, {
- untilId,
- sinceId,
- limit: ps.limit,
- includeMyRenotes: ps.includeMyRenotes,
- includeRenotedMyNotes: ps.includeRenotedMyNotes,
- includeLocalRenotes: ps.includeLocalRenotes,
- withFiles: ps.withFiles,
- withRenotes: ps.withRenotes,
- }, me);
- } else {
- return [];
- }
- }
+ return timeline;
});
}
@@ -271,10 +261,6 @@ export default class extends Endpoint { // eslint-
}
//#endregion
- const timeline = await query.limit(ps.limit).getMany();
-
- this.activeUsersChart.read(me);
-
- return await this.noteEntityService.packMany(timeline, me);
+ return await query.limit(ps.limit).getMany();
}
}
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 76033ddb0..56983f7bc 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -5,8 +5,7 @@
import { Brackets } from 'typeorm';
import { Inject, Injectable } from '@nestjs/common';
-import * as Redis from 'ioredis';
-import type { MiNote, NotesRepository } from '@/models/_.js';
+import type { NotesRepository } from '@/models/_.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { DI } from '@/di-symbols.js';
@@ -14,9 +13,9 @@ import { CacheService } from '@/core/CacheService.js';
import { IdService } from '@/core/IdService.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { QueryService } from '@/core/QueryService.js';
-import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { MetaService } from '@/core/MetaService.js';
-import { ApiError } from '../../error.js';
+import { MiLocalUser } from '@/models/User.js';
+import { FanoutTimelineEndpointService } from '@/core/FanoutTimelineEndpointService.js';
export const meta = {
tags: ['users', 'notes'],
@@ -52,6 +51,7 @@ export const paramDef = {
untilId: { type: 'string', format: 'misskey:id' },
sinceDate: { type: 'integer' },
untilDate: { type: 'integer' },
+ allowPartial: { type: 'boolean', default: false }, // true is recommended but for compatibility false by default
withFiles: { type: 'boolean', default: false },
},
required: ['userId'],
@@ -60,9 +60,6 @@ export const paramDef = {
@Injectable()
export default class extends Endpoint { // eslint-disable-line import/no-default-export
constructor(
- @Inject(DI.redisForTimelines)
- private redisForTimelines: Redis.Redis,
-
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@@ -70,121 +67,130 @@ export default class extends Endpoint { // eslint-
private queryService: QueryService,
private cacheService: CacheService,
private idService: IdService,
- private fanoutTimelineService: FanoutTimelineService,
+ private fanoutTimelineEndpointService: FanoutTimelineEndpointService,
private metaService: MetaService,
) {
super(meta, paramDef, async (ps, me) => {
const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null);
const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null);
- const isRangeSpecified = untilId != null && sinceId != null;
const isSelf = me && (me.id === ps.userId);
const serverSettings = await this.metaService.fetch();
- if (serverSettings.enableFanoutTimeline && (isRangeSpecified || sinceId == null)) {
- const [
- userIdsWhoMeMuting,
- ] = me ? await Promise.all([
- this.cacheService.userMutingsCache.fetch(me.id),
- ]) : [new Set()];
+ if (!serverSettings.enableFanoutTimeline) {
+ const timeline = await this.getFromDb({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ userId: ps.userId,
+ withChannelNotes: ps.withChannelNotes,
+ withFiles: ps.withFiles,
+ withRenotes: ps.withRenotes,
+ }, me);
- const [noteIdsRes, repliesNoteIdsRes, channelNoteIdsRes] = await Promise.all([
- this.fanoutTimelineService.get(ps.withFiles ? `userTimelineWithFiles:${ps.userId}` : `userTimeline:${ps.userId}`, untilId, sinceId),
- ps.withReplies ? this.fanoutTimelineService.get(`userTimelineWithReplies:${ps.userId}`, untilId, sinceId) : Promise.resolve([]),
- ps.withChannelNotes ? this.fanoutTimelineService.get(`userTimelineWithChannel:${ps.userId}`, untilId, sinceId) : Promise.resolve([]),
- ]);
+ return await this.noteEntityService.packMany(timeline, me);
+ }
- let noteIds = Array.from(new Set([
- ...noteIdsRes,
- ...repliesNoteIdsRes,
- ...channelNoteIdsRes,
- ]));
- noteIds.sort((a, b) => a > b ? -1 : 1);
- noteIds = noteIds.slice(0, ps.limit);
+ const [
+ userIdsWhoMeMuting,
+ ] = me ? await Promise.all([
+ this.cacheService.userMutingsCache.fetch(me.id),
+ ]) : [new Set()];
- if (noteIds.length > 0) {
- const isFollowing = me && Object.hasOwn(await this.cacheService.userFollowingsCache.fetch(me.id), ps.userId);
+ const redisTimelines = [ps.withFiles ? `userTimelineWithFiles:${ps.userId}` : `userTimeline:${ps.userId}`];
- const query = this.notesRepository.createQueryBuilder('note')
- .where('note.id IN (:...noteIds)', { noteIds: noteIds })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser')
- .leftJoinAndSelect('note.channel', 'channel');
+ if (ps.withReplies) redisTimelines.push(`userTimelineWithReplies:${ps.userId}`);
+ if (ps.withChannelNotes) redisTimelines.push(`userTimelineWithChannel:${ps.userId}`);
- let timeline = await query.getMany();
+ const isFollowing = me && Object.hasOwn(await this.cacheService.userFollowingsCache.fetch(me.id), ps.userId);
- timeline = timeline.filter(note => {
- if (me && isUserRelated(note, userIdsWhoMeMuting, true)) return false;
+ const timeline = await this.fanoutTimelineEndpointService.timeline({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ allowPartial: ps.allowPartial,
+ me,
+ redisTimelines,
+ useDbFallback: true,
+ noteFilter: note => {
+ if (me && isUserRelated(note, userIdsWhoMeMuting, true)) return false;
- if (note.renoteId) {
- if (note.text == null && note.fileIds.length === 0 && !note.hasPoll) {
- if (ps.withRenotes === false) return false;
- }
+ if (note.renoteId) {
+ if (note.text == null && note.fileIds.length === 0 && !note.hasPoll) {
+ if (ps.withRenotes === false) return false;
}
-
- if (note.channel?.isSensitive && !isSelf) return false;
- if (note.visibility === 'specified' && (!me || (me.id !== note.userId && !note.visibleUserIds.some(v => v === me.id)))) return false;
- if (note.visibility === 'followers' && !isFollowing && !isSelf) return false;
-
- return true;
- });
-
- // TODO: フィルタで件数が減った場合の埋め合わせ処理
-
- timeline.sort((a, b) => a.id > b.id ? -1 : 1);
-
- if (timeline.length > 0) {
- return await this.noteEntityService.packMany(timeline, me);
}
- }
- }
- //#region fallback to database
- const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
- .andWhere('note.userId = :userId', { userId: ps.userId })
- .innerJoinAndSelect('note.user', 'user')
- .leftJoinAndSelect('note.reply', 'reply')
- .leftJoinAndSelect('note.renote', 'renote')
- .leftJoinAndSelect('note.channel', 'channel')
- .leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ if (note.channel?.isSensitive && !isSelf) return false;
+ if (note.visibility === 'specified' && (!me || (me.id !== note.userId && !note.visibleUserIds.some(v => v === me.id)))) return false;
+ if (note.visibility === 'followers' && !isFollowing && !isSelf) return false;
- if (ps.withChannelNotes) {
- if (!isSelf) query.andWhere(new Brackets(qb => {
- qb.orWhere('note.channelId IS NULL');
- qb.orWhere('channel.isSensitive = false');
- }));
- } else {
- query.andWhere('note.channelId IS NULL');
- }
+ return true;
+ },
+ dbFallback: async (untilId, sinceId, limit) => await this.getFromDb({
+ untilId,
+ sinceId,
+ limit,
+ userId: ps.userId,
+ withChannelNotes: ps.withChannelNotes,
+ withFiles: ps.withFiles,
+ withRenotes: ps.withRenotes,
+ }, me),
+ });
- this.queryService.generateVisibilityQuery(query, me);
- if (me) {
- this.queryService.generateMutedUserQuery(query, me, { id: ps.userId });
- this.queryService.generateBlockedUserQuery(query, me);
- }
-
- if (ps.withFiles) {
- query.andWhere('note.fileIds != \'{}\'');
- }
-
- if (ps.withRenotes === false) {
- query.andWhere(new Brackets(qb => {
- qb.orWhere('note.userId != :userId', { userId: ps.userId });
- qb.orWhere('note.renoteId IS NULL');
- qb.orWhere('note.text IS NOT NULL');
- qb.orWhere('note.fileIds != \'{}\'');
- qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)');
- }));
- }
-
- const timeline = await query.limit(ps.limit).getMany();
-
- return await this.noteEntityService.packMany(timeline, me);
- //#endregion
+ return timeline;
});
}
+
+ private async getFromDb(ps: {
+ untilId: string | null,
+ sinceId: string | null,
+ limit: number,
+ userId: string,
+ withChannelNotes: boolean,
+ withFiles: boolean,
+ withRenotes: boolean,
+ }, me: MiLocalUser | null) {
+ const isSelf = me && (me.id === ps.userId);
+
+ const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId)
+ .andWhere('note.userId = :userId', { userId: ps.userId })
+ .innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('note.reply', 'reply')
+ .leftJoinAndSelect('note.renote', 'renote')
+ .leftJoinAndSelect('note.channel', 'channel')
+ .leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('renote.user', 'renoteUser');
+
+ if (ps.withChannelNotes) {
+ if (!isSelf) query.andWhere(new Brackets(qb => {
+ qb.orWhere('note.channelId IS NULL');
+ qb.orWhere('channel.isSensitive = false');
+ }));
+ } else {
+ query.andWhere('note.channelId IS NULL');
+ }
+
+ this.queryService.generateVisibilityQuery(query, me);
+ if (me) {
+ this.queryService.generateMutedUserQuery(query, me, { id: ps.userId });
+ this.queryService.generateBlockedUserQuery(query, me);
+ }
+
+ if (ps.withFiles) {
+ query.andWhere('note.fileIds != \'{}\'');
+ }
+
+ if (ps.withRenotes === false) {
+ query.andWhere(new Brackets(qb => {
+ qb.orWhere('note.userId != :userId', { userId: ps.userId });
+ qb.orWhere('note.renoteId IS NULL');
+ qb.orWhere('note.text IS NOT NULL');
+ qb.orWhere('note.fileIds != \'{}\'');
+ qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)');
+ }));
+ }
+
+ return await query.limit(ps.limit).getMany();
+ }
}
diff --git a/packages/frontend/src/components/MkPagination.vue b/packages/frontend/src/components/MkPagination.vue
index 2c59e6d4e..57348cde5 100644
--- a/packages/frontend/src/components/MkPagination.vue
+++ b/packages/frontend/src/components/MkPagination.vue
@@ -206,6 +206,7 @@ async function init(): Promise {
await os.api(props.pagination.endpoint, {
...params,
limit: props.pagination.limit ?? 10,
+ allowPartial: true,
}).then(res => {
for (let i = 0; i < res.length; i++) {
const item = res[i];
From 238e8ce93967c19d48e7b07c55d1faef4e64cb56 Mon Sep 17 00:00:00 2001
From: MeiMei <30769358+mei23@users.noreply.github.com>
Date: Sat, 2 Dec 2023 19:32:30 +0900
Subject: [PATCH 28/76] fix: Filter featured collection (#12541)
---
packages/backend/src/core/NotePiningService.ts | 4 ++--
packages/backend/src/server/ActivityPubServerService.ts | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/packages/backend/src/core/NotePiningService.ts b/packages/backend/src/core/NotePiningService.ts
index 52abb4c2a..74e53c5c4 100644
--- a/packages/backend/src/core/NotePiningService.ts
+++ b/packages/backend/src/core/NotePiningService.ts
@@ -77,7 +77,7 @@ export class NotePiningService {
} as MiUserNotePining);
// Deliver to remote followers
- if (this.userEntityService.isLocalUser(user)) {
+ if (this.userEntityService.isLocalUser(user) && !note.localOnly && ['public', 'home'].includes(note.visibility)) {
this.deliverPinnedChange(user.id, note.id, true);
}
}
@@ -105,7 +105,7 @@ export class NotePiningService {
});
// Deliver to remote followers
- if (this.userEntityService.isLocalUser(user)) {
+ if (this.userEntityService.isLocalUser(user) && !note.localOnly && ['public', 'home'].includes(note.visibility)) {
this.deliverPinnedChange(user.id, noteId, false);
}
}
diff --git a/packages/backend/src/server/ActivityPubServerService.ts b/packages/backend/src/server/ActivityPubServerService.ts
index 2c9e2cf24..78d2daa40 100644
--- a/packages/backend/src/server/ActivityPubServerService.ts
+++ b/packages/backend/src/server/ActivityPubServerService.ts
@@ -370,8 +370,9 @@ export class ActivityPubServerService {
order: { id: 'DESC' },
});
- const pinnedNotes = await Promise.all(pinings.map(pining =>
- this.notesRepository.findOneByOrFail({ id: pining.noteId })));
+ const pinnedNotes = (await Promise.all(pinings.map(pining =>
+ this.notesRepository.findOneByOrFail({ id: pining.noteId }))))
+ .filter(note => !note.localOnly && ['public', 'home'].includes(note.visibility));
const renderedNotes = await Promise.all(pinnedNotes.map(note => this.apRendererService.renderNote(note)));
From 92029ac325c8cf74d2227beffb763ec3e6c01aea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?=
<46447427+samunohito@users.noreply.github.com>
Date: Sat, 2 Dec 2023 20:11:31 +0900
Subject: [PATCH 29/76] fix: #12544 (#12545)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* meを渡し忘れている
* fix CHANGELOG.md
* Revert "fix CHANGELOG.md"
This reverts commit aaee4e9b8a6abf510f393bc02282f6ac016d2124.
---
.../backend/src/server/api/endpoints/notes/hybrid-timeline.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
index 820692626..deb9e014c 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -149,6 +149,7 @@ export default class extends Endpoint { // eslint-
sinceId,
limit: ps.limit,
allowPartial: ps.allowPartial,
+ me,
redisTimelines: timelineConfig,
useDbFallback: serverSettings.enableFanoutTimelineDbFallback,
noteFilter: (note) => {
From 336416261a0a9f46467f90e93854d81ca01292d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?=
<46447427+samunohito@users.noreply.github.com>
Date: Sat, 2 Dec 2023 21:00:05 +0900
Subject: [PATCH 30/76] =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=AF=E3=82=A8?=
=?UTF-8?q?=E3=83=B3=E3=83=89=E3=81=8C=E7=94=9F=E6=88=90=E3=81=99=E3=82=8B?=
=?UTF-8?q?api.json=E3=81=8B=E3=82=89misskey-js=E3=81=AE=E5=9E=8B=E3=82=92?=
=?UTF-8?q?=E4=BD=9C=E6=88=90=E3=81=99=E3=82=8B=20(#12434)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* ひとまず生成できるところまで
* ファイル構成整理
* 生成コマンド整理
* misskey-jsへの組み込み
* fix generator.ts
* wip
* fix generator.ts
* fix package.json
* 生成ロジックの調整
* 型レベルでのswitch-case機構をmisskey-jsからfrontendに持ち込めるようにした
* 型チェック用のtsconfig.jsonを作成
* 他のエンドポイントを呼ぶ関数にも適用
* 未使用エンティティなどを削除
* misskey-js側で手動定義されていた型を自動生成された型に移行(ただしapi.jsonがvalidでなくなってしまったので後で修正する)
* messagingは廃止されている(テストのビルドエラー解消)
* validなapi.jsonを出力できるように修正
* 修正漏れ対応
* Ajvに怒られて起動できなかったところを修正
* fix ci(途中)
* パラメータenumをやめる
* add command
* add api.json
* 都度自動生成をやめる
* 一気通貫スクリプト修正
* fix ci
* 生成ロジック修正
* フロントの型チェックは結局やらなかったので戻しておく
* fix pnpm-lock.yaml
* add README.md
---------
Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com>
Co-authored-by: syuilo
---
package.json | 4 +-
.../src/server/api/endpoints/admin/meta.ts | 76 +
.../api/endpoints/federation/instances.ts | 29 +-
.../backend/src/server/api/endpoints/meta.ts | 27 +
.../frontend/src/components/MkEmojiPicker.vue | 8 +-
.../src/components/MkFeaturedPhotos.vue | 2 +-
.../src/components/MkInstanceCardMini.vue | 6 +-
.../frontend/src/components/MkInviteCode.vue | 2 +-
.../src/components/MkVisitorDashboard.vue | 7 +-
packages/frontend/src/custom-emojis.ts | 6 +-
packages/frontend/src/filters/user.ts | 1 -
packages/frontend/src/instance.ts | 2 +-
packages/frontend/src/pages/_error_.vue | 2 +-
packages/frontend/src/pages/about.emojis.vue | 2 +-
packages/frontend/src/pages/auth.form.vue | 2 +-
packages/frontend/src/pages/auth.vue | 2 +-
packages/frontend/src/pages/instance-info.vue | 15 +-
packages/frontend/src/pages/invite.vue | 2 +-
.../frontend/src/pages/welcome.entrance.a.vue | 12 +-
packages/frontend/src/scripts/api.ts | 19 +-
.../src/ui/_common_/statusbar-federation.vue | 2 +-
packages/misskey-js/etc/misskey-js.api.md | 4501 ++-
packages/misskey-js/generator/.eslintrc.cjs | 9 +
packages/misskey-js/generator/.gitignore | 1 +
packages/misskey-js/generator/README.md | 19 +
packages/misskey-js/generator/package.json | 24 +
.../misskey-js/generator/src/generator.ts | 284 +
packages/misskey-js/generator/tsconfig.json | 20 +
packages/misskey-js/package.json | 6 +-
packages/misskey-js/src/api.ts | 62 +-
packages/misskey-js/src/api.types.ts | 703 +-
packages/misskey-js/src/autogen/endpoint.ts | 802 +
packages/misskey-js/src/autogen/entities.ts | 478 +
packages/misskey-js/src/autogen/models.ts | 39 +
packages/misskey-js/src/autogen/types.ts | 22560 ++++++++++++++++
packages/misskey-js/src/entities.ts | 610 +-
packages/misskey-js/src/streaming.types.ts | 25 +-
packages/misskey-js/test-d/api.ts | 10 +-
packages/misskey-js/test-d/streaming.ts | 14 -
packages/misskey-js/tsconfig.json | 2 +-
pnpm-lock.yaml | 619 +-
pnpm-workspace.yaml | 1 +
42 files changed, 27053 insertions(+), 3964 deletions(-)
create mode 100644 packages/misskey-js/generator/.eslintrc.cjs
create mode 100644 packages/misskey-js/generator/.gitignore
create mode 100644 packages/misskey-js/generator/README.md
create mode 100644 packages/misskey-js/generator/package.json
create mode 100644 packages/misskey-js/generator/src/generator.ts
create mode 100644 packages/misskey-js/generator/tsconfig.json
create mode 100644 packages/misskey-js/src/autogen/endpoint.ts
create mode 100644 packages/misskey-js/src/autogen/entities.ts
create mode 100644 packages/misskey-js/src/autogen/models.ts
create mode 100644 packages/misskey-js/src/autogen/types.ts
diff --git a/package.json b/package.json
index fc328a650..9fa094e04 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
"build-assets": "node ./scripts/build-assets.mjs",
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
"build-storybook": "pnpm --filter frontend build-storybook",
+ "build-misskey-js-with-types": "pnpm --filter backend build && pnpm --filter backend generate-api-json && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build",
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
"init": "pnpm migrate",
@@ -57,7 +58,8 @@
"cross-env": "7.0.3",
"cypress": "13.6.0",
"eslint": "8.54.0",
- "start-server-and-test": "2.0.3"
+ "start-server-and-test": "2.0.3",
+ "ncp": "2.0.0"
},
"optionalDependencies": {
"@tensorflow/tfjs-core": "4.4.0"
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 1dddb166a..8774bcbb6 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -327,6 +327,82 @@ export const meta = {
type: 'number',
optional: false, nullable: false,
},
+ backgroundImageUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ deeplAuthKey: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ deeplIsPro: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ defaultDarkTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ defaultLightTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ description: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ disableRegistration: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ impressumUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ maintainerEmail: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ maintainerName: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ name: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ objectStorageS3ForcePathStyle: {
+ type: 'boolean',
+ optional: false, nullable: false,
+ },
+ privacyPolicyUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ repositoryUrl: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ summalyProxy: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ themeColor: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ tosUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ uri: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
+ version: {
+ type: 'string',
+ optional: false, nullable: false,
+ },
},
},
} as const;
diff --git a/packages/backend/src/server/api/endpoints/federation/instances.ts b/packages/backend/src/server/api/endpoints/federation/instances.ts
index c8beefa9c..e5a90715f 100644
--- a/packages/backend/src/server/api/endpoints/federation/instances.ts
+++ b/packages/backend/src/server/api/endpoints/federation/instances.ts
@@ -36,13 +36,32 @@ export const paramDef = {
blocked: { type: 'boolean', nullable: true },
notResponding: { type: 'boolean', nullable: true },
suspended: { type: 'boolean', nullable: true },
- silenced: { type: "boolean", nullable: true },
+ silenced: { type: 'boolean', nullable: true },
federating: { type: 'boolean', nullable: true },
subscribing: { type: 'boolean', nullable: true },
publishing: { type: 'boolean', nullable: true },
limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
offset: { type: 'integer', default: 0 },
- sort: { type: 'string' },
+ sort: {
+ type: 'string',
+ nullable: true,
+ enum: [
+ '+pubSub',
+ '-pubSub',
+ '+notes',
+ '-notes',
+ '+users',
+ '-users',
+ '+following',
+ '-following',
+ '+followers',
+ '-followers',
+ '+firstRetrievedAt',
+ '-firstRetrievedAt',
+ '+latestRequestReceivedAt',
+ '-latestRequestReceivedAt',
+ ],
+ },
},
required: [],
} as const;
@@ -103,18 +122,18 @@ export default class extends Endpoint { // eslint-
}
}
- if (typeof ps.silenced === "boolean") {
+ if (typeof ps.silenced === 'boolean') {
const meta = await this.metaService.fetch(true);
if (ps.silenced) {
if (meta.silencedHosts.length === 0) {
return [];
}
- query.andWhere("instance.host IN (:...silences)", {
+ query.andWhere('instance.host IN (:...silences)', {
silences: meta.silencedHosts,
});
} else if (meta.silencedHosts.length > 0) {
- query.andWhere("instance.host NOT IN (:...silences)", {
+ query.andWhere('instance.host NOT IN (:...silences)', {
silences: meta.silencedHosts,
});
}
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 2727e4f09..9dd455315 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -250,6 +250,33 @@ export const meta = {
},
},
},
+ backgroundImageUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ impressumUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ logoImageUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ privacyPolicyUrl: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ serverRules: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'string',
+ },
+ },
+ themeColor: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
},
},
} as const;
diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue
index 603f676d5..ecff2b5ac 100644
--- a/packages/frontend/src/components/MkEmojiPicker.vue
+++ b/packages/frontend/src/components/MkEmojiPicker.vue
@@ -149,7 +149,7 @@ const size = computed(() => props.asReactionPicker ? reactionPickerSize.value :
const width = computed(() => props.asReactionPicker ? reactionPickerWidth.value : 3);
const height = computed(() => props.asReactionPicker ? reactionPickerHeight.value : 2);
const q = ref('');
-const searchResultCustom = ref([]);
+const searchResultCustom = ref([]);
const searchResultUnicode = ref([]);
const tab = ref<'index' | 'custom' | 'unicode' | 'tags'>('index');
@@ -196,7 +196,7 @@ watch(q, () => {
const searchCustom = () => {
const max = 100;
const emojis = customEmojis.value;
- const matches = new Set();
+ const matches = new Set();
const exactMatch = emojis.find(emoji => emoji.name === newQ);
if (exactMatch) matches.add(exactMatch);
@@ -326,7 +326,7 @@ watch(q, () => {
searchResultUnicode.value = Array.from(searchUnicode());
});
-function filterAvailable(emoji: Misskey.entities.CustomEmoji): boolean {
+function filterAvailable(emoji: Misskey.entities.EmojiSimple): boolean {
return (emoji.roleIdsThatCanBeUsedThisEmojiAsReaction == null || emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.length === 0) || ($i && $i.roles.some(r => emoji.roleIdsThatCanBeUsedThisEmojiAsReaction.includes(r.id)));
}
@@ -343,7 +343,7 @@ function reset() {
q.value = '';
}
-function getKey(emoji: string | Misskey.entities.CustomEmoji | UnicodeEmojiDef): string {
+function getKey(emoji: string | Misskey.entities.EmojiSimple | UnicodeEmojiDef): string {
return typeof emoji === 'string' ? emoji : 'char' in emoji ? emoji.char : `:${emoji.name}:`;
}
diff --git a/packages/frontend/src/components/MkFeaturedPhotos.vue b/packages/frontend/src/components/MkFeaturedPhotos.vue
index cef1943d5..6d1bad743 100644
--- a/packages/frontend/src/components/MkFeaturedPhotos.vue
+++ b/packages/frontend/src/components/MkFeaturedPhotos.vue
@@ -12,7 +12,7 @@ import { ref } from 'vue';
import * as Misskey from 'misskey-js';
import * as os from '@/os.js';
-const meta = ref();
+const meta = ref();
os.api('meta', { detail: true }).then(gotMeta => {
meta.value = gotMeta;
diff --git a/packages/frontend/src/components/MkInstanceCardMini.vue b/packages/frontend/src/components/MkInstanceCardMini.vue
index e384b7a0b..9710f779d 100644
--- a/packages/frontend/src/components/MkInstanceCardMini.vue
+++ b/packages/frontend/src/components/MkInstanceCardMini.vue
@@ -21,15 +21,15 @@ import * as os from '@/os.js';
import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js';
const props = defineProps<{
- instance: Misskey.entities.Instance;
+ instance: Misskey.entities.FederationInstance;
}>();
let chartValues = $ref(null);
os.apiGet('charts/instance', { host: props.instance.host, limit: 16 + 1, span: 'day' }).then(res => {
// 今日のぶんの値はまだ途中の値であり、それも含めると大抵の場合前日よりも下降しているようなグラフになってしまうため今日は弾く
- res.requests.received.splice(0, 1);
- chartValues = res.requests.received;
+ res['requests.received'].splice(0, 1);
+ chartValues = res['requests.received'];
});
function getInstanceIcon(instance): string {
diff --git a/packages/frontend/src/components/MkInviteCode.vue b/packages/frontend/src/components/MkInviteCode.vue
index ff3794ad1..84d797484 100644
--- a/packages/frontend/src/components/MkInviteCode.vue
+++ b/packages/frontend/src/components/MkInviteCode.vue
@@ -67,7 +67,7 @@ import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
const props = defineProps<{
- invite: Misskey.entities.Invite;
+ invite: Misskey.entities.InviteCode;
moderator?: boolean;
}>();
diff --git a/packages/frontend/src/components/MkVisitorDashboard.vue b/packages/frontend/src/components/MkVisitorDashboard.vue
index 40493a5d0..3eb5c1966 100644
--- a/packages/frontend/src/components/MkVisitorDashboard.vue
+++ b/packages/frontend/src/components/MkVisitorDashboard.vue
@@ -67,15 +67,14 @@ import number from '@/filters/number.js';
import MkNumber from '@/components/MkNumber.vue';
import XActiveUsersChart from '@/components/MkVisitorDashboard.ActiveUsersChart.vue';
-let meta = $ref();
-let stats = $ref(null);
+let meta = $ref(null);
+let stats = $ref(null);
os.api('meta', { detail: true }).then(_meta => {
meta = _meta;
});
-os.api('stats', {
-}).then((res) => {
+os.api('stats', {}).then((res) => {
stats = res;
});
diff --git a/packages/frontend/src/custom-emojis.ts b/packages/frontend/src/custom-emojis.ts
index 8ecd1bd2e..6a48159f1 100644
--- a/packages/frontend/src/custom-emojis.ts
+++ b/packages/frontend/src/custom-emojis.ts
@@ -10,7 +10,7 @@ import { useStream } from '@/stream.js';
import { get, set } from '@/scripts/idb-proxy.js';
const storageCache = await get('emojis');
-export const customEmojis = shallowRef(Array.isArray(storageCache) ? storageCache : []);
+export const customEmojis = shallowRef(Array.isArray(storageCache) ? storageCache : []);
export const customEmojiCategories = computed<[ ...string[], null ]>(() => {
const categories = new Set();
for (const emoji of customEmojis.value) {
@@ -21,7 +21,7 @@ export const customEmojiCategories = computed<[ ...string[], null ]>(() => {
return markRaw([...Array.from(categories), null]);
});
-export const customEmojisMap = new Map();
+export const customEmojisMap = new Map();
watch(customEmojis, emojis => {
customEmojisMap.clear();
for (const emoji of emojis) {
@@ -38,7 +38,7 @@ stream.on('emojiAdded', emojiData => {
});
stream.on('emojiUpdated', emojiData => {
- customEmojis.value = customEmojis.value.map(item => emojiData.emojis.find(search => search.name === item.name) as Misskey.entities.CustomEmoji ?? item);
+ customEmojis.value = customEmojis.value.map(item => emojiData.emojis.find(search => search.name === item.name) as Misskey.entities.EmojiSimple ?? item);
set('emojis', customEmojis.value);
});
diff --git a/packages/frontend/src/filters/user.ts b/packages/frontend/src/filters/user.ts
index a7a13bec6..8d2060372 100644
--- a/packages/frontend/src/filters/user.ts
+++ b/packages/frontend/src/filters/user.ts
@@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import * as Misskey from 'misskey-js';
import * as Misskey from 'misskey-js';
import { url } from '@/config.js';
diff --git a/packages/frontend/src/instance.ts b/packages/frontend/src/instance.ts
index cbfd95951..b09264dab 100644
--- a/packages/frontend/src/instance.ts
+++ b/packages/frontend/src/instance.ts
@@ -15,7 +15,7 @@ const cached = miLocalStorage.getItem('instance');
// TODO: instanceをリアクティブにするかは再考の余地あり
-export const instance: Misskey.entities.InstanceMetadata = reactive(cached ? JSON.parse(cached) : {
+export const instance: Misskey.entities.MetaResponse = reactive(cached ? JSON.parse(cached) : {
// TODO: set default values
});
diff --git a/packages/frontend/src/pages/_error_.vue b/packages/frontend/src/pages/_error_.vue
index 7a3e2f444..4821687ac 100644
--- a/packages/frontend/src/pages/_error_.vue
+++ b/packages/frontend/src/pages/_error_.vue
@@ -44,7 +44,7 @@ const props = withDefaults(defineProps<{
let loaded = $ref(false);
let serverIsDead = $ref(false);
-let meta = $ref(null);
+let meta = $ref(null);
os.api('meta', {
detail: false,
diff --git a/packages/frontend/src/pages/about.emojis.vue b/packages/frontend/src/pages/about.emojis.vue
index c9bb6f897..4ae460f76 100644
--- a/packages/frontend/src/pages/about.emojis.vue
+++ b/packages/frontend/src/pages/about.emojis.vue
@@ -48,7 +48,7 @@ import { $i } from '@/account.js';
const customEmojiTags = getCustomEmojiTags();
let q = $ref('');
-let searchEmojis = $ref(null);
+let searchEmojis = $ref(null);
let selectedTags = $ref(new Set());
function search() {
diff --git a/packages/frontend/src/pages/auth.form.vue b/packages/frontend/src/pages/auth.form.vue
index 3f6f58df5..9d39a1e60 100644
--- a/packages/frontend/src/pages/auth.form.vue
+++ b/packages/frontend/src/pages/auth.form.vue
@@ -27,7 +27,7 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
const props = defineProps<{
- session: Misskey.entities.AuthSession;
+ session: Misskey.entities.AuthSessionShowResponse;
}>();
const emit = defineEmits<{
diff --git a/packages/frontend/src/pages/auth.vue b/packages/frontend/src/pages/auth.vue
index 124323a48..bcd54a6ed 100644
--- a/packages/frontend/src/pages/auth.vue
+++ b/packages/frontend/src/pages/auth.vue
@@ -56,7 +56,7 @@ const props = defineProps<{
}>();
let state = $ref<'waiting' | 'accepted' | 'fetch-session-error' | 'denied' | null>(null);
-let session = $ref(null);
+let session = $ref(null);
function accepted() {
state = 'accepted';
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 1ed25c9a4..8706228fd 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -144,8 +144,8 @@ const props = defineProps<{
let tab = $ref('overview');
let chartSrc = $ref('instance-requests');
-let meta = $ref(null);
-let instance = $ref(null);
+let meta = $ref(null);
+let instance = $ref(null);
let suspended = $ref(false);
let isBlocked = $ref(false);
let isSilenced = $ref(false);
@@ -169,10 +169,10 @@ async function fetch(): Promise {
instance = await os.api('federation/show-instance', {
host: props.host,
});
- suspended = instance.isSuspended;
- isBlocked = instance.isBlocked;
- isSilenced = instance.isSilenced;
- faviconUrl = getProxiedImageUrlNullable(instance.faviconUrl, 'preview') ?? getProxiedImageUrlNullable(instance.iconUrl, 'preview');
+ suspended = instance?.isSuspended ?? false;
+ isBlocked = instance?.isBlocked ?? false;
+ isSilenced = instance?.isSilenced ?? false;
+ faviconUrl = getProxiedImageUrlNullable(instance?.faviconUrl, 'preview') ?? getProxiedImageUrlNullable(instance?.iconUrl, 'preview');
}
async function toggleBlock(): Promise {
@@ -188,8 +188,9 @@ async function toggleSilenced(): Promise {
if (!meta) throw new Error('No meta?');
if (!instance) throw new Error('No instance?');
const { host } = instance;
+ const silencedHosts = meta.silencedHosts ?? [];
await os.api('admin/update-meta', {
- silencedHosts: isSilenced ? meta.silencedHosts.concat([host]) : meta.silencedHosts.filter(x => x !== host),
+ silencedHosts: isSilenced ? silencedHosts.concat([host]) : silencedHosts.filter(x => x !== host),
});
}
diff --git a/packages/frontend/src/pages/invite.vue b/packages/frontend/src/pages/invite.vue
index b44b580e8..25ce38e0e 100644
--- a/packages/frontend/src/pages/invite.vue
+++ b/packages/frontend/src/pages/invite.vue
@@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
diff --git a/packages/frontend/src/pages/welcome.entrance.a.vue b/packages/frontend/src/pages/welcome.entrance.a.vue
index e1f2a0cbd..89d0eb9a8 100644
--- a/packages/frontend/src/pages/welcome.entrance.a.vue
+++ b/packages/frontend/src/pages/welcome.entrance.a.vue
@@ -48,11 +48,15 @@ import MkNumber from '@/components/MkNumber.vue';
import MkVisitorDashboard from '@/components/MkVisitorDashboard.vue';
import { getProxiedImageUrl } from '@/scripts/media-proxy.js';
-let meta = $ref();
-let instances = $ref();
+let meta = $ref();
+let instances = $ref();
-function getInstanceIcon(instance): string {
- return getProxiedImageUrl(instance.iconUrl, 'preview');
+function getInstanceIcon(instance: Misskey.entities.FederationInstance): string {
+ if (!instance.iconUrl) {
+ return '';
+ }
+
+ return getProxiedImageUrl(instance.iconUrl, 'preview');
}
os.api('meta', { detail: true }).then(_meta => {
diff --git a/packages/frontend/src/scripts/api.ts b/packages/frontend/src/scripts/api.ts
index 080977e5e..0f54f779a 100644
--- a/packages/frontend/src/scripts/api.ts
+++ b/packages/frontend/src/scripts/api.ts
@@ -10,7 +10,12 @@ import { $i } from '@/account.js';
export const pendingApiRequestsCount = ref(0);
// Implements Misskey.api.ApiClient.request
-export function api(endpoint: E, data: P = {} as any, token?: string | null | undefined, signal?: AbortSignal): Promise {
+export function api(
+ endpoint: E,
+ data: P = {} as any,
+ token?: string | null | undefined,
+ signal?: AbortSignal,
+): Promise> {
if (endpoint.includes('://')) throw new Error('invalid endpoint');
pendingApiRequestsCount.value++;
@@ -51,7 +56,12 @@ export function api(hostUrl: string, endpoint: E, data: P = {} as any, token?: string | null | undefined, signal?: AbortSignal): Promise {
+export function apiExternal(
+ hostUrl: string,
+ endpoint: E, data: P = {} as any,
+ token?: string | null | undefined,
+ signal?: AbortSignal,
+): Promise> {
if (!/^https?:\/\//.test(hostUrl)) throw new Error('invalid host name');
if (endpoint.includes('://')) throw new Error('invalid endpoint');
pendingApiRequestsCount.value++;
@@ -95,7 +105,10 @@ export function apiExternal(endpoint: E, data: P = {} as any): Promise {
+export function apiGet(
+ endpoint: E,
+ data: P = {} as any,
+): Promise> {
pendingApiRequestsCount.value++;
const onFinally = () => {
diff --git a/packages/frontend/src/ui/_common_/statusbar-federation.vue b/packages/frontend/src/ui/_common_/statusbar-federation.vue
index ff980e0d8..a4ea916d2 100644
--- a/packages/frontend/src/ui/_common_/statusbar-federation.vue
+++ b/packages/frontend/src/ui/_common_/statusbar-federation.vue
@@ -47,7 +47,7 @@ const props = defineProps<{
refreshIntervalSec?: number;
}>();
-const instances = ref([]);
+const instances = ref([]);
const fetching = ref(true);
let key = $ref(0);
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index dc93c4be3..4e6e2adc0 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -21,57 +21,326 @@ declare namespace acct {
}
export { acct }
-// Warning: (ae-forgotten-export) The symbol "TODO_2" needs to be exported by the entry point index.d.ts
+// Warning: (ae-forgotten-export) The symbol "operations" needs to be exported by the entry point index.d.ts
//
// @public (undocumented)
-type Ad = TODO_2;
+type AdminAbuseUserReportsRequest = operations['admin/abuse-user-reports']['requestBody']['content']['application/json'];
// @public (undocumented)
-type AdminInstanceMetadata = DetailedInstanceMetadata & {
- blockedHosts: string[];
- silencedHosts: string[];
- app192IconUrl: string | null;
- app512IconUrl: string | null;
- manifestJsonOverride: string;
-};
+type AdminAbuseUserReportsResponse = operations['admin/abuse-user-reports']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type Announcement = {
- id: ID;
- createdAt: DateString;
- updatedAt: DateString | null;
- text: string;
- title: string;
- imageUrl: string | null;
- display: 'normal' | 'banner' | 'dialog';
- icon: 'info' | 'warning' | 'error' | 'success';
- needConfirmationToRead: boolean;
- forYou: boolean;
- isRead?: boolean;
-};
+type AdminAccountsCreateRequest = operations['admin/accounts/create']['requestBody']['content']['application/json'];
// @public (undocumented)
-type Antenna = {
- id: ID;
- createdAt: DateString;
- name: string;
- keywords: string[][];
- excludeKeywords: string[][];
- src: 'home' | 'all' | 'users' | 'list' | 'group';
- userListId: ID | null;
- userGroupId: ID | null;
- users: string[];
- caseSensitive: boolean;
- localOnly: boolean;
- notify: boolean;
- withReplies: boolean;
- withFile: boolean;
- hasUnreadNote: boolean;
-};
+type AdminAccountsCreateResponse = operations['admin/accounts/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAccountsDeleteRequest = operations['admin/accounts/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAccountsFindByEmailRequest = operations['admin/accounts/find-by-email']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAdCreateRequest = operations['admin/ad/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAdDeleteRequest = operations['admin/ad/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAdListRequest = operations['admin/ad/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAdUpdateRequest = operations['admin/ad/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsCreateRequest = operations['admin/announcements/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsCreateResponse = operations['admin/announcements/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsDeleteRequest = operations['admin/announcements/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsListRequest = operations['admin/announcements/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsListResponse = operations['admin/announcements/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAnnouncementsUpdateRequest = operations['admin/announcements/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAvatarDecorationsCreateRequest = operations['admin/avatar-decorations/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAvatarDecorationsDeleteRequest = operations['admin/avatar-decorations/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAvatarDecorationsListRequest = operations['admin/avatar-decorations/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAvatarDecorationsListResponse = operations['admin/avatar-decorations/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminAvatarDecorationsUpdateRequest = operations['admin/avatar-decorations/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDeleteAccountRequest = operations['admin/delete-account']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDeleteAccountResponse = operations['admin/delete-account']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDeleteAllFilesOfAUserRequest = operations['admin/delete-all-files-of-a-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDriveFilesRequest = operations['admin/drive/files']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDriveFilesResponse = operations['admin/drive/files']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDriveShowFileRequest = operations['admin/drive/show-file']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminDriveShowFileResponse = operations['admin/drive/show-file']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiAddAliasesBulkRequest = operations['admin/emoji/add-aliases-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiAddRequest = operations['admin/emoji/add']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiCopyRequest = operations['admin/emoji/copy']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiCopyResponse = operations['admin/emoji/copy']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiDeleteBulkRequest = operations['admin/emoji/delete-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiDeleteRequest = operations['admin/emoji/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiListRemoteRequest = operations['admin/emoji/list-remote']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiListRemoteResponse = operations['admin/emoji/list-remote']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiListRequest = operations['admin/emoji/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiListResponse = operations['admin/emoji/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiRemoveAliasesBulkRequest = operations['admin/emoji/remove-aliases-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiSetAliasesBulkRequest = operations['admin/emoji/set-aliases-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiSetCategoryBulkRequest = operations['admin/emoji/set-category-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiSetLicenseBulkRequest = operations['admin/emoji/set-license-bulk']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminEmojiUpdateRequest = operations['admin/emoji/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminFederationDeleteAllFilesRequest = operations['admin/federation/delete-all-files']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminFederationRefreshRemoteInstanceMetadataRequest = operations['admin/federation/refresh-remote-instance-metadata']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminFederationRemoveAllFollowingRequest = operations['admin/federation/remove-all-following']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminFederationUpdateInstanceRequest = operations['admin/federation/update-instance']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminGetTableStatsResponse = operations['admin/get-table-stats']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminGetUserIpsRequest = operations['admin/get-user-ips']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminInviteCreateRequest = operations['admin/invite/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminInviteCreateResponse = operations['admin/invite/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminInviteListRequest = operations['admin/invite/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminInviteListResponse = operations['admin/invite/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminMetaResponse = operations['admin/meta']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminPromoCreateRequest = operations['admin/promo/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminQueueDeliverDelayedResponse = operations['admin/queue/deliver-delayed']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminQueueInboxDelayedResponse = operations['admin/queue/inbox-delayed']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminQueuePromoteRequest = operations['admin/queue/promote']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminQueueStatsResponse = operations['admin/queue/stats']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRelaysAddRequest = operations['admin/relays/add']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRelaysAddResponse = operations['admin/relays/add']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRelaysListResponse = operations['admin/relays/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRelaysRemoveRequest = operations['admin/relays/remove']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminResetPasswordRequest = operations['admin/reset-password']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminResetPasswordResponse = operations['admin/reset-password']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminResolveAbuseUserReportRequest = operations['admin/resolve-abuse-user-report']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesAssignRequest = operations['admin/roles/assign']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesCreateRequest = operations['admin/roles/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesDeleteRequest = operations['admin/roles/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesShowRequest = operations['admin/roles/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesUpdateDefaultPoliciesRequest = operations['admin/roles/update-default-policies']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesUpdateRequest = operations['admin/roles/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminRolesUsersRequest = operations['admin/roles/users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminSendEmailRequest = operations['admin/send-email']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminServerInfoResponse = operations['admin/server-info']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowModerationLogsRequest = operations['admin/show-moderation-logs']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowModerationLogsResponse = operations['admin/show-moderation-logs']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowUserRequest = operations['admin/show-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowUserResponse = operations['admin/show-user']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowUsersRequest = operations['admin/show-users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminShowUsersResponse = operations['admin/show-users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AdminSuspendUserRequest = operations['admin/suspend-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminUnsetUserAvatarRequest = operations['admin/unset-user-avatar']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminUnsetUserBannerRequest = operations['admin/unset-user-banner']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminUnsuspendUserRequest = operations['admin/unsuspend-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminUpdateMetaRequest = operations['admin/update-meta']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminUpdateUserNoteRequest = operations['admin/update-user-note']['requestBody']['content']['application/json'];
+
+// Warning: (ae-forgotten-export) The symbol "components" needs to be exported by the entry point index.d.ts
+//
+// @public (undocumented)
+type Announcement = components['schemas']['Announcement'];
+
+// @public (undocumented)
+type AnnouncementsRequest = operations['announcements']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AnnouncementsResponse = operations['announcements']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Antenna = components['schemas']['Antenna'];
+
+// @public (undocumented)
+type AntennasCreateRequest = operations['antennas/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasCreateResponse = operations['antennas/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasDeleteRequest = operations['antennas/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasListResponse = operations['antennas/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasNotesRequest = operations['antennas/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasNotesResponse = operations['antennas/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasShowRequest = operations['antennas/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasShowResponse = operations['antennas/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasUpdateRequest = operations['antennas/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AntennasUpdateResponse = operations['antennas/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ApGetRequest = operations['ap/get']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ApGetResponse = operations['ap/get']['responses']['200']['content']['application/json'];
declare namespace api {
export {
isAPIError,
+ SwitchCaseResponseType,
APIError,
FetchLike,
APIClient
@@ -92,16 +361,8 @@ class APIClient {
fetch: FetchLike;
// (undocumented)
origin: string;
- // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts
- // Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts
- //
// (undocumented)
- request(endpoint: E, params?: P, credential?: string | null | undefined): Promise extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res']>;
+ request(endpoint: E, params?: P, credential?: string | null): Promise>;
}
// @public (undocumented)
@@ -114,41 +375,67 @@ type APIError = {
};
// @public (undocumented)
-type App = TODO_2;
+type App = components['schemas']['App'];
// @public (undocumented)
-type AuthSession = {
- id: ID;
- app: App;
- token: string;
-};
+type AppCreateRequest = operations['app/create']['requestBody']['content']['application/json'];
// @public (undocumented)
-type Blocking = {
- id: ID;
- createdAt: DateString;
- blockeeId: User['id'];
- blockee: UserDetailed;
-};
+type AppCreateResponse = operations['app/create']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type Channel = {
- id: ID;
- lastNotedAt: Date | null;
- userId: User['id'] | null;
- user: User | null;
- name: string;
- description: string | null;
- bannerId: DriveFile['id'] | null;
- banner: DriveFile | null;
- pinnedNoteIds: string[];
- color: string;
- isArchived: boolean;
- notesCount: number;
- usersCount: number;
- isSensitive: boolean;
- allowRenoteToExternal: boolean;
-};
+type AppShowRequest = operations['app/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AppShowResponse = operations['app/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ApShowRequest = operations['ap/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ApShowResponse = operations['ap/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionGenerateRequest = operations['auth/session/generate']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionGenerateResponse = operations['auth/session/generate']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionShowRequest = operations['auth/session/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionShowResponse = operations['auth/session/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionUserkeyRequest = operations['auth/session/userkey']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AuthSessionUserkeyResponse = operations['auth/session/userkey']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Blocking = components['schemas']['Blocking'];
+
+// @public (undocumented)
+type BlockingCreateRequest = operations['blocking/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type BlockingCreateResponse = operations['blocking/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type BlockingDeleteRequest = operations['blocking/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type BlockingDeleteResponse = operations['blocking/delete']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type BlockingListRequest = operations['blocking/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type BlockingListResponse = operations['blocking/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Channel = components['schemas']['Channel'];
// Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts
//
@@ -197,9 +484,6 @@ export type Channels = {
readAllUnreadMentions: () => void;
unreadSpecifiedNote: (payload: Note['id']) => void;
readAllUnreadSpecifiedNotes: () => void;
- readAllMessagingMessages: () => void;
- messagingMessage: (payload: MessagingMessage) => void;
- unreadMessagingMessage: (payload: MessagingMessage) => void;
readAllAntennas: () => void;
unreadAntenna: (payload: Antenna) => void;
readAllAnnouncements: () => void;
@@ -245,23 +529,6 @@ export type Channels = {
};
receives: null;
};
- messaging: {
- params: {
- otherparty?: User['id'] | null;
- group?: UserGroup['id'] | null;
- };
- events: {
- message: (payload: MessagingMessage) => void;
- deleted: (payload: MessagingMessage['id']) => void;
- read: (payload: MessagingMessage['id'][]) => void;
- typers: (payload: User[]) => void;
- };
- receives: {
- read: {
- id: MessagingMessage['id'];
- };
- };
- };
serverStats: {
params: null;
events: {
@@ -289,1961 +556,333 @@ export type Channels = {
};
// @public (undocumented)
-type Clip = TODO_2;
+type ChannelsCreateRequest = operations['channels/create']['requestBody']['content']['application/json'];
// @public (undocumented)
-type CustomEmoji = {
- id: string;
- name: string;
- url: string;
- category: string;
- aliases: string[];
-};
+type ChannelsCreateResponse = operations['channels/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsFavoriteRequest = operations['channels/favorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsFeaturedResponse = operations['channels/featured']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsFollowedRequest = operations['channels/followed']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsFollowedResponse = operations['channels/followed']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsFollowRequest = operations['channels/follow']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsMyFavoritesResponse = operations['channels/my-favorites']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsOwnedRequest = operations['channels/owned']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsOwnedResponse = operations['channels/owned']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsSearchRequest = operations['channels/search']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsSearchResponse = operations['channels/search']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsShowRequest = operations['channels/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsShowResponse = operations['channels/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsTimelineRequest = operations['channels/timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsTimelineResponse = operations['channels/timeline']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsUnfavoriteRequest = operations['channels/unfavorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsUnfollowRequest = operations['channels/unfollow']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsUpdateRequest = operations['channels/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChannelsUpdateResponse = operations['channels/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsActiveUsersRequest = operations['charts/active-users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsActiveUsersResponse = operations['charts/active-users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsApRequestRequest = operations['charts/ap-request']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsApRequestResponse = operations['charts/ap-request']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsDriveRequest = operations['charts/drive']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsDriveResponse = operations['charts/drive']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsFederationRequest = operations['charts/federation']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsFederationResponse = operations['charts/federation']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsInstanceRequest = operations['charts/instance']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsInstanceResponse = operations['charts/instance']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsNotesRequest = operations['charts/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsNotesResponse = operations['charts/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserDriveRequest = operations['charts/user/drive']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserDriveResponse = operations['charts/user/drive']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserFollowingRequest = operations['charts/user/following']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserFollowingResponse = operations['charts/user/following']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserNotesRequest = operations['charts/user/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserNotesResponse = operations['charts/user/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserPvRequest = operations['charts/user/pv']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserPvResponse = operations['charts/user/pv']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserReactionsRequest = operations['charts/user/reactions']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUserReactionsResponse = operations['charts/user/reactions']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUsersRequest = operations['charts/users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ChartsUsersResponse = operations['charts/users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Clip = components['schemas']['Clip'];
+
+// @public (undocumented)
+type ClipsAddNoteRequest = operations['clips/add-note']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsCreateRequest = operations['clips/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsCreateResponse = operations['clips/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsDeleteRequest = operations['clips/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsFavoriteRequest = operations['clips/favorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsListResponse = operations['clips/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsMyFavoritesResponse = operations['clips/my-favorites']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsNotesRequest = operations['clips/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsNotesResponse = operations['clips/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsRemoveNoteRequest = operations['clips/remove-note']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsShowRequest = operations['clips/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsShowResponse = operations['clips/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsUnfavoriteRequest = operations['clips/unfavorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsUpdateRequest = operations['clips/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ClipsUpdateResponse = operations['clips/update']['responses']['200']['content']['application/json'];
// @public (undocumented)
type DateString = string;
// @public (undocumented)
-type DetailedInstanceMetadata = LiteInstanceMetadata & {
- pinnedPages: string[];
- pinnedClipId: string | null;
- cacheRemoteFiles: boolean;
- cacheRemoteSensitiveFiles: boolean;
- requireSetup: boolean;
- proxyAccountName: string | null;
- features: Record;
-};
+type DriveFile = components['schemas']['DriveFile'];
// @public (undocumented)
-type DriveFile = {
- id: ID;
- createdAt: DateString;
- isSensitive: boolean;
- name: string;
- thumbnailUrl: string;
- url: string;
- type: string;
- size: number;
- md5: string;
- blurhash: string;
- comment: string | null;
- properties: Record;
-};
+type DriveFilesAttachedNotesRequest = operations['drive/files/attached-notes']['requestBody']['content']['application/json'];
// @public (undocumented)
-type DriveFolder = TODO_2;
+type DriveFilesAttachedNotesResponse = operations['drive/files/attached-notes']['responses']['200']['content']['application/json'];
// @public (undocumented)
-export type Endpoints = {
- 'admin/abuse-user-reports': {
- req: TODO;
- res: TODO;
- };
- 'admin/delete-all-files-of-a-user': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'admin/unset-user-avatar': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'admin/unset-user-banner': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'admin/delete-logs': {
- req: NoParams;
- res: null;
- };
- 'admin/get-index-stats': {
- req: TODO;
- res: TODO;
- };
- 'admin/get-table-stats': {
- req: TODO;
- res: TODO;
- };
- 'admin/invite': {
- req: TODO;
- res: TODO;
- };
- 'admin/logs': {
- req: TODO;
- res: TODO;
- };
- 'admin/meta': {
- req: NoParams;
- res: AdminInstanceMetadata;
- };
- 'admin/reset-password': {
- req: TODO;
- res: TODO;
- };
- 'admin/resolve-abuse-user-report': {
- req: TODO;
- res: TODO;
- };
- 'admin/resync-chart': {
- req: TODO;
- res: TODO;
- };
- 'admin/send-email': {
- req: TODO;
- res: TODO;
- };
- 'admin/server-info': {
- req: TODO;
- res: TODO;
- };
- 'admin/show-moderation-logs': {
- req: TODO;
- res: TODO;
- };
- 'admin/show-user': {
- req: TODO;
- res: TODO;
- };
- 'admin/show-users': {
- req: TODO;
- res: TODO;
- };
- 'admin/silence-user': {
- req: TODO;
- res: TODO;
- };
- 'admin/suspend-user': {
- req: TODO;
- res: TODO;
- };
- 'admin/unsilence-user': {
- req: TODO;
- res: TODO;
- };
- 'admin/unsuspend-user': {
- req: TODO;
- res: TODO;
- };
- 'admin/update-meta': {
- req: TODO;
- res: TODO;
- };
- 'admin/vacuum': {
- req: TODO;
- res: TODO;
- };
- 'admin/accounts/create': {
- req: TODO;
- res: TODO;
- };
- 'admin/ad/create': {
- req: TODO;
- res: TODO;
- };
- 'admin/ad/delete': {
- req: {
- id: Ad['id'];
- };
- res: null;
- };
- 'admin/ad/list': {
- req: TODO;
- res: TODO;
- };
- 'admin/ad/update': {
- req: TODO;
- res: TODO;
- };
- 'admin/announcements/create': {
- req: TODO;
- res: TODO;
- };
- 'admin/announcements/delete': {
- req: {
- id: Announcement['id'];
- };
- res: null;
- };
- 'admin/announcements/list': {
- req: TODO;
- res: TODO;
- };
- 'admin/announcements/update': {
- req: TODO;
- res: TODO;
- };
- 'admin/drive/clean-remote-files': {
- req: TODO;
- res: TODO;
- };
- 'admin/drive/cleanup': {
- req: TODO;
- res: TODO;
- };
- 'admin/drive/files': {
- req: TODO;
- res: TODO;
- };
- 'admin/drive/show-file': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/add': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/copy': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/list-remote': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/list': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/remove': {
- req: TODO;
- res: TODO;
- };
- 'admin/emoji/update': {
- req: TODO;
- res: TODO;
- };
- 'admin/federation/delete-all-files': {
- req: {
- host: string;
- };
- res: null;
- };
- 'admin/federation/refresh-remote-instance-metadata': {
- req: TODO;
- res: TODO;
- };
- 'admin/federation/remove-all-following': {
- req: TODO;
- res: TODO;
- };
- 'admin/federation/update-instance': {
- req: TODO;
- res: TODO;
- };
- 'admin/invite/create': {
- req: TODO;
- res: TODO;
- };
- 'admin/invite/list': {
- req: TODO;
- res: TODO;
- };
- 'admin/moderators/add': {
- req: TODO;
- res: TODO;
- };
- 'admin/moderators/remove': {
- req: TODO;
- res: TODO;
- };
- 'admin/promo/create': {
- req: TODO;
- res: TODO;
- };
- 'admin/queue/clear': {
- req: TODO;
- res: TODO;
- };
- 'admin/queue/deliver-delayed': {
- req: TODO;
- res: TODO;
- };
- 'admin/queue/inbox-delayed': {
- req: TODO;
- res: TODO;
- };
- 'admin/queue/jobs': {
- req: TODO;
- res: TODO;
- };
- 'admin/queue/stats': {
- req: TODO;
- res: TODO;
- };
- 'admin/relays/add': {
- req: TODO;
- res: TODO;
- };
- 'admin/relays/list': {
- req: TODO;
- res: TODO;
- };
- 'admin/relays/remove': {
- req: TODO;
- res: TODO;
- };
- 'announcements': {
- req: {
- limit?: number;
- withUnreads?: boolean;
- sinceId?: Announcement['id'];
- untilId?: Announcement['id'];
- };
- res: Announcement[];
- };
- 'antennas/create': {
- req: TODO;
- res: Antenna;
- };
- 'antennas/delete': {
- req: {
- antennaId: Antenna['id'];
- };
- res: null;
- };
- 'antennas/list': {
- req: NoParams;
- res: Antenna[];
- };
- 'antennas/notes': {
- req: {
- antennaId: Antenna['id'];
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- };
- res: Note[];
- };
- 'antennas/show': {
- req: {
- antennaId: Antenna['id'];
- };
- res: Antenna;
- };
- 'antennas/update': {
- req: TODO;
- res: Antenna;
- };
- 'ap/get': {
- req: {
- uri: string;
- };
- res: Record;
- };
- 'ap/show': {
- req: {
- uri: string;
- };
- res: {
- type: 'Note';
- object: Note;
- } | {
- type: 'User';
- object: UserDetailed;
- };
- };
- 'app/create': {
- req: TODO;
- res: App;
- };
- 'app/show': {
- req: {
- appId: App['id'];
- };
- res: App;
- };
- 'auth/accept': {
- req: {
- token: string;
- };
- res: null;
- };
- 'auth/session/generate': {
- req: {
- appSecret: string;
- };
- res: {
- token: string;
- url: string;
- };
- };
- 'auth/session/show': {
- req: {
- token: string;
- };
- res: AuthSession;
- };
- 'auth/session/userkey': {
- req: {
- appSecret: string;
- token: string;
- };
- res: {
- accessToken: string;
- user: User;
- };
- };
- 'blocking/create': {
- req: {
- userId: User['id'];
- };
- res: UserDetailed;
- };
- 'blocking/delete': {
- req: {
- userId: User['id'];
- };
- res: UserDetailed;
- };
- 'blocking/list': {
- req: {
- limit?: number;
- sinceId?: Blocking['id'];
- untilId?: Blocking['id'];
- };
- res: Blocking[];
- };
- 'channels/create': {
- req: TODO;
- res: TODO;
- };
- 'channels/featured': {
- req: TODO;
- res: TODO;
- };
- 'channels/follow': {
- req: TODO;
- res: TODO;
- };
- 'channels/followed': {
- req: TODO;
- res: TODO;
- };
- 'channels/owned': {
- req: TODO;
- res: TODO;
- };
- 'channels/pin-note': {
- req: TODO;
- res: TODO;
- };
- 'channels/show': {
- req: TODO;
- res: TODO;
- };
- 'channels/timeline': {
- req: TODO;
- res: TODO;
- };
- 'channels/unfollow': {
- req: TODO;
- res: TODO;
- };
- 'channels/update': {
- req: TODO;
- res: TODO;
- };
- 'charts/active-users': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: {
- local: {
- users: number[];
- };
- remote: {
- users: number[];
- };
- };
- };
- 'charts/drive': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: {
- local: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- };
- remote: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- };
- };
- };
- 'charts/federation': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: {
- instance: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- };
- };
- 'charts/hashtag': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: TODO;
- };
- 'charts/instance': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- host: string;
- };
- res: {
- drive: {
- decFiles: number[];
- decUsage: number[];
- incFiles: number[];
- incUsage: number[];
- totalFiles: number[];
- totalUsage: number[];
- };
- followers: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- following: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- notes: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- requests: {
- failed: number[];
- received: number[];
- succeeded: number[];
- };
- users: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- };
- };
- 'charts/network': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: TODO;
- };
- 'charts/notes': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: {
- local: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- remote: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- };
- };
- 'charts/user/drive': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- userId: User['id'];
- };
- res: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- };
- };
- 'charts/user/following': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- userId: User['id'];
- };
- res: TODO;
- };
- 'charts/user/notes': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- userId: User['id'];
- };
- res: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- };
- 'charts/user/reactions': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- userId: User['id'];
- };
- res: TODO;
- };
- 'charts/users': {
- req: {
- span: 'day' | 'hour';
- limit?: number;
- offset?: number | null;
- };
- res: {
- local: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- remote: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- };
- };
- 'clips/add-note': {
- req: TODO;
- res: TODO;
- };
- 'clips/create': {
- req: TODO;
- res: TODO;
- };
- 'clips/delete': {
- req: {
- clipId: Clip['id'];
- };
- res: null;
- };
- 'clips/list': {
- req: TODO;
- res: TODO;
- };
- 'clips/notes': {
- req: TODO;
- res: TODO;
- };
- 'clips/show': {
- req: TODO;
- res: TODO;
- };
- 'clips/update': {
- req: TODO;
- res: TODO;
- };
- 'drive': {
- req: NoParams;
- res: {
- capacity: number;
- usage: number;
- };
- };
- 'drive/files': {
- req: {
- folderId?: DriveFolder['id'] | null;
- type?: DriveFile['type'] | null;
- limit?: number;
- sinceId?: DriveFile['id'];
- untilId?: DriveFile['id'];
- };
- res: DriveFile[];
- };
- 'drive/files/attached-notes': {
- req: TODO;
- res: TODO;
- };
- 'drive/files/check-existence': {
- req: TODO;
- res: TODO;
- };
- 'drive/files/create': {
- req: {
- folderId?: string;
- name?: string;
- comment?: string;
- isSentisive?: boolean;
- force?: boolean;
- };
- res: DriveFile;
- };
- 'drive/files/delete': {
- req: {
- fileId: DriveFile['id'];
- };
- res: null;
- };
- 'drive/files/find-by-hash': {
- req: TODO;
- res: TODO;
- };
- 'drive/files/find': {
- req: {
- name: string;
- folderId?: DriveFolder['id'] | null;
- };
- res: DriveFile[];
- };
- 'drive/files/show': {
- req: {
- fileId?: DriveFile['id'];
- url?: string;
- };
- res: DriveFile;
- };
- 'drive/files/update': {
- req: {
- fileId: DriveFile['id'];
- folderId?: DriveFolder['id'] | null;
- name?: string;
- isSensitive?: boolean;
- comment?: string | null;
- };
- res: DriveFile;
- };
- 'drive/files/upload-from-url': {
- req: {
- url: string;
- folderId?: DriveFolder['id'] | null;
- isSensitive?: boolean;
- comment?: string | null;
- marker?: string | null;
- force?: boolean;
- };
- res: null;
- };
- 'drive/folders': {
- req: {
- folderId?: DriveFolder['id'] | null;
- limit?: number;
- sinceId?: DriveFile['id'];
- untilId?: DriveFile['id'];
- };
- res: DriveFolder[];
- };
- 'drive/folders/create': {
- req: {
- name?: string;
- parentId?: DriveFolder['id'] | null;
- };
- res: DriveFolder;
- };
- 'drive/folders/delete': {
- req: {
- folderId: DriveFolder['id'];
- };
- res: null;
- };
- 'drive/folders/find': {
- req: {
- name: string;
- parentId?: DriveFolder['id'] | null;
- };
- res: DriveFolder[];
- };
- 'drive/folders/show': {
- req: {
- folderId: DriveFolder['id'];
- };
- res: DriveFolder;
- };
- 'drive/folders/update': {
- req: {
- folderId: DriveFolder['id'];
- name?: string;
- parentId?: DriveFolder['id'] | null;
- };
- res: DriveFolder;
- };
- 'drive/stream': {
- req: {
- type?: DriveFile['type'] | null;
- limit?: number;
- sinceId?: DriveFile['id'];
- untilId?: DriveFile['id'];
- };
- res: DriveFile[];
- };
- 'endpoint': {
- req: {
- endpoint: string;
- };
- res: {
- params: {
- name: string;
- type: string;
- }[];
- };
- };
- 'endpoints': {
- req: NoParams;
- res: string[];
- };
- 'federation/dns': {
- req: {
- host: string;
- };
- res: {
- a: string[];
- aaaa: string[];
- cname: string[];
- txt: string[];
- };
- };
- 'federation/followers': {
- req: {
- host: string;
- limit?: number;
- sinceId?: Following['id'];
- untilId?: Following['id'];
- };
- res: FollowingFolloweePopulated[];
- };
- 'federation/following': {
- req: {
- host: string;
- limit?: number;
- sinceId?: Following['id'];
- untilId?: Following['id'];
- };
- res: FollowingFolloweePopulated[];
- };
- 'federation/instances': {
- req: {
- host?: string | null;
- blocked?: boolean | null;
- notResponding?: boolean | null;
- suspended?: boolean | null;
- federating?: boolean | null;
- subscribing?: boolean | null;
- publishing?: boolean | null;
- limit?: number;
- offset?: number;
- sort?: '+pubSub' | '-pubSub' | '+notes' | '-notes' | '+users' | '-users' | '+following' | '-following' | '+followers' | '-followers' | '+caughtAt' | '-caughtAt' | '+lastCommunicatedAt' | '-lastCommunicatedAt' | '+driveUsage' | '-driveUsage' | '+driveFiles' | '-driveFiles';
- };
- res: Instance[];
- };
- 'federation/show-instance': {
- req: {
- host: string;
- };
- res: Instance;
- };
- 'federation/update-remote-user': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'federation/users': {
- req: {
- host: string;
- limit?: number;
- sinceId?: User['id'];
- untilId?: User['id'];
- };
- res: UserDetailed[];
- };
- 'following/create': {
- req: {
- userId: User['id'];
- withReplies?: boolean;
- };
- res: User;
- };
- 'following/delete': {
- req: {
- userId: User['id'];
- };
- res: User;
- };
- 'following/requests/accept': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'following/requests/cancel': {
- req: {
- userId: User['id'];
- };
- res: User;
- };
- 'following/requests/list': {
- req: NoParams;
- res: FollowRequest[];
- };
- 'following/requests/reject': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'gallery/featured': {
- req: null;
- res: GalleryPost[];
- };
- 'gallery/popular': {
- req: null;
- res: GalleryPost[];
- };
- 'gallery/posts': {
- req: {
- limit?: number;
- sinceId?: GalleryPost['id'];
- untilId?: GalleryPost['id'];
- };
- res: GalleryPost[];
- };
- 'gallery/posts/create': {
- req: {
- title: GalleryPost['title'];
- description?: GalleryPost['description'];
- fileIds: GalleryPost['fileIds'];
- isSensitive?: GalleryPost['isSensitive'];
- };
- res: GalleryPost;
- };
- 'gallery/posts/delete': {
- req: {
- postId: GalleryPost['id'];
- };
- res: null;
- };
- 'gallery/posts/like': {
- req: {
- postId: GalleryPost['id'];
- };
- res: null;
- };
- 'gallery/posts/show': {
- req: {
- postId: GalleryPost['id'];
- };
- res: GalleryPost;
- };
- 'gallery/posts/unlike': {
- req: {
- postId: GalleryPost['id'];
- };
- res: null;
- };
- 'gallery/posts/update': {
- req: {
- postId: GalleryPost['id'];
- title: GalleryPost['title'];
- description?: GalleryPost['description'];
- fileIds: GalleryPost['fileIds'];
- isSensitive?: GalleryPost['isSensitive'];
- };
- res: GalleryPost;
- };
- 'games/reversi/games': {
- req: TODO;
- res: TODO;
- };
- 'games/reversi/games/show': {
- req: TODO;
- res: TODO;
- };
- 'games/reversi/games/surrender': {
- req: TODO;
- res: TODO;
- };
- 'games/reversi/invitations': {
- req: TODO;
- res: TODO;
- };
- 'games/reversi/match': {
- req: TODO;
- res: TODO;
- };
- 'games/reversi/match/cancel': {
- req: TODO;
- res: TODO;
- };
- 'get-online-users-count': {
- req: NoParams;
- res: {
- count: number;
- };
- };
- 'hashtags/list': {
- req: TODO;
- res: TODO;
- };
- 'hashtags/search': {
- req: TODO;
- res: TODO;
- };
- 'hashtags/show': {
- req: TODO;
- res: TODO;
- };
- 'hashtags/trend': {
- req: TODO;
- res: TODO;
- };
- 'hashtags/users': {
- req: TODO;
- res: TODO;
- };
- 'i': {
- req: NoParams;
- res: User;
- };
- 'i/apps': {
- req: TODO;
- res: TODO;
- };
- 'i/authorized-apps': {
- req: TODO;
- res: TODO;
- };
- 'i/change-password': {
- req: TODO;
- res: TODO;
- };
- 'i/delete-account': {
- req: {
- password: string;
- };
- res: null;
- };
- 'i/export-blocking': {
- req: TODO;
- res: TODO;
- };
- 'i/export-following': {
- req: TODO;
- res: TODO;
- };
- 'i/export-mute': {
- req: TODO;
- res: TODO;
- };
- 'i/export-notes': {
- req: TODO;
- res: TODO;
- };
- 'i/export-user-lists': {
- req: TODO;
- res: TODO;
- };
- 'i/favorites': {
- req: {
- limit?: number;
- sinceId?: NoteFavorite['id'];
- untilId?: NoteFavorite['id'];
- };
- res: NoteFavorite[];
- };
- 'i/gallery/likes': {
- req: TODO;
- res: TODO;
- };
- 'i/gallery/posts': {
- req: TODO;
- res: TODO;
- };
- 'i/import-following': {
- req: TODO;
- res: TODO;
- };
- 'i/import-user-lists': {
- req: TODO;
- res: TODO;
- };
- 'i/move': {
- req: TODO;
- res: TODO;
- };
- 'i/notifications': {
- req: {
- limit?: number;
- sinceId?: Notification_2['id'];
- untilId?: Notification_2['id'];
- following?: boolean;
- markAsRead?: boolean;
- includeTypes?: Notification_2['type'][];
- excludeTypes?: Notification_2['type'][];
- };
- res: Notification_2[];
- };
- 'i/page-likes': {
- req: TODO;
- res: TODO;
- };
- 'i/pages': {
- req: TODO;
- res: TODO;
- };
- 'i/pin': {
- req: {
- noteId: Note['id'];
- };
- res: MeDetailed;
- };
- 'i/read-all-messaging-messages': {
- req: TODO;
- res: TODO;
- };
- 'i/read-all-unread-notes': {
- req: TODO;
- res: TODO;
- };
- 'i/read-announcement': {
- req: TODO;
- res: TODO;
- };
- 'i/regenerate-token': {
- req: {
- password: string;
- };
- res: null;
- };
- 'i/registry/get-all': {
- req: {
- scope?: string[];
- };
- res: Record;
- };
- 'i/registry/get-detail': {
- req: {
- key: string;
- scope?: string[];
- };
- res: {
- updatedAt: DateString;
- value: any;
- };
- };
- 'i/registry/get': {
- req: {
- key: string;
- scope?: string[];
- };
- res: any;
- };
- 'i/registry/keys-with-type': {
- req: {
- scope?: string[];
- };
- res: Record;
- };
- 'i/registry/keys': {
- req: {
- scope?: string[];
- };
- res: string[];
- };
- 'i/registry/remove': {
- req: {
- key: string;
- scope?: string[];
- };
- res: null;
- };
- 'i/registry/set': {
- req: {
- key: string;
- value: any;
- scope?: string[];
- };
- res: null;
- };
- 'i/revoke-token': {
- req: TODO;
- res: TODO;
- };
- 'i/signin-history': {
- req: {
- limit?: number;
- sinceId?: Signin['id'];
- untilId?: Signin['id'];
- };
- res: Signin[];
- };
- 'i/unpin': {
- req: {
- noteId: Note['id'];
- };
- res: MeDetailed;
- };
- 'i/update-email': {
- req: {
- password: string;
- email?: string | null;
- };
- res: MeDetailed;
- };
- 'i/update': {
- req: {
- name?: string | null;
- description?: string | null;
- lang?: string | null;
- location?: string | null;
- birthday?: string | null;
- avatarId?: DriveFile['id'] | null;
- bannerId?: DriveFile['id'] | null;
- fields?: {
- name: string;
- value: string;
- }[];
- isLocked?: boolean;
- isExplorable?: boolean;
- hideOnlineStatus?: boolean;
- carefulBot?: boolean;
- autoAcceptFollowed?: boolean;
- noCrawle?: boolean;
- isBot?: boolean;
- isCat?: boolean;
- injectFeaturedNote?: boolean;
- receiveAnnouncementEmail?: boolean;
- alwaysMarkNsfw?: boolean;
- mutedWords?: (string[] | string)[];
- hardMutedWords?: (string[] | string)[];
- notificationRecieveConfig?: any;
- emailNotificationTypes?: string[];
- alsoKnownAs?: string[];
- };
- res: MeDetailed;
- };
- 'i/user-group-invites': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/done': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/key-done': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/password-less': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/register-key': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/register': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/remove-key': {
- req: TODO;
- res: TODO;
- };
- 'i/2fa/unregister': {
- req: TODO;
- res: TODO;
- };
- 'invite/create': {
- req: NoParams;
- res: Invite;
- };
- 'invite/delete': {
- req: {
- inviteId: Invite['id'];
- };
- res: null;
- };
- 'invite/list': {
- req: {
- limit?: number;
- sinceId?: Invite['id'];
- untilId?: Invite['id'];
- };
- res: Invite[];
- };
- 'invite/limit': {
- req: NoParams;
- res: InviteLimit;
- };
- 'messaging/history': {
- req: {
- limit?: number;
- group?: boolean;
- };
- res: MessagingMessage[];
- };
- 'messaging/messages': {
- req: {
- userId?: User['id'];
- groupId?: UserGroup['id'];
- limit?: number;
- sinceId?: MessagingMessage['id'];
- untilId?: MessagingMessage['id'];
- markAsRead?: boolean;
- };
- res: MessagingMessage[];
- };
- 'messaging/messages/create': {
- req: {
- userId?: User['id'];
- groupId?: UserGroup['id'];
- text?: string;
- fileId?: DriveFile['id'];
- };
- res: MessagingMessage;
- };
- 'messaging/messages/delete': {
- req: {
- messageId: MessagingMessage['id'];
- };
- res: null;
- };
- 'messaging/messages/read': {
- req: {
- messageId: MessagingMessage['id'];
- };
- res: null;
- };
- 'meta': {
- req: {
- detail?: boolean;
- };
- res: {
- $switch: {
- $cases: [
- [
- {
- detail: true;
- },
- DetailedInstanceMetadata
- ],
- [
- {
- detail: false;
- },
- LiteInstanceMetadata
- ],
- [
- {
- detail: boolean;
- },
- LiteInstanceMetadata | DetailedInstanceMetadata
- ]
- ];
- $default: LiteInstanceMetadata;
- };
- };
- };
- 'miauth/gen-token': {
- req: TODO;
- res: TODO;
- };
- 'mute/create': {
- req: TODO;
- res: TODO;
- };
- 'mute/delete': {
- req: {
- userId: User['id'];
- };
- res: null;
- };
- 'mute/list': {
- req: TODO;
- res: TODO;
- };
- 'my/apps': {
- req: TODO;
- res: TODO;
- };
- 'notes': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- };
- res: Note[];
- };
- 'notes/children': {
- req: {
- noteId: Note['id'];
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- };
- res: Note[];
- };
- 'notes/clips': {
- req: TODO;
- res: TODO;
- };
- 'notes/conversation': {
- req: TODO;
- res: TODO;
- };
- 'notes/create': {
- req: {
- visibility?: 'public' | 'home' | 'followers' | 'specified';
- visibleUserIds?: User['id'][];
- text?: null | string;
- cw?: null | string;
- viaMobile?: boolean;
- localOnly?: boolean;
- fileIds?: DriveFile['id'][];
- replyId?: null | Note['id'];
- renoteId?: null | Note['id'];
- channelId?: null | Channel['id'];
- poll?: null | {
- choices: string[];
- multiple?: boolean;
- expiresAt?: null | number;
- expiredAfter?: null | number;
- };
- };
- res: {
- createdNote: Note;
- };
- };
- 'notes/delete': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notes/favorites/create': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notes/favorites/delete': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notes/featured': {
- req: TODO;
- res: Note[];
- };
- 'notes/global-timeline': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'notes/hybrid-timeline': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'notes/local-timeline': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'notes/mentions': {
- req: {
- following?: boolean;
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- };
- res: Note[];
- };
- 'notes/polls/recommendation': {
- req: TODO;
- res: TODO;
- };
- 'notes/polls/vote': {
- req: {
- noteId: Note['id'];
- choice: number;
- };
- res: null;
- };
- 'notes/reactions': {
- req: {
- noteId: Note['id'];
- type?: string | null;
- limit?: number;
- };
- res: NoteReaction[];
- };
- 'notes/reactions/create': {
- req: {
- noteId: Note['id'];
- reaction: string;
- };
- res: null;
- };
- 'notes/reactions/delete': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notes/renotes': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- noteId: Note['id'];
- };
- res: Note[];
- };
- 'notes/replies': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- noteId: Note['id'];
- };
- res: Note[];
- };
- 'notes/search-by-tag': {
- req: TODO;
- res: TODO;
- };
- 'notes/search': {
- req: TODO;
- res: TODO;
- };
- 'notes/show': {
- req: {
- noteId: Note['id'];
- };
- res: Note;
- };
- 'notes/state': {
- req: TODO;
- res: TODO;
- };
- 'notes/timeline': {
- req: {
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'notes/unrenote': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notes/user-list-timeline': {
- req: {
- listId: UserList['id'];
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'notes/watching/create': {
- req: TODO;
- res: TODO;
- };
- 'notes/watching/delete': {
- req: {
- noteId: Note['id'];
- };
- res: null;
- };
- 'notifications/create': {
- req: {
- body: string;
- header?: string | null;
- icon?: string | null;
- };
- res: null;
- };
- 'notifications/test-notification': {
- req: NoParams;
- res: null;
- };
- 'notifications/mark-all-as-read': {
- req: NoParams;
- res: null;
- };
- 'page-push': {
- req: {
- pageId: Page['id'];
- event: string;
- var?: any;
- };
- res: null;
- };
- 'pages/create': {
- req: TODO;
- res: Page;
- };
- 'pages/delete': {
- req: {
- pageId: Page['id'];
- };
- res: null;
- };
- 'pages/featured': {
- req: NoParams;
- res: Page[];
- };
- 'pages/like': {
- req: {
- pageId: Page['id'];
- };
- res: null;
- };
- 'pages/show': {
- req: {
- pageId?: Page['id'];
- name?: string;
- username?: string;
- };
- res: Page;
- };
- 'pages/unlike': {
- req: {
- pageId: Page['id'];
- };
- res: null;
- };
- 'pages/update': {
- req: TODO;
- res: null;
- };
- 'ping': {
- req: NoParams;
- res: {
- pong: number;
- };
- };
- 'pinned-users': {
- req: TODO;
- res: TODO;
- };
- 'promo/read': {
- req: TODO;
- res: TODO;
- };
- 'request-reset-password': {
- req: {
- username: string;
- email: string;
- };
- res: null;
- };
- 'reset-password': {
- req: {
- token: string;
- password: string;
- };
- res: null;
- };
- 'room/show': {
- req: TODO;
- res: TODO;
- };
- 'room/update': {
- req: TODO;
- res: TODO;
- };
- 'signup': {
- req: {
- username: string;
- password: string;
- host?: string;
- invitationCode?: string;
- emailAddress?: string;
- 'hcaptcha-response'?: string;
- 'g-recaptcha-response'?: string;
- 'turnstile-response'?: string;
- };
- res: MeSignup | null;
- };
- 'stats': {
- req: NoParams;
- res: Stats;
- };
- 'server-info': {
- req: NoParams;
- res: ServerInfo;
- };
- 'sw/register': {
- req: TODO;
- res: TODO;
- };
- 'username/available': {
- req: {
- username: string;
- };
- res: {
- available: boolean;
- };
- };
- 'users': {
- req: {
- limit?: number;
- offset?: number;
- sort?: UserSorting;
- origin?: OriginType;
- };
- res: User[];
- };
- 'users/clips': {
- req: TODO;
- res: TODO;
- };
- 'users/followers': {
- req: {
- userId?: User['id'];
- username?: User['username'];
- host?: User['host'] | null;
- limit?: number;
- sinceId?: Following['id'];
- untilId?: Following['id'];
- };
- res: FollowingFollowerPopulated[];
- };
- 'users/following': {
- req: {
- userId?: User['id'];
- username?: User['username'];
- host?: User['host'] | null;
- limit?: number;
- sinceId?: Following['id'];
- untilId?: Following['id'];
- };
- res: FollowingFolloweePopulated[];
- };
- 'users/gallery/posts': {
- req: TODO;
- res: TODO;
- };
- 'users/get-frequently-replied-users': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/create': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/delete': {
- req: {
- groupId: UserGroup['id'];
- };
- res: null;
- };
- 'users/groups/invitations/accept': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/invitations/reject': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/invite': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/joined': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/owned': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/pull': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/show': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/transfer': {
- req: TODO;
- res: TODO;
- };
- 'users/groups/update': {
- req: TODO;
- res: TODO;
- };
- 'users/lists/create': {
- req: {
- name: string;
- };
- res: UserList;
- };
- 'users/lists/delete': {
- req: {
- listId: UserList['id'];
- };
- res: null;
- };
- 'users/lists/list': {
- req: NoParams;
- res: UserList[];
- };
- 'users/lists/pull': {
- req: {
- listId: UserList['id'];
- userId: User['id'];
- };
- res: null;
- };
- 'users/lists/push': {
- req: {
- listId: UserList['id'];
- userId: User['id'];
- };
- res: null;
- };
- 'users/lists/show': {
- req: {
- listId: UserList['id'];
- };
- res: UserList;
- };
- 'users/lists/update': {
- req: {
- listId: UserList['id'];
- name: string;
- };
- res: UserList;
- };
- 'users/notes': {
- req: {
- userId: User['id'];
- limit?: number;
- sinceId?: Note['id'];
- untilId?: Note['id'];
- sinceDate?: number;
- untilDate?: number;
- };
- res: Note[];
- };
- 'users/pages': {
- req: TODO;
- res: TODO;
- };
- 'users/flashs': {
- req: TODO;
- res: TODO;
- };
- 'users/recommendation': {
- req: TODO;
- res: TODO;
- };
- 'users/relation': {
- req: TODO;
- res: TODO;
- };
- 'users/report-abuse': {
- req: TODO;
- res: TODO;
- };
- 'users/search-by-username-and-host': {
- req: TODO;
- res: TODO;
- };
- 'users/search': {
- req: TODO;
- res: TODO;
- };
+type DriveFilesCheckExistenceRequest = operations['drive/files/check-existence']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesCheckExistenceResponse = operations['drive/files/check-existence']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesCreateRequest = operations['drive/files/create']['requestBody']['content']['multipart/form-data'];
+
+// @public (undocumented)
+type DriveFilesCreateResponse = operations['drive/files/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesDeleteRequest = operations['drive/files/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesFindByHashRequest = operations['drive/files/find-by-hash']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesFindByHashResponse = operations['drive/files/find-by-hash']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesFindRequest = operations['drive/files/find']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesFindResponse = operations['drive/files/find']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesRequest = operations['drive/files']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesResponse = operations['drive/files']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesShowRequest = operations['drive/files/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesShowResponse = operations['drive/files/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesUpdateRequest = operations['drive/files/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesUpdateResponse = operations['drive/files/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFilesUploadFromUrlRequest = operations['drive/files/upload-from-url']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFolder = components['schemas']['DriveFolder'];
+
+// @public (undocumented)
+type DriveFoldersCreateRequest = operations['drive/folders/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersCreateResponse = operations['drive/folders/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersDeleteRequest = operations['drive/folders/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersFindRequest = operations['drive/folders/find']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersFindResponse = operations['drive/folders/find']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersRequest = operations['drive/folders']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersResponse = operations['drive/folders']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersShowRequest = operations['drive/folders/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersShowResponse = operations['drive/folders/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersUpdateRequest = operations['drive/folders/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveFoldersUpdateResponse = operations['drive/folders/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveResponse = operations['drive']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type DriveStreamRequest = operations['drive/stream']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type DriveStreamResponse = operations['drive/stream']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type EmailAddressAvailableRequest = operations['email-address/available']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type EmailAddressAvailableResponse = operations['email-address/available']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type EmojiDetailed = components['schemas']['EmojiDetailed'];
+
+// @public (undocumented)
+type EmojiRequest = operations['emoji']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type EmojiResponse = operations['emoji']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type EmojiSimple = components['schemas']['EmojiSimple'];
+
+// @public (undocumented)
+type EmojisResponse = operations['emojis']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type EmptyRequest = Record | undefined;
+
+// @public (undocumented)
+type EmptyResponse = Record | undefined;
+
+// @public (undocumented)
+type EndpointRequest = operations['endpoint']['requestBody']['content']['application/json'];
+
+// Warning: (ae-forgotten-export) The symbol "Overwrite" needs to be exported by the entry point index.d.ts
+// Warning: (ae-forgotten-export) The symbol "Endpoints_2" needs to be exported by the entry point index.d.ts
+//
+// @public (undocumented)
+export type Endpoints = Overwrite;
+
+// @public (undocumented)
+type EndpointsResponse = operations['endpoints']['responses']['200']['content']['application/json'];
declare namespace entities {
export {
ID,
DateString,
- User,
+ PageEvent,
+ ModerationLog,
+ EmptyRequest,
+ EmptyResponse,
+ AdminMetaResponse,
+ AdminAbuseUserReportsRequest,
+ AdminAbuseUserReportsResponse,
+ AdminAccountsCreateRequest,
+ AdminAccountsCreateResponse,
+ AdminAccountsDeleteRequest,
+ AdminAccountsFindByEmailRequest,
+ AdminAdCreateRequest,
+ AdminAdDeleteRequest,
+ AdminAdListRequest,
+ AdminAdUpdateRequest,
+ AdminAnnouncementsCreateRequest,
+ AdminAnnouncementsCreateResponse,
+ AdminAnnouncementsDeleteRequest,
+ AdminAnnouncementsListRequest,
+ AdminAnnouncementsListResponse,
+ AdminAnnouncementsUpdateRequest,
+ AdminAvatarDecorationsCreateRequest,
+ AdminAvatarDecorationsDeleteRequest,
+ AdminAvatarDecorationsListRequest,
+ AdminAvatarDecorationsListResponse,
+ AdminAvatarDecorationsUpdateRequest,
+ AdminDeleteAllFilesOfAUserRequest,
+ AdminUnsetUserAvatarRequest,
+ AdminUnsetUserBannerRequest,
+ AdminDriveFilesRequest,
+ AdminDriveFilesResponse,
+ AdminDriveShowFileRequest,
+ AdminDriveShowFileResponse,
+ AdminEmojiAddAliasesBulkRequest,
+ AdminEmojiAddRequest,
+ AdminEmojiCopyRequest,
+ AdminEmojiCopyResponse,
+ AdminEmojiDeleteBulkRequest,
+ AdminEmojiDeleteRequest,
+ AdminEmojiListRemoteRequest,
+ AdminEmojiListRemoteResponse,
+ AdminEmojiListRequest,
+ AdminEmojiListResponse,
+ AdminEmojiRemoveAliasesBulkRequest,
+ AdminEmojiSetAliasesBulkRequest,
+ AdminEmojiSetCategoryBulkRequest,
+ AdminEmojiSetLicenseBulkRequest,
+ AdminEmojiUpdateRequest,
+ AdminFederationDeleteAllFilesRequest,
+ AdminFederationRefreshRemoteInstanceMetadataRequest,
+ AdminFederationRemoveAllFollowingRequest,
+ AdminFederationUpdateInstanceRequest,
+ AdminGetTableStatsResponse,
+ AdminGetUserIpsRequest,
+ AdminInviteCreateRequest,
+ AdminInviteCreateResponse,
+ AdminInviteListRequest,
+ AdminInviteListResponse,
+ AdminPromoCreateRequest,
+ AdminQueueDeliverDelayedResponse,
+ AdminQueueInboxDelayedResponse,
+ AdminQueuePromoteRequest,
+ AdminQueueStatsResponse,
+ AdminRelaysAddRequest,
+ AdminRelaysAddResponse,
+ AdminRelaysListResponse,
+ AdminRelaysRemoveRequest,
+ AdminResetPasswordRequest,
+ AdminResetPasswordResponse,
+ AdminResolveAbuseUserReportRequest,
+ AdminSendEmailRequest,
+ AdminServerInfoResponse,
+ AdminShowModerationLogsRequest,
+ AdminShowModerationLogsResponse,
+ AdminShowUserRequest,
+ AdminShowUserResponse,
+ AdminShowUsersRequest,
+ AdminShowUsersResponse,
+ AdminSuspendUserRequest,
+ AdminUnsuspendUserRequest,
+ AdminUpdateMetaRequest,
+ AdminDeleteAccountRequest,
+ AdminDeleteAccountResponse,
+ AdminUpdateUserNoteRequest,
+ AdminRolesCreateRequest,
+ AdminRolesDeleteRequest,
+ AdminRolesShowRequest,
+ AdminRolesUpdateRequest,
+ AdminRolesAssignRequest,
+ AdminRolesUnassignRequest,
+ AdminRolesUpdateDefaultPoliciesRequest,
+ AdminRolesUsersRequest,
+ AnnouncementsRequest,
+ AnnouncementsResponse,
+ AntennasCreateRequest,
+ AntennasCreateResponse,
+ AntennasDeleteRequest,
+ AntennasListResponse,
+ AntennasNotesRequest,
+ AntennasNotesResponse,
+ AntennasShowRequest,
+ AntennasShowResponse,
+ AntennasUpdateRequest,
+ AntennasUpdateResponse,
+ ApGetRequest,
+ ApGetResponse,
+ ApShowRequest,
+ ApShowResponse,
+ AppCreateRequest,
+ AppCreateResponse,
+ AppShowRequest,
+ AppShowResponse,
+ AuthSessionGenerateRequest,
+ AuthSessionGenerateResponse,
+ AuthSessionShowRequest,
+ AuthSessionShowResponse,
+ AuthSessionUserkeyRequest,
+ AuthSessionUserkeyResponse,
+ BlockingCreateRequest,
+ BlockingCreateResponse,
+ BlockingDeleteRequest,
+ BlockingDeleteResponse,
+ BlockingListRequest,
+ BlockingListResponse,
+ ChannelsCreateRequest,
+ ChannelsCreateResponse,
+ ChannelsFeaturedResponse,
+ ChannelsFollowRequest,
+ ChannelsFollowedRequest,
+ ChannelsFollowedResponse,
+ ChannelsOwnedRequest,
+ ChannelsOwnedResponse,
+ ChannelsShowRequest,
+ ChannelsShowResponse,
+ ChannelsTimelineRequest,
+ ChannelsTimelineResponse,
+ ChannelsUnfollowRequest,
+ ChannelsUpdateRequest,
+ ChannelsUpdateResponse,
+ ChannelsFavoriteRequest,
+ ChannelsUnfavoriteRequest,
+ ChannelsMyFavoritesResponse,
+ ChannelsSearchRequest,
+ ChannelsSearchResponse,
+ ChartsActiveUsersRequest,
+ ChartsActiveUsersResponse,
+ ChartsApRequestRequest,
+ ChartsApRequestResponse,
+ ChartsDriveRequest,
+ ChartsDriveResponse,
+ ChartsFederationRequest,
+ ChartsFederationResponse,
+ ChartsInstanceRequest,
+ ChartsInstanceResponse,
+ ChartsNotesRequest,
+ ChartsNotesResponse,
+ ChartsUserDriveRequest,
+ ChartsUserDriveResponse,
+ ChartsUserFollowingRequest,
+ ChartsUserFollowingResponse,
+ ChartsUserNotesRequest,
+ ChartsUserNotesResponse,
+ ChartsUserPvRequest,
+ ChartsUserPvResponse,
+ ChartsUserReactionsRequest,
+ ChartsUserReactionsResponse,
+ ChartsUsersRequest,
+ ChartsUsersResponse,
+ ClipsAddNoteRequest,
+ ClipsRemoveNoteRequest,
+ ClipsCreateRequest,
+ ClipsCreateResponse,
+ ClipsDeleteRequest,
+ ClipsListResponse,
+ ClipsNotesRequest,
+ ClipsNotesResponse,
+ ClipsShowRequest,
+ ClipsShowResponse,
+ ClipsUpdateRequest,
+ ClipsUpdateResponse,
+ ClipsFavoriteRequest,
+ ClipsUnfavoriteRequest,
+ ClipsMyFavoritesResponse,
+ DriveResponse,
+ DriveFilesRequest,
+ DriveFilesResponse,
+ DriveFilesAttachedNotesRequest,
+ DriveFilesAttachedNotesResponse,
+ DriveFilesCheckExistenceRequest,
+ DriveFilesCheckExistenceResponse,
+ DriveFilesCreateRequest,
+ DriveFilesCreateResponse,
+ DriveFilesDeleteRequest,
+ DriveFilesFindByHashRequest,
+ DriveFilesFindByHashResponse,
+ DriveFilesFindRequest,
+ DriveFilesFindResponse,
+ DriveFilesShowRequest,
+ DriveFilesShowResponse,
+ DriveFilesUpdateRequest,
+ DriveFilesUpdateResponse,
+ DriveFilesUploadFromUrlRequest,
+ DriveFoldersRequest,
+ DriveFoldersResponse,
+ DriveFoldersCreateRequest,
+ DriveFoldersCreateResponse,
+ DriveFoldersDeleteRequest,
+ DriveFoldersFindRequest,
+ DriveFoldersFindResponse,
+ DriveFoldersShowRequest,
+ DriveFoldersShowResponse,
+ DriveFoldersUpdateRequest,
+ DriveFoldersUpdateResponse,
+ DriveStreamRequest,
+ DriveStreamResponse,
+ EmailAddressAvailableRequest,
+ EmailAddressAvailableResponse,
+ EndpointRequest,
+ EndpointsResponse,
+ FederationFollowersRequest,
+ FederationFollowersResponse,
+ FederationFollowingRequest,
+ FederationFollowingResponse,
+ FederationInstancesRequest,
+ FederationInstancesResponse,
+ FederationShowInstanceRequest,
+ FederationShowInstanceResponse,
+ FederationUpdateRemoteUserRequest,
+ FederationUsersRequest,
+ FederationUsersResponse,
+ FederationStatsRequest,
+ FollowingCreateRequest,
+ FollowingCreateResponse,
+ FollowingDeleteRequest,
+ FollowingDeleteResponse,
+ FollowingUpdateRequest,
+ FollowingUpdateResponse,
+ FollowingUpdateAllRequest,
+ FollowingInvalidateRequest,
+ FollowingInvalidateResponse,
+ FollowingRequestsAcceptRequest,
+ FollowingRequestsCancelRequest,
+ FollowingRequestsCancelResponse,
+ FollowingRequestsListRequest,
+ FollowingRequestsListResponse,
+ FollowingRequestsRejectRequest,
+ GalleryFeaturedRequest,
+ GalleryFeaturedResponse,
+ GalleryPopularResponse,
+ GalleryPostsRequest,
+ GalleryPostsResponse,
+ GalleryPostsCreateRequest,
+ GalleryPostsCreateResponse,
+ GalleryPostsDeleteRequest,
+ GalleryPostsLikeRequest,
+ GalleryPostsShowRequest,
+ GalleryPostsShowResponse,
+ GalleryPostsUnlikeRequest,
+ GalleryPostsUpdateRequest,
+ GalleryPostsUpdateResponse,
+ GetAvatarDecorationsResponse,
+ HashtagsListRequest,
+ HashtagsListResponse,
+ HashtagsSearchRequest,
+ HashtagsSearchResponse,
+ HashtagsShowRequest,
+ HashtagsShowResponse,
+ HashtagsTrendResponse,
+ HashtagsUsersRequest,
+ HashtagsUsersResponse,
+ IResponse,
+ IClaimAchievementRequest,
+ IFavoritesRequest,
+ IFavoritesResponse,
+ IGalleryLikesRequest,
+ IGalleryLikesResponse,
+ IGalleryPostsRequest,
+ IGalleryPostsResponse,
+ INotificationsRequest,
+ INotificationsResponse,
+ INotificationsGroupedRequest,
+ INotificationsGroupedResponse,
+ IPageLikesRequest,
+ IPageLikesResponse,
+ IPagesRequest,
+ IPagesResponse,
+ IPinRequest,
+ IPinResponse,
+ IReadAnnouncementRequest,
+ IRegistryGetAllRequest,
+ IRegistryGetDetailRequest,
+ IRegistryGetRequest,
+ IRegistryKeysWithTypeRequest,
+ IRegistryKeysRequest,
+ IRegistryRemoveRequest,
+ IRegistrySetRequest,
+ IUnpinRequest,
+ IUnpinResponse,
+ IUpdateRequest,
+ IUpdateResponse,
+ IWebhooksCreateRequest,
+ IWebhooksShowRequest,
+ IWebhooksUpdateRequest,
+ IWebhooksDeleteRequest,
+ InviteCreateResponse,
+ InviteDeleteRequest,
+ InviteListRequest,
+ InviteListResponse,
+ InviteLimitResponse,
+ MetaRequest,
+ MetaResponse,
+ EmojisResponse,
+ EmojiRequest,
+ EmojiResponse,
+ MuteCreateRequest,
+ MuteDeleteRequest,
+ MuteListRequest,
+ MuteListResponse,
+ RenoteMuteCreateRequest,
+ RenoteMuteDeleteRequest,
+ RenoteMuteListRequest,
+ RenoteMuteListResponse,
+ MyAppsRequest,
+ MyAppsResponse,
+ NotesRequest,
+ NotesResponse,
+ NotesChildrenRequest,
+ NotesChildrenResponse,
+ NotesClipsRequest,
+ NotesClipsResponse,
+ NotesConversationRequest,
+ NotesConversationResponse,
+ NotesCreateRequest,
+ NotesCreateResponse,
+ NotesDeleteRequest,
+ NotesFavoritesCreateRequest,
+ NotesFavoritesDeleteRequest,
+ NotesFeaturedRequest,
+ NotesFeaturedResponse,
+ NotesGlobalTimelineRequest,
+ NotesGlobalTimelineResponse,
+ NotesHybridTimelineRequest,
+ NotesHybridTimelineResponse,
+ NotesLocalTimelineRequest,
+ NotesLocalTimelineResponse,
+ NotesMentionsRequest,
+ NotesMentionsResponse,
+ NotesPollsRecommendationRequest,
+ NotesPollsRecommendationResponse,
+ NotesPollsVoteRequest,
+ NotesReactionsRequest,
+ NotesReactionsResponse,
+ NotesReactionsCreateRequest,
+ NotesReactionsDeleteRequest,
+ NotesRenotesRequest,
+ NotesRenotesResponse,
+ NotesRepliesRequest,
+ NotesRepliesResponse,
+ NotesSearchByTagRequest,
+ NotesSearchByTagResponse,
+ NotesSearchRequest,
+ NotesSearchResponse,
+ NotesShowRequest,
+ NotesShowResponse,
+ NotesStateRequest,
+ NotesStateResponse,
+ NotesThreadMutingCreateRequest,
+ NotesThreadMutingDeleteRequest,
+ NotesTimelineRequest,
+ NotesTimelineResponse,
+ NotesTranslateRequest,
+ NotesTranslateResponse,
+ NotesUnrenoteRequest,
+ NotesUserListTimelineRequest,
+ NotesUserListTimelineResponse,
+ NotificationsCreateRequest,
+ PagesCreateRequest,
+ PagesCreateResponse,
+ PagesDeleteRequest,
+ PagesFeaturedResponse,
+ PagesLikeRequest,
+ PagesShowRequest,
+ PagesShowResponse,
+ PagesUnlikeRequest,
+ PagesUpdateRequest,
+ FlashCreateRequest,
+ FlashDeleteRequest,
+ FlashFeaturedResponse,
+ FlashLikeRequest,
+ FlashShowRequest,
+ FlashShowResponse,
+ FlashUnlikeRequest,
+ FlashUpdateRequest,
+ FlashMyRequest,
+ FlashMyResponse,
+ FlashMyLikesRequest,
+ FlashMyLikesResponse,
+ PingResponse,
+ PinnedUsersResponse,
+ PromoReadRequest,
+ RolesShowRequest,
+ RolesUsersRequest,
+ RolesNotesRequest,
+ RolesNotesResponse,
+ RequestResetPasswordRequest,
+ ResetPasswordRequest,
+ StatsResponse,
+ SwShowRegistrationRequest,
+ SwShowRegistrationResponse,
+ SwUpdateRegistrationRequest,
+ SwUpdateRegistrationResponse,
+ SwRegisterRequest,
+ SwRegisterResponse,
+ SwUnregisterRequest,
+ TestRequest,
+ UsernameAvailableRequest,
+ UsernameAvailableResponse,
+ UsersRequest,
+ UsersResponse,
+ UsersClipsRequest,
+ UsersClipsResponse,
+ UsersFollowersRequest,
+ UsersFollowersResponse,
+ UsersFollowingRequest,
+ UsersFollowingResponse,
+ UsersGalleryPostsRequest,
+ UsersGalleryPostsResponse,
+ UsersGetFrequentlyRepliedUsersRequest,
+ UsersGetFrequentlyRepliedUsersResponse,
+ UsersFeaturedNotesRequest,
+ UsersFeaturedNotesResponse,
+ UsersListsCreateRequest,
+ UsersListsCreateResponse,
+ UsersListsDeleteRequest,
+ UsersListsListRequest,
+ UsersListsListResponse,
+ UsersListsPullRequest,
+ UsersListsPushRequest,
+ UsersListsShowRequest,
+ UsersListsShowResponse,
+ UsersListsFavoriteRequest,
+ UsersListsUnfavoriteRequest,
+ UsersListsUpdateRequest,
+ UsersListsUpdateResponse,
+ UsersListsCreateFromPublicRequest,
+ UsersListsCreateFromPublicResponse,
+ UsersListsUpdateMembershipRequest,
+ UsersListsGetMembershipsRequest,
+ UsersNotesRequest,
+ UsersNotesResponse,
+ UsersPagesRequest,
+ UsersPagesResponse,
+ UsersFlashsRequest,
+ UsersFlashsResponse,
+ UsersReactionsRequest,
+ UsersReactionsResponse,
+ UsersRecommendationRequest,
+ UsersRecommendationResponse,
+ UsersRelationRequest,
+ UsersRelationResponse,
+ UsersReportAbuseRequest,
+ UsersSearchByUsernameAndHostRequest,
+ UsersSearchByUsernameAndHostResponse,
+ UsersSearchRequest,
+ UsersSearchResponse,
+ UsersShowRequest,
+ UsersShowResponse,
+ UsersAchievementsRequest,
+ UsersUpdateMemoRequest,
+ FetchRssRequest,
+ FetchExternalResourcesRequest,
+ RetentionResponse,
+ Error_2 as Error,
UserLite,
- UserDetailed,
- UserGroup,
- UserList,
+ UserDetailedNotMeOnly,
+ MeDetailedOnly,
+ UserDetailedNotMe,
MeDetailed,
- MeDetailedWithSecret,
- MeSignup,
- DriveFile,
- DriveFolder,
- GalleryPost,
+ UserDetailed,
+ User,
+ UserList,
+ Announcement,
+ App,
Note,
NoteReaction,
- Notification_2 as Notification,
- MessagingMessage,
- CustomEmoji,
- LiteInstanceMetadata,
- DetailedInstanceMetadata,
- InstanceMetadata,
- AdminInstanceMetadata,
- ServerInfo,
- Stats,
- Page,
- PageEvent,
- Announcement,
- Antenna,
- App,
- AuthSession,
- Ad,
- Clip,
NoteFavorite,
- FollowRequest,
- Channel,
+ Notification_2 as Notification,
+ DriveFile,
+ DriveFolder,
Following,
- FollowingFolloweePopulated,
- FollowingFollowerPopulated,
+ Muting,
+ RenoteMuting,
Blocking,
- Instance,
- Signin,
- Invite,
- InviteLimit,
- UserSorting,
- OriginType,
- ModerationLog
+ Hashtag,
+ InviteCode,
+ Page,
+ Channel,
+ QueueCount,
+ Antenna,
+ Clip,
+ FederationInstance,
+ GalleryPost,
+ EmojiSimple,
+ EmojiDetailed,
+ Flash
}
}
export { entities }
+// @public (undocumented)
+type Error_2 = components['schemas']['Error'];
+
+// @public (undocumented)
+type FederationFollowersRequest = operations['federation/followers']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationFollowersResponse = operations['federation/followers']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FederationFollowingRequest = operations['federation/following']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationFollowingResponse = operations['federation/following']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FederationInstance = components['schemas']['FederationInstance'];
+
+// @public (undocumented)
+type FederationInstancesRequest = operations['federation/instances']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationInstancesResponse = operations['federation/instances']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FederationShowInstanceRequest = operations['federation/show-instance']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationShowInstanceResponse = operations['federation/show-instance']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FederationStatsRequest = operations['federation/stats']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationUpdateRemoteUserRequest = operations['federation/update-remote-user']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationUsersRequest = operations['federation/users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FederationUsersResponse = operations['federation/users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FetchExternalResourcesRequest = operations['fetch-external-resources']['requestBody']['content']['application/json'];
+
// @public (undocumented)
type FetchLike = (input: string, init?: {
method?: string;
@@ -2336,245 +1468,314 @@ type FetchLike = (input: string, init?: {
json(): Promise;
}>;
+// @public (undocumented)
+type FetchRssRequest = operations['fetch-rss']['requestBody']['content']['application/json'];
+
// @public (undocumented)
export const ffVisibility: readonly ["public", "followers", "private"];
// @public (undocumented)
-type Following = {
- id: ID;
- createdAt: DateString;
- followerId: User['id'];
- followeeId: User['id'];
-};
+type Flash = components['schemas']['Flash'];
// @public (undocumented)
-type FollowingFolloweePopulated = Following & {
- followee: UserDetailed;
-};
+type FlashCreateRequest = operations['flash/create']['requestBody']['content']['application/json'];
// @public (undocumented)
-type FollowingFollowerPopulated = Following & {
- follower: UserDetailed;
-};
+type FlashDeleteRequest = operations['flash/delete']['requestBody']['content']['application/json'];
// @public (undocumented)
-type FollowRequest = {
- id: ID;
- follower: User;
- followee: User;
-};
+type FlashFeaturedResponse = operations['flash/featured']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type GalleryPost = {
- id: ID;
- createdAt: DateString;
- updatedAt: DateString;
- userId: User['id'];
- user: User;
- title: string;
- description: string | null;
- fileIds: DriveFile['id'][];
- files: DriveFile[];
- isSensitive: boolean;
- likedCount: number;
- isLiked?: boolean;
-};
+type FlashLikeRequest = operations['flash/like']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FlashMyLikesRequest = operations['flash/my-likes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FlashMyLikesResponse = operations['flash/my-likes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FlashMyRequest = operations['flash/my']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FlashMyResponse = operations['flash/my']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FlashShowRequest = operations['flash/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FlashShowResponse = operations['flash/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FlashUnlikeRequest = operations['flash/unlike']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FlashUpdateRequest = operations['flash/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type Following = components['schemas']['Following'];
+
+// @public (undocumented)
+type FollowingCreateRequest = operations['following/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingCreateResponse = operations['following/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingDeleteRequest = operations['following/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingDeleteResponse = operations['following/delete']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingInvalidateRequest = operations['following/invalidate']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingInvalidateResponse = operations['following/invalidate']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsAcceptRequest = operations['following/requests/accept']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsCancelRequest = operations['following/requests/cancel']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsCancelResponse = operations['following/requests/cancel']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsListRequest = operations['following/requests/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsListResponse = operations['following/requests/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingRequestsRejectRequest = operations['following/requests/reject']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingUpdateAllRequest = operations['following/update-all']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingUpdateRequest = operations['following/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type FollowingUpdateResponse = operations['following/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryFeaturedRequest = operations['gallery/featured']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryFeaturedResponse = operations['gallery/featured']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPopularResponse = operations['gallery/popular']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPost = components['schemas']['GalleryPost'];
+
+// @public (undocumented)
+type GalleryPostsCreateRequest = operations['gallery/posts/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsCreateResponse = operations['gallery/posts/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsDeleteRequest = operations['gallery/posts/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsLikeRequest = operations['gallery/posts/like']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsRequest = operations['gallery/posts']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsResponse = operations['gallery/posts']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsShowRequest = operations['gallery/posts/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsShowResponse = operations['gallery/posts/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsUnlikeRequest = operations['gallery/posts/unlike']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsUpdateRequest = operations['gallery/posts/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type GalleryPostsUpdateResponse = operations['gallery/posts/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type GetAvatarDecorationsResponse = operations['get-avatar-decorations']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Hashtag = components['schemas']['Hashtag'];
+
+// @public (undocumented)
+type HashtagsListRequest = operations['hashtags/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsListResponse = operations['hashtags/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsSearchRequest = operations['hashtags/search']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsSearchResponse = operations['hashtags/search']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsShowRequest = operations['hashtags/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsShowResponse = operations['hashtags/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsTrendResponse = operations['hashtags/trend']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsUsersRequest = operations['hashtags/users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type HashtagsUsersResponse = operations['hashtags/users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IClaimAchievementRequest = operations['i/claim-achievement']['requestBody']['content']['application/json'];
// @public (undocumented)
type ID = string;
// @public (undocumented)
-type Instance = {
- id: ID;
- firstRetrievedAt: DateString;
- host: string;
- usersCount: number;
- notesCount: number;
- followingCount: number;
- followersCount: number;
- driveUsage: number;
- driveFiles: number;
- latestRequestSentAt: DateString | null;
- latestStatus: number | null;
- latestRequestReceivedAt: DateString | null;
- lastCommunicatedAt: DateString;
- isNotResponding: boolean;
- isSuspended: boolean;
- isSilenced: boolean;
- isBlocked: boolean;
- softwareName: string | null;
- softwareVersion: string | null;
- openRegistrations: boolean | null;
- name: string | null;
- description: string | null;
- maintainerName: string | null;
- maintainerEmail: string | null;
- iconUrl: string | null;
- faviconUrl: string | null;
- themeColor: string | null;
- infoUpdatedAt: DateString | null;
-};
+type IFavoritesRequest = operations['i/favorites']['requestBody']['content']['application/json'];
// @public (undocumented)
-type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata;
+type IFavoritesResponse = operations['i/favorites']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type Invite = {
- id: ID;
- code: string;
- expiresAt: DateString | null;
- createdAt: DateString;
- createdBy: UserLite | null;
- usedBy: UserLite | null;
- usedAt: DateString | null;
- used: boolean;
-};
+type IGalleryLikesRequest = operations['i/gallery/likes']['requestBody']['content']['application/json'];
// @public (undocumented)
-type InviteLimit = {
- remaining: number;
-};
+type IGalleryLikesResponse = operations['i/gallery/likes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IGalleryPostsRequest = operations['i/gallery/posts']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IGalleryPostsResponse = operations['i/gallery/posts']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type INotificationsGroupedRequest = operations['i/notifications-grouped']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type INotificationsGroupedResponse = operations['i/notifications-grouped']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type INotificationsRequest = operations['i/notifications']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type INotificationsResponse = operations['i/notifications']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type InviteCode = components['schemas']['InviteCode'];
+
+// @public (undocumented)
+type InviteCreateResponse = operations['invite/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type InviteDeleteRequest = operations['invite/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type InviteLimitResponse = operations['invite/limit']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type InviteListRequest = operations['invite/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type InviteListResponse = operations['invite/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IPageLikesRequest = operations['i/page-likes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IPageLikesResponse = operations['i/page-likes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IPagesRequest = operations['i/pages']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IPagesResponse = operations['i/pages']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IPinRequest = operations['i/pin']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IPinResponse = operations['i/pin']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type IReadAnnouncementRequest = operations['i/read-announcement']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryGetAllRequest = operations['i/registry/get-all']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryGetDetailRequest = operations['i/registry/get-detail']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryGetRequest = operations['i/registry/get']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryKeysRequest = operations['i/registry/keys']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryKeysWithTypeRequest = operations['i/registry/keys-with-type']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistryRemoveRequest = operations['i/registry/remove']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IRegistrySetRequest = operations['i/registry/set']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IResponse = operations['i']['responses']['200']['content']['application/json'];
// @public (undocumented)
function isAPIError(reason: any): reason is APIError;
// @public (undocumented)
-type LiteInstanceMetadata = {
- maintainerName: string | null;
- maintainerEmail: string | null;
- version: string;
- name: string | null;
- shortName: string | null;
- uri: string;
- description: string | null;
- langs: string[];
- tosUrl: string | null;
- repositoryUrl: string;
- feedbackUrl: string;
- impressumUrl: string | null;
- privacyPolicyUrl: string | null;
- disableRegistration: boolean;
- disableLocalTimeline: boolean;
- disableGlobalTimeline: boolean;
- driveCapacityPerLocalUserMb: number;
- driveCapacityPerRemoteUserMb: number;
- emailRequiredForSignup: boolean;
- enableHcaptcha: boolean;
- hcaptchaSiteKey: string | null;
- enableRecaptcha: boolean;
- recaptchaSiteKey: string | null;
- enableTurnstile: boolean;
- turnstileSiteKey: string | null;
- swPublickey: string | null;
- themeColor: string | null;
- mascotImageUrl: string | null;
- bannerUrl: string | null;
- serverErrorImageUrl: string | null;
- infoImageUrl: string | null;
- notFoundImageUrl: string | null;
- iconUrl: string | null;
- backgroundImageUrl: string | null;
- logoImageUrl: string | null;
- maxNoteTextLength: number;
- enableEmail: boolean;
- enableTwitterIntegration: boolean;
- enableGithubIntegration: boolean;
- enableDiscordIntegration: boolean;
- enableServiceWorker: boolean;
- emojis: CustomEmoji[];
- defaultDarkTheme: string | null;
- defaultLightTheme: string | null;
- ads: {
- id: ID;
- ratio: number;
- place: string;
- url: string;
- imageUrl: string;
- }[];
- notesPerOneAd: number;
- translatorAvailable: boolean;
- serverRules: string[];
-};
+type IUnpinRequest = operations['i/unpin']['requestBody']['content']['application/json'];
// @public (undocumented)
-type MeDetailed = UserDetailed & {
- avatarId: DriveFile['id'];
- bannerId: DriveFile['id'];
- autoAcceptFollowed: boolean;
- alwaysMarkNsfw: boolean;
- carefulBot: boolean;
- emailNotificationTypes: string[];
- hasPendingReceivedFollowRequest: boolean;
- hasUnreadAnnouncement: boolean;
- hasUnreadAntenna: boolean;
- hasUnreadMentions: boolean;
- hasUnreadMessagingMessage: boolean;
- hasUnreadNotification: boolean;
- hasUnreadSpecifiedNotes: boolean;
- unreadNotificationsCount: number;
- hideOnlineStatus: boolean;
- injectFeaturedNote: boolean;
- integrations: Record;
- isDeleted: boolean;
- isExplorable: boolean;
- mutedWords: (string[] | string)[];
- hardMutedWords: (string[] | string)[];
- notificationRecieveConfig: {
- [notificationType in typeof notificationTypes_2[number]]?: {
- type: 'all';
- } | {
- type: 'never';
- } | {
- type: 'following';
- } | {
- type: 'follower';
- } | {
- type: 'mutualFollow';
- } | {
- type: 'list';
- userListId: string;
- };
- };
- noCrawle: boolean;
- receiveAnnouncementEmail: boolean;
- usePasswordLessLogin: boolean;
- unreadAnnouncements: Announcement[];
- twoFactorBackupCodesStock: 'full' | 'partial' | 'none';
- [other: string]: any;
-};
+type IUnpinResponse = operations['i/unpin']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type MeDetailedWithSecret = MeDetailed & {
- email: string;
- emailVerified: boolean;
- securityKeysList: {
- id: string;
- name: string;
- lastUsed: string;
- }[];
-};
+type IUpdateRequest = operations['i/update']['requestBody']['content']['application/json'];
// @public (undocumented)
-type MeSignup = MeDetailedWithSecret & {
- token: string;
-};
+type IUpdateResponse = operations['i/update']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type MessagingMessage = {
- id: ID;
- createdAt: DateString;
- file: DriveFile | null;
- fileId: DriveFile['id'] | null;
- isRead: boolean;
- reads: User['id'][];
- text: string | null;
- user: User;
- userId: User['id'];
- recipient?: User | null;
- recipientId: User['id'] | null;
- group?: UserGroup | null;
- groupId: UserGroup['id'] | null;
-};
+type IWebhooksCreateRequest = operations['i/webhooks/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IWebhooksDeleteRequest = operations['i/webhooks/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IWebhooksShowRequest = operations['i/webhooks/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type IWebhooksUpdateRequest = operations['i/webhooks/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type MeDetailed = components['schemas']['MeDetailed'];
+
+// @public (undocumented)
+type MeDetailedOnly = components['schemas']['MeDetailedOnly'];
+
+// @public (undocumented)
+type MetaRequest = operations['meta']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type MetaResponse = operations['meta']['responses']['200']['content']['application/json'];
// @public (undocumented)
type ModerationLog = {
@@ -2698,168 +1899,206 @@ type ModerationLog = {
// @public (undocumented)
export const moderationLogTypes: readonly ["updateServerSettings", "suspend", "unsuspend", "updateUserNote", "addCustomEmoji", "updateCustomEmoji", "deleteCustomEmoji", "assignRole", "unassignRole", "createRole", "updateRole", "deleteRole", "clearQueue", "promoteQueue", "deleteDriveFile", "deleteNote", "createGlobalAnnouncement", "createUserAnnouncement", "updateGlobalAnnouncement", "updateUserAnnouncement", "deleteGlobalAnnouncement", "deleteUserAnnouncement", "resetPassword", "suspendRemoteInstance", "unsuspendRemoteInstance", "markSensitiveDriveFile", "unmarkSensitiveDriveFile", "resolveAbuseReport", "createInvitation", "createAd", "updateAd", "deleteAd", "createAvatarDecoration", "updateAvatarDecoration", "deleteAvatarDecoration", "unsetUserAvatar", "unsetUserBanner"];
+// @public (undocumented)
+type MuteCreateRequest = operations['mute/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type MuteDeleteRequest = operations['mute/delete']['requestBody']['content']['application/json'];
+
// @public (undocumented)
export const mutedNoteReasons: readonly ["word", "manual", "spam", "other"];
// @public (undocumented)
-type Note = {
- id: ID;
- createdAt: DateString;
- text: string | null;
- cw: string | null;
- user: User;
- userId: User['id'];
- reply?: Note;
- replyId: Note['id'];
- renote?: Note;
- renoteId: Note['id'];
- files: DriveFile[];
- fileIds: DriveFile['id'][];
- visibility: 'public' | 'home' | 'followers' | 'specified';
- visibleUserIds?: User['id'][];
- channel?: Channel;
- channelId?: Channel['id'];
- localOnly?: boolean;
- myReaction?: string;
- reactions: Record;
- renoteCount: number;
- repliesCount: number;
- clippedCount?: number;
- poll?: {
- expiresAt: DateString | null;
- multiple: boolean;
- choices: {
- isVoted: boolean;
- text: string;
- votes: number;
- }[];
- };
- emojis: {
- name: string;
- url: string;
- }[];
- uri?: string;
- url?: string;
- isHidden?: boolean;
-};
+type MuteListRequest = operations['mute/list']['requestBody']['content']['application/json'];
// @public (undocumented)
-type NoteFavorite = {
- id: ID;
- createdAt: DateString;
- noteId: Note['id'];
- note: Note;
-};
+type MuteListResponse = operations['mute/list']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type NoteReaction = {
- id: ID;
- createdAt: DateString;
- user: UserLite;
- type: string;
-};
+type Muting = components['schemas']['Muting'];
+
+// @public (undocumented)
+type MyAppsRequest = operations['my/apps']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type MyAppsResponse = operations['my/apps']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type Note = components['schemas']['Note'];
+
+// @public (undocumented)
+type NoteFavorite = components['schemas']['NoteFavorite'];
+
+// @public (undocumented)
+type NoteReaction = components['schemas']['NoteReaction'];
+
+// @public (undocumented)
+type NotesChildrenRequest = operations['notes/children']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesChildrenResponse = operations['notes/children']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesClipsRequest = operations['notes/clips']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesClipsResponse = operations['notes/clips']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesConversationRequest = operations['notes/conversation']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesConversationResponse = operations['notes/conversation']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesCreateRequest = operations['notes/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesCreateResponse = operations['notes/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesDeleteRequest = operations['notes/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesFavoritesCreateRequest = operations['notes/favorites/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesFavoritesDeleteRequest = operations['notes/favorites/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesFeaturedRequest = operations['notes/featured']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesFeaturedResponse = operations['notes/featured']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesGlobalTimelineRequest = operations['notes/global-timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesGlobalTimelineResponse = operations['notes/global-timeline']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesHybridTimelineRequest = operations['notes/hybrid-timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesHybridTimelineResponse = operations['notes/hybrid-timeline']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesLocalTimelineRequest = operations['notes/local-timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesLocalTimelineResponse = operations['notes/local-timeline']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesMentionsRequest = operations['notes/mentions']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesMentionsResponse = operations['notes/mentions']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesPollsRecommendationRequest = operations['notes/polls/recommendation']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesPollsRecommendationResponse = operations['notes/polls/recommendation']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesPollsVoteRequest = operations['notes/polls/vote']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesReactionsCreateRequest = operations['notes/reactions/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesReactionsDeleteRequest = operations['notes/reactions/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesReactionsRequest = operations['notes/reactions']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesReactionsResponse = operations['notes/reactions']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesRenotesRequest = operations['notes/renotes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesRenotesResponse = operations['notes/renotes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesRepliesRequest = operations['notes/replies']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesRepliesResponse = operations['notes/replies']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesRequest = operations['notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesResponse = operations['notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesSearchByTagRequest = operations['notes/search-by-tag']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesSearchByTagResponse = operations['notes/search-by-tag']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesSearchRequest = operations['notes/search']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesSearchResponse = operations['notes/search']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesShowRequest = operations['notes/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesShowResponse = operations['notes/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesStateRequest = operations['notes/state']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesStateResponse = operations['notes/state']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesThreadMutingCreateRequest = operations['notes/thread-muting/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesThreadMutingDeleteRequest = operations['notes/thread-muting/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesTimelineRequest = operations['notes/timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesTimelineResponse = operations['notes/timeline']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesTranslateRequest = operations['notes/translate']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesTranslateResponse = operations['notes/translate']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type NotesUnrenoteRequest = operations['notes/unrenote']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesUserListTimelineRequest = operations['notes/user-list-timeline']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type NotesUserListTimelineResponse = operations['notes/user-list-timeline']['responses']['200']['content']['application/json'];
// @public (undocumented)
export const noteVisibilities: readonly ["public", "home", "followers", "specified"];
// @public (undocumented)
-type Notification_2 = {
- id: ID;
- createdAt: DateString;
- isRead: boolean;
-} & ({
- type: 'reaction';
- reaction: string;
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'reply';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'renote';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'quote';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'mention';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'note';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'pollEnded';
- user: User;
- userId: User['id'];
- note: Note;
-} | {
- type: 'follow';
- user: User;
- userId: User['id'];
-} | {
- type: 'followRequestAccepted';
- user: User;
- userId: User['id'];
-} | {
- type: 'receiveFollowRequest';
- user: User;
- userId: User['id'];
-} | {
- type: 'groupInvited';
- invitation: UserGroup;
- user: User;
- userId: User['id'];
-} | {
- type: 'achievementEarned';
- achievement: string;
-} | {
- type: 'app';
- header?: string | null;
- body: string;
- icon?: string | null;
-} | {
- type: 'test';
-});
+type Notification_2 = components['schemas']['Notification'];
+
+// @public (undocumented)
+type NotificationsCreateRequest = operations['notifications/create']['requestBody']['content']['application/json'];
// @public (undocumented)
export const notificationTypes: readonly ["note", "follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app", "achievementEarned"];
// @public (undocumented)
-type OriginType = 'combined' | 'local' | 'remote';
-
-// @public (undocumented)
-type Page = {
- id: ID;
- createdAt: DateString;
- updatedAt: DateString;
- userId: User['id'];
- user: User;
- content: Record[];
- variables: Record[];
- title: string;
- name: string;
- summary: string | null;
- hideTitleWhenPinned: boolean;
- alignCenter: boolean;
- font: string;
- script: string;
- eyeCatchingImageId: DriveFile['id'] | null;
- eyeCatchingImage: DriveFile | null;
- attachedFiles: any;
- likedCount: number;
- isLiked?: boolean;
-};
+type Page = components['schemas']['Page'];
// @public (undocumented)
type PageEvent = {
@@ -2870,6 +2109,33 @@ type PageEvent = {
user: User;
};
+// @public (undocumented)
+type PagesCreateRequest = operations['pages/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type PagesCreateResponse = operations['pages/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type PagesDeleteRequest = operations['pages/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type PagesFeaturedResponse = operations['pages/featured']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type PagesLikeRequest = operations['pages/like']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type PagesShowRequest = operations['pages/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type PagesShowResponse = operations['pages/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type PagesUnlikeRequest = operations['pages/unlike']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type PagesUpdateRequest = operations['pages/update']['requestBody']['content']['application/json'];
+
// @public (undocumented)
function parse(acct: string): Acct;
@@ -2877,40 +2143,55 @@ function parse(acct: string): Acct;
export const permissions: string[];
// @public (undocumented)
-type ServerInfo = {
- machine: string;
- cpu: {
- model: string;
- cores: number;
- };
- mem: {
- total: number;
- };
- fs: {
- total: number;
- used: number;
- };
-};
+type PingResponse = operations['ping']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type Signin = {
- id: ID;
- createdAt: DateString;
- ip: string;
- headers: Record;
- success: boolean;
-};
+type PinnedUsersResponse = operations['pinned-users']['responses']['200']['content']['application/json'];
// @public (undocumented)
-type Stats = {
- notesCount: number;
- originalNotesCount: number;
- usersCount: number;
- originalUsersCount: number;
- instances: number;
- driveUsageLocal: number;
- driveUsageRemote: number;
-};
+type PromoReadRequest = operations['promo/read']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type QueueCount = components['schemas']['QueueCount'];
+
+// @public (undocumented)
+type RenoteMuteCreateRequest = operations['renote-mute/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RenoteMuteDeleteRequest = operations['renote-mute/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RenoteMuteListRequest = operations['renote-mute/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RenoteMuteListResponse = operations['renote-mute/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type RenoteMuting = components['schemas']['RenoteMuting'];
+
+// @public (undocumented)
+type RequestResetPasswordRequest = operations['request-reset-password']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type ResetPasswordRequest = operations['reset-password']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RetentionResponse = operations['retention']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RolesNotesResponse = operations['roles/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type RolesShowRequest = operations['roles/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type RolesUsersRequest = operations['roles/users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type StatsResponse = operations['stats']['responses']['200']['content']['application/json'];
// Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts
//
@@ -2951,114 +2232,224 @@ export class Stream extends EventEmitter {
useChannel(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnection;
}
+// Warning: (ae-forgotten-export) The symbol "SwitchCase" needs to be exported by the entry point index.d.ts
+// Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts
+// Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts
+//
+// @public (undocumented)
+type SwitchCaseResponseType = Endpoints[E]['res'] extends SwitchCase ? IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res'];
+
+// @public (undocumented)
+type SwRegisterRequest = operations['sw/register']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type SwRegisterResponse = operations['sw/register']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type SwShowRegistrationRequest = operations['sw/show-registration']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type SwShowRegistrationResponse = operations['sw/show-registration']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type SwUnregisterRequest = operations['sw/unregister']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type SwUpdateRegistrationRequest = operations['sw/update-registration']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type SwUpdateRegistrationResponse = operations['sw/update-registration']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type TestRequest = operations['test']['requestBody']['content']['application/json'];
+
// @public (undocumented)
function toString_2(acct: Acct): string;
// @public (undocumented)
-type User = UserLite | UserDetailed;
+type User = components['schemas']['User'];
// @public (undocumented)
-type UserDetailed = UserLite & {
- alsoKnownAs: string[];
- bannerBlurhash: string | null;
- bannerColor: string | null;
- bannerUrl: string | null;
- birthday: string | null;
- createdAt: DateString;
- description: string | null;
- ffVisibility: 'public' | 'followers' | 'private';
- fields: {
- name: string;
- value: string;
- }[];
- verifiedLinks: string[];
- followersCount: number;
- followingCount: number;
- hasPendingFollowRequestFromYou: boolean;
- hasPendingFollowRequestToYou: boolean;
- isAdmin: boolean;
- isBlocked: boolean;
- isBlocking: boolean;
- isBot: boolean;
- isCat: boolean;
- isFollowed: boolean;
- isFollowing: boolean;
- isLocked: boolean;
- isModerator: boolean;
- isMuted: boolean;
- isSilenced: boolean;
- isSuspended: boolean;
- lang: string | null;
- lastFetchedAt?: DateString;
- location: string | null;
- movedTo: string;
- notesCount: number;
- pinnedNoteIds: ID[];
- pinnedNotes: Note[];
- pinnedPage: Page | null;
- pinnedPageId: string | null;
- publicReactions: boolean;
- securityKeys: boolean;
- twoFactorEnabled: boolean;
- updatedAt: DateString | null;
- uri: string | null;
- url: string | null;
- notify: 'normal' | 'none';
-};
+type UserDetailed = components['schemas']['UserDetailed'];
// @public (undocumented)
-type UserGroup = TODO_2;
+type UserDetailedNotMe = components['schemas']['UserDetailedNotMe'];
// @public (undocumented)
-type UserList = {
- id: ID;
- createdAt: DateString;
- name: string;
- userIds: User['id'][];
-};
+type UserDetailedNotMeOnly = components['schemas']['UserDetailedNotMeOnly'];
// @public (undocumented)
-type UserLite = {
- id: ID;
- username: string;
- host: string | null;
- name: string | null;
- onlineStatus: 'online' | 'active' | 'offline' | 'unknown';
- avatarUrl: string;
- avatarBlurhash: string;
- avatarDecorations: {
- id: ID;
- url: string;
- angle?: number;
- flipH?: boolean;
- }[];
- emojis: {
- name: string;
- url: string;
- }[];
- instance?: {
- name: Instance['name'];
- softwareName: Instance['softwareName'];
- softwareVersion: Instance['softwareVersion'];
- iconUrl: Instance['iconUrl'];
- faviconUrl: Instance['faviconUrl'];
- themeColor: Instance['themeColor'];
- };
- isCat?: boolean;
- isBot?: boolean;
-};
+type UserList = components['schemas']['UserList'];
// @public (undocumented)
-type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+updatedAt' | '-updatedAt';
+type UserLite = components['schemas']['UserLite'];
+
+// @public (undocumented)
+type UsernameAvailableRequest = operations['username/available']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsernameAvailableResponse = operations['username/available']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersAchievementsRequest = operations['users/achievements']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersClipsRequest = operations['users/clips']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersClipsResponse = operations['users/clips']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFeaturedNotesRequest = operations['users/featured-notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFeaturedNotesResponse = operations['users/featured-notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFlashsRequest = operations['users/flashs']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFlashsResponse = operations['users/flashs']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFollowersRequest = operations['users/followers']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFollowersResponse = operations['users/followers']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFollowingRequest = operations['users/following']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersFollowingResponse = operations['users/following']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersGalleryPostsRequest = operations['users/gallery/posts']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersGalleryPostsResponse = operations['users/gallery/posts']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersGetFrequentlyRepliedUsersRequest = operations['users/get-frequently-replied-users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersGetFrequentlyRepliedUsersResponse = operations['users/get-frequently-replied-users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsCreateFromPublicRequest = operations['users/lists/create-from-public']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsCreateFromPublicResponse = operations['users/lists/create-from-public']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsCreateRequest = operations['users/lists/create']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsCreateResponse = operations['users/lists/create']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsDeleteRequest = operations['users/lists/delete']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsFavoriteRequest = operations['users/lists/favorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsGetMembershipsRequest = operations['users/lists/get-memberships']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsListRequest = operations['users/lists/list']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsListResponse = operations['users/lists/list']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsPullRequest = operations['users/lists/pull']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsPushRequest = operations['users/lists/push']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsShowRequest = operations['users/lists/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsShowResponse = operations['users/lists/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsUnfavoriteRequest = operations['users/lists/unfavorite']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsUpdateMembershipRequest = operations['users/lists/update-membership']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsUpdateRequest = operations['users/lists/update']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersListsUpdateResponse = operations['users/lists/update']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersNotesRequest = operations['users/notes']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersNotesResponse = operations['users/notes']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersPagesRequest = operations['users/pages']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersPagesResponse = operations['users/pages']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersReactionsRequest = operations['users/reactions']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersReactionsResponse = operations['users/reactions']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersRecommendationRequest = operations['users/recommendation']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersRecommendationResponse = operations['users/recommendation']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersRelationRequest = operations['users/relation']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersRelationResponse = operations['users/relation']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersReportAbuseRequest = operations['users/report-abuse']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersRequest = operations['users']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersResponse = operations['users']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersSearchByUsernameAndHostRequest = operations['users/search-by-username-and-host']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersSearchByUsernameAndHostResponse = operations['users/search-by-username-and-host']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersSearchRequest = operations['users/search']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersSearchResponse = operations['users/search']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersShowRequest = operations['users/show']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type UsersShowResponse = operations['users/show']['responses']['200']['content']['application/json'];
+
+// @public (undocumented)
+type UsersUpdateMemoRequest = operations['users/update-memo']['requestBody']['content']['application/json'];
// Warnings were encountered during analysis:
//
-// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:20:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:635:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts
-// src/entities.ts:117:2 - (ae-forgotten-export) The symbol "notificationTypes_2" needs to be exported by the entry point index.d.ts
-// src/entities.ts:628:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
-// src/streaming.types.ts:33:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts
+// src/entities.ts:24:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
+// src/streaming.types.ts:31:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts
// (No @packageDocumentation comment for this package)
diff --git a/packages/misskey-js/generator/.eslintrc.cjs b/packages/misskey-js/generator/.eslintrc.cjs
new file mode 100644
index 000000000..6a8b31da9
--- /dev/null
+++ b/packages/misskey-js/generator/.eslintrc.cjs
@@ -0,0 +1,9 @@
+module.exports = {
+ parserOptions: {
+ tsconfigRootDir: __dirname,
+ project: ['./tsconfig.json'],
+ },
+ extends: [
+ '../../shared/.eslintrc.js',
+ ],
+};
diff --git a/packages/misskey-js/generator/.gitignore b/packages/misskey-js/generator/.gitignore
new file mode 100644
index 000000000..1a11577de
--- /dev/null
+++ b/packages/misskey-js/generator/.gitignore
@@ -0,0 +1 @@
+api.json
diff --git a/packages/misskey-js/generator/README.md b/packages/misskey-js/generator/README.md
new file mode 100644
index 000000000..767ccfa18
--- /dev/null
+++ b/packages/misskey-js/generator/README.md
@@ -0,0 +1,19 @@
+## misskey-js向け型生成モジュール
+
+バックエンドが吐き出すOpenAPI準拠のapi.jsonからmisskey-jsで使用される型エイリアスを生成するためのモジュールです。
+このモジュールはmisskey-jsそのものにバンドルされることは想定しておらず、生成物をmisskey-jsのsrc配下にコピーして使用することを想定しています。
+
+## 使い方
+
+まず、Misskeyのバックエンドからapi.jsonを取得する必要があります。任意のMisskeyインスタンスの/api-docからダウンロードしても良いですし、
+backendモジュール配下で`pnpm generate-api-json`を実行しても良いでしょう。
+
+api.jsonを入手したら、このファイルがあるディレクトリに置いてください。
+
+その後、以下コマンドを実行します。
+
+```shell
+pnpm generate
+```
+
+上記を実行することで、`./built`ディレクトリ配下にtsファイルが生成されます。
diff --git a/packages/misskey-js/generator/package.json b/packages/misskey-js/generator/package.json
new file mode 100644
index 000000000..e12520f04
--- /dev/null
+++ b/packages/misskey-js/generator/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "misskey-js-type-generator",
+ "version": "0.0.0",
+ "description": "Misskey TypeGenerator",
+ "type": "module",
+ "scripts": {
+ "generate": "tsx src/generator.ts && eslint ./built/**/* --ext .ts --fix"
+ },
+ "devDependencies": {
+ "@apidevtools/swagger-parser": "10.1.0",
+ "@types/node": "20.9.1",
+ "@typescript-eslint/eslint-plugin": "6.11.0",
+ "@typescript-eslint/parser": "6.11.0",
+ "eslint": "8.53.0",
+ "typescript": "5.3.2",
+ "tsx": "4.4.0",
+ "ts-case-convert": "2.0.2",
+ "openapi-types": "12.1.3",
+ "openapi-typescript": "6.7.1"
+ },
+ "files": [
+ "built"
+ ]
+}
diff --git a/packages/misskey-js/generator/src/generator.ts b/packages/misskey-js/generator/src/generator.ts
new file mode 100644
index 000000000..7ed3ae120
--- /dev/null
+++ b/packages/misskey-js/generator/src/generator.ts
@@ -0,0 +1,284 @@
+import { mkdir, writeFile } from 'fs/promises';
+import { OpenAPIV3 } from 'openapi-types';
+import { toPascal } from 'ts-case-convert';
+import SwaggerParser from '@apidevtools/swagger-parser';
+import openapiTS from 'openapi-typescript';
+
+function generateVersionHeaderComment(openApiDocs: OpenAPIV3.Document): string {
+ const contents = {
+ version: openApiDocs.info.version,
+ generatedAt: new Date().toISOString(),
+ };
+
+ const lines: string[] = [];
+ lines.push('/*');
+ for (const [key, value] of Object.entries(contents)) {
+ lines.push(` * ${key}: ${value}`);
+ }
+ lines.push(' */');
+
+ return lines.join('\n');
+}
+
+async function generateBaseTypes(
+ openApiDocs: OpenAPIV3.Document,
+ openApiJsonPath: string,
+ typeFileName: string,
+) {
+ const disabledLints = [
+ '@typescript-eslint/naming-convention',
+ '@typescript-eslint/no-explicit-any',
+ ];
+
+ const lines: string[] = [];
+ for (const lint of disabledLints) {
+ lines.push(`/* eslint ${lint}: 0 */`);
+ }
+ lines.push('');
+
+ lines.push(generateVersionHeaderComment(openApiDocs));
+ lines.push('');
+
+ const generatedTypes = await openapiTS(openApiJsonPath, { exportType: true });
+ lines.push(generatedTypes);
+ lines.push('');
+
+ await writeFile(typeFileName, lines.join('\n'));
+}
+
+async function generateSchemaEntities(
+ openApiDocs: OpenAPIV3.Document,
+ typeFileName: string,
+ outputPath: string,
+) {
+ if (!openApiDocs.components?.schemas) {
+ return;
+ }
+
+ const schemas = openApiDocs.components.schemas;
+ const schemaNames = Object.keys(schemas);
+ const typeAliasLines: string[] = [];
+
+ typeAliasLines.push(generateVersionHeaderComment(openApiDocs));
+ typeAliasLines.push('');
+ typeAliasLines.push(`import { components } from '${toImportPath(typeFileName)}';`);
+ typeAliasLines.push(
+ ...schemaNames.map(it => `export type ${it} = components['schemas']['${it}'];`),
+ );
+ typeAliasLines.push('');
+
+ await writeFile(outputPath, typeAliasLines.join('\n'));
+}
+
+async function generateEndpoints(
+ openApiDocs: OpenAPIV3.Document,
+ typeFileName: string,
+ entitiesOutputPath: string,
+ endpointOutputPath: string,
+) {
+ const endpoints: Endpoint[] = [];
+
+ // misskey-jsはPOST固定で送っているので、こちらも決め打ちする。別メソッドに対応することがあればこちらも直す必要あり
+ const paths = openApiDocs.paths;
+ const postPathItems = Object.keys(paths)
+ .map(it => paths[it]?.post)
+ .filter(filterUndefined);
+
+ for (const operation of postPathItems) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const operationId = operation.operationId!;
+ const endpoint = new Endpoint(operationId);
+ endpoints.push(endpoint);
+
+ if (isRequestBodyObject(operation.requestBody)) {
+ const reqContent = operation.requestBody.content;
+ const supportMediaTypes = Object.keys(reqContent);
+ if (supportMediaTypes.length > 0) {
+ // いまのところ複数のメディアタイプをとるエンドポイントは無いので決め打ちする
+ endpoint.request = new OperationTypeAlias(
+ operationId,
+ supportMediaTypes[0],
+ OperationsAliasType.REQUEST,
+ );
+ }
+ }
+
+ if (isResponseObject(operation.responses['200']) && operation.responses['200'].content) {
+ const resContent = operation.responses['200'].content;
+ const supportMediaTypes = Object.keys(resContent);
+ if (supportMediaTypes.length > 0) {
+ // いまのところ複数のメディアタイプを返すエンドポイントは無いので決め打ちする
+ endpoint.response = new OperationTypeAlias(
+ operationId,
+ supportMediaTypes[0],
+ OperationsAliasType.RESPONSE,
+ );
+ }
+ }
+ }
+
+ const entitiesOutputLine: string[] = [];
+
+ entitiesOutputLine.push(generateVersionHeaderComment(openApiDocs));
+ entitiesOutputLine.push('');
+
+ entitiesOutputLine.push(`import { operations } from '${toImportPath(typeFileName)}';`);
+ entitiesOutputLine.push('');
+
+ entitiesOutputLine.push(new EmptyTypeAlias(OperationsAliasType.REQUEST).toLine());
+ entitiesOutputLine.push(new EmptyTypeAlias(OperationsAliasType.RESPONSE).toLine());
+ entitiesOutputLine.push('');
+
+ const entities = endpoints
+ .flatMap(it => [it.request, it.response].filter(i => i))
+ .filter(filterUndefined);
+ entitiesOutputLine.push(...entities.map(it => it.toLine()));
+ entitiesOutputLine.push('');
+
+ await writeFile(entitiesOutputPath, entitiesOutputLine.join('\n'));
+
+ const endpointOutputLine: string[] = [];
+
+ endpointOutputLine.push(generateVersionHeaderComment(openApiDocs));
+ endpointOutputLine.push('');
+
+ endpointOutputLine.push('import type {');
+ endpointOutputLine.push(
+ ...[emptyRequest, emptyResponse, ...entities].map(it => '\t' + it.generateName() + ','),
+ );
+ endpointOutputLine.push(`} from '${toImportPath(entitiesOutputPath)}';`);
+ endpointOutputLine.push('');
+
+ endpointOutputLine.push('export type Endpoints = {');
+ endpointOutputLine.push(
+ ...endpoints.map(it => '\t' + it.toLine()),
+ );
+ endpointOutputLine.push('}');
+ endpointOutputLine.push('');
+
+ await writeFile(endpointOutputPath, endpointOutputLine.join('\n'));
+}
+
+function isRequestBodyObject(value: unknown): value is OpenAPIV3.RequestBodyObject {
+ if (!value) {
+ return false;
+ }
+
+ const { content } = value as Record;
+ return content !== undefined;
+}
+
+function isResponseObject(value: unknown): value is OpenAPIV3.ResponseObject {
+ if (!value) {
+ return false;
+ }
+
+ const { description } = value as Record;
+ return description !== undefined;
+}
+
+function filterUndefined(item: T): item is Exclude {
+ return item !== undefined;
+}
+
+function toImportPath(fileName: string, fromPath = '/built/autogen', toPath = ''): string {
+ return fileName.replace(fromPath, toPath).replace('.ts', '.js');
+}
+
+enum OperationsAliasType {
+ REQUEST = 'Request',
+ RESPONSE = 'Response'
+}
+
+interface IOperationTypeAlias {
+ readonly type: OperationsAliasType
+
+ generateName(): string
+
+ toLine(): string
+}
+
+class OperationTypeAlias implements IOperationTypeAlias {
+ public readonly operationId: string;
+ public readonly mediaType: string;
+ public readonly type: OperationsAliasType;
+
+ constructor(
+ operationId: string,
+ mediaType: string,
+ type: OperationsAliasType,
+ ) {
+ this.operationId = operationId;
+ this.mediaType = mediaType;
+ this.type = type;
+ }
+
+ generateName(): string {
+ const nameBase = this.operationId.replace(/\//g, '-');
+ return toPascal(nameBase + this.type);
+ }
+
+ toLine(): string {
+ const name = this.generateName();
+ return (this.type === OperationsAliasType.REQUEST)
+ ? `export type ${name} = operations['${this.operationId}']['requestBody']['content']['${this.mediaType}'];`
+ : `export type ${name} = operations['${this.operationId}']['responses']['200']['content']['${this.mediaType}'];`;
+ }
+}
+
+class EmptyTypeAlias implements IOperationTypeAlias {
+ readonly type: OperationsAliasType;
+
+ constructor(type: OperationsAliasType) {
+ this.type = type;
+ }
+
+ generateName(): string {
+ return 'Empty' + this.type;
+ }
+
+ toLine(): string {
+ const name = this.generateName();
+ return `export type ${name} = Record | undefined;`;
+ }
+}
+
+const emptyRequest = new EmptyTypeAlias(OperationsAliasType.REQUEST);
+const emptyResponse = new EmptyTypeAlias(OperationsAliasType.RESPONSE);
+
+class Endpoint {
+ public readonly operationId: string;
+ public request?: IOperationTypeAlias;
+ public response?: IOperationTypeAlias;
+
+ constructor(operationId: string) {
+ this.operationId = operationId;
+ }
+
+ toLine(): string {
+ const reqName = this.request?.generateName() ?? emptyRequest.generateName();
+ const resName = this.response?.generateName() ?? emptyResponse.generateName();
+
+ return `'${this.operationId}': { req: ${reqName}; res: ${resName} };`;
+ }
+}
+
+async function main() {
+ const generatePath = './built/autogen';
+ await mkdir(generatePath, { recursive: true });
+
+ const openApiJsonPath = './api.json';
+ const openApiDocs = await SwaggerParser.validate(openApiJsonPath) as OpenAPIV3.Document;
+
+ const typeFileName = './built/autogen/types.ts';
+ await generateBaseTypes(openApiDocs, openApiJsonPath, typeFileName);
+
+ const modelFileName = `${generatePath}/models.ts`;
+ await generateSchemaEntities(openApiDocs, typeFileName, modelFileName);
+
+ const entitiesFileName = `${generatePath}/entities.ts`;
+ const endpointFileName = `${generatePath}/endpoint.ts`;
+ await generateEndpoints(openApiDocs, typeFileName, entitiesFileName, endpointFileName);
+}
+
+main();
diff --git a/packages/misskey-js/generator/tsconfig.json b/packages/misskey-js/generator/tsconfig.json
new file mode 100644
index 000000000..c814df612
--- /dev/null
+++ b/packages/misskey-js/generator/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "nodenext",
+ "strict": true,
+ "strictFunctionTypes": true,
+ "strictNullChecks": true,
+ "esModuleInterop": true,
+ "lib": [
+ "esnext",
+ ]
+ },
+ "include": [
+ "src/**/*.ts",
+ "built/**/*.ts"
+ ],
+ "exclude": []
+}
diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json
index 865d25146..1d2192313 100644
--- a/packages/misskey-js/package.json
+++ b/packages/misskey-js/package.json
@@ -13,7 +13,8 @@
"typecheck": "tsc --noEmit",
"lint": "pnpm typecheck && pnpm eslint",
"jest": "jest --coverage --detectOpenHandles",
- "test": "pnpm jest && pnpm tsd"
+ "test": "pnpm jest && pnpm tsd",
+ "update-autogen-code": "pnpm --filter misskey-js-type-generator generate && ncp generator/built/autogen src/autogen"
},
"repository": {
"type": "git",
@@ -32,7 +33,8 @@
"jest-websocket-mock": "2.5.0",
"mock-socket": "9.3.1",
"tsd": "0.29.0",
- "typescript": "5.3.2"
+ "typescript": "5.3.2",
+ "ncp": "2.0.0"
},
"files": [
"built"
diff --git a/packages/misskey-js/src/api.ts b/packages/misskey-js/src/api.ts
index 9415e692e..c2fa4f179 100644
--- a/packages/misskey-js/src/api.ts
+++ b/packages/misskey-js/src/api.ts
@@ -1,4 +1,9 @@
-import type { Endpoints } from './api.types.js';
+import { SwitchCaseResponseType } from './api.types';
+import type { Endpoints } from './api.types';
+
+export {
+ SwitchCaseResponseType,
+} from './api.types';
const MK_API_ERROR = Symbol();
@@ -15,25 +20,15 @@ export function isAPIError(reason: any): reason is APIError {
}
export type FetchLike = (input: string, init?: {
- method?: string;
- body?: string;
- credentials?: RequestCredentials;
- cache?: RequestCache;
- headers: {[key in string]: string}
- }) => Promise<{
- status: number;
- json(): Promise;
- }>;
-
-type IsNeverType = [T] extends [never] ? true : false;
-
-type StrictExtract = Cond extends Union ? Union : never;
-
-type IsCaseMatched =
- IsNeverType> extends false ? true : false;
-
-type GetCaseResult =
- StrictExtract[1];
+ method?: string;
+ body?: string;
+ credentials?: RequestCredentials;
+ cache?: RequestCache;
+ headers: { [key in string]: string }
+}) => Promise<{
+ status: number;
+ json(): Promise;
+}>;
export class APIClient {
public origin: string;
@@ -53,22 +48,11 @@ export class APIClient {
}
public request(
- endpoint: E, params: P = {} as P, credential?: string | null | undefined,
- ): Promise extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- IsCaseMatched extends true ? GetCaseResult :
- Endpoints[E]['res']['$switch']['$default']
- : Endpoints[E]['res']> {
- const promise = new Promise((resolve, reject) => {
+ endpoint: E,
+ params: P = {} as P,
+ credential?: string | null,
+ ): Promise> {
+ return new Promise((resolve, reject) => {
this.fetch(`${this.origin}/api/${endpoint}`, {
method: 'POST',
body: JSON.stringify({
@@ -83,10 +67,8 @@ export class APIClient {
}).then(async (res) => {
const body = res.status === 204 ? null : await res.json();
- if (res.status === 200) {
+ if (res.status === 200 || res.status === 204) {
resolve(body);
- } else if (res.status === 204) {
- resolve(null);
} else {
reject({
[MK_API_ERROR]: true,
@@ -95,7 +77,5 @@ export class APIClient {
}
}).catch(reject);
});
-
- return promise as any;
}
}
diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts
index ba333231e..d97646b7c 100644
--- a/packages/misskey-js/src/api.types.ts
+++ b/packages/misskey-js/src/api.types.ts
@@ -1,651 +1,60 @@
-import type {
- Ad, Announcement, Antenna, App, AuthSession, Blocking, Channel, Clip, DateString, DetailedInstanceMetadata, DriveFile, DriveFolder, Following, FollowingFolloweePopulated, FollowingFollowerPopulated, FollowRequest, GalleryPost, Instance,
- LiteInstanceMetadata,
- MeDetailed,
- Note, NoteFavorite, OriginType, Page, ServerInfo, Stats, User, UserDetailed, MeSignup, UserGroup, UserList, UserSorting, Notification, NoteReaction, Signin, MessagingMessage, Invite, InviteLimit, AdminInstanceMetadata,
-} from './entities.js';
+import { Endpoints as Gen } from './autogen/endpoint';
+import { UserDetailed } from './autogen/models';
+import { UsersShowRequest } from './autogen/entities';
-type TODO = Record | null;
+type Overwrite = Omit<
+ T,
+ keyof U
+> & U;
-type NoParams = Record;
-
-type ShowUserReq = { username: string; host?: string; } | { userId: User['id']; };
-
-export type Endpoints = {
- // admin
- 'admin/abuse-user-reports': { req: TODO; res: TODO; };
- 'admin/delete-all-files-of-a-user': { req: { userId: User['id']; }; res: null; };
- 'admin/unset-user-avatar': { req: { userId: User['id']; }; res: null; };
- 'admin/unset-user-banner': { req: { userId: User['id']; }; res: null; };
- 'admin/delete-logs': { req: NoParams; res: null; };
- 'admin/get-index-stats': { req: TODO; res: TODO; };
- 'admin/get-table-stats': { req: TODO; res: TODO; };
- 'admin/invite': { req: TODO; res: TODO; };
- 'admin/logs': { req: TODO; res: TODO; };
- 'admin/meta': { req: NoParams; res: AdminInstanceMetadata; };
- 'admin/reset-password': { req: TODO; res: TODO; };
- 'admin/resolve-abuse-user-report': { req: TODO; res: TODO; };
- 'admin/resync-chart': { req: TODO; res: TODO; };
- 'admin/send-email': { req: TODO; res: TODO; };
- 'admin/server-info': { req: TODO; res: TODO; };
- 'admin/show-moderation-logs': { req: TODO; res: TODO; };
- 'admin/show-user': { req: TODO; res: TODO; };
- 'admin/show-users': { req: TODO; res: TODO; };
- 'admin/silence-user': { req: TODO; res: TODO; };
- 'admin/suspend-user': { req: TODO; res: TODO; };
- 'admin/unsilence-user': { req: TODO; res: TODO; };
- 'admin/unsuspend-user': { req: TODO; res: TODO; };
- 'admin/update-meta': { req: TODO; res: TODO; };
- 'admin/vacuum': { req: TODO; res: TODO; };
- 'admin/accounts/create': { req: TODO; res: TODO; };
- 'admin/ad/create': { req: TODO; res: TODO; };
- 'admin/ad/delete': { req: { id: Ad['id']; }; res: null; };
- 'admin/ad/list': { req: TODO; res: TODO; };
- 'admin/ad/update': { req: TODO; res: TODO; };
- 'admin/announcements/create': { req: TODO; res: TODO; };
- 'admin/announcements/delete': { req: { id: Announcement['id'] }; res: null; };
- 'admin/announcements/list': { req: TODO; res: TODO; };
- 'admin/announcements/update': { req: TODO; res: TODO; };
- 'admin/drive/clean-remote-files': { req: TODO; res: TODO; };
- 'admin/drive/cleanup': { req: TODO; res: TODO; };
- 'admin/drive/files': { req: TODO; res: TODO; };
- 'admin/drive/show-file': { req: TODO; res: TODO; };
- 'admin/emoji/add': { req: TODO; res: TODO; };
- 'admin/emoji/copy': { req: TODO; res: TODO; };
- 'admin/emoji/list-remote': { req: TODO; res: TODO; };
- 'admin/emoji/list': { req: TODO; res: TODO; };
- 'admin/emoji/remove': { req: TODO; res: TODO; };
- 'admin/emoji/update': { req: TODO; res: TODO; };
- 'admin/federation/delete-all-files': { req: { host: string; }; res: null; };
- 'admin/federation/refresh-remote-instance-metadata': { req: TODO; res: TODO; };
- 'admin/federation/remove-all-following': { req: TODO; res: TODO; };
- 'admin/federation/update-instance': { req: TODO; res: TODO; };
- 'admin/invite/create': { req: TODO; res: TODO; };
- 'admin/invite/list': { req: TODO; res: TODO; };
- 'admin/moderators/add': { req: TODO; res: TODO; };
- 'admin/moderators/remove': { req: TODO; res: TODO; };
- 'admin/promo/create': { req: TODO; res: TODO; };
- 'admin/queue/clear': { req: TODO; res: TODO; };
- 'admin/queue/deliver-delayed': { req: TODO; res: TODO; };
- 'admin/queue/inbox-delayed': { req: TODO; res: TODO; };
- 'admin/queue/jobs': { req: TODO; res: TODO; };
- 'admin/queue/stats': { req: TODO; res: TODO; };
- 'admin/relays/add': { req: TODO; res: TODO; };
- 'admin/relays/list': { req: TODO; res: TODO; };
- 'admin/relays/remove': { req: TODO; res: TODO; };
-
- // announcements
- 'announcements': { req: { limit?: number; withUnreads?: boolean; sinceId?: Announcement['id']; untilId?: Announcement['id']; }; res: Announcement[]; };
-
- // antennas
- 'antennas/create': { req: TODO; res: Antenna; };
- 'antennas/delete': { req: { antennaId: Antenna['id']; }; res: null; };
- 'antennas/list': { req: NoParams; res: Antenna[]; };
- 'antennas/notes': { req: { antennaId: Antenna['id']; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; }; res: Note[]; };
- 'antennas/show': { req: { antennaId: Antenna['id']; }; res: Antenna; };
- 'antennas/update': { req: TODO; res: Antenna; };
-
- // ap
- 'ap/get': { req: { uri: string; }; res: Record; };
- 'ap/show': { req: { uri: string; }; res: {
- type: 'Note';
- object: Note;
- } | {
- type: 'User';
- object: UserDetailed;
- }; };
-
- // app
- 'app/create': { req: TODO; res: App; };
- 'app/show': { req: { appId: App['id']; }; res: App; };
-
- // auth
- 'auth/accept': { req: { token: string; }; res: null; };
- 'auth/session/generate': { req: { appSecret: string; }; res: { token: string; url: string; }; };
- 'auth/session/show': { req: { token: string; }; res: AuthSession; };
- 'auth/session/userkey': { req: { appSecret: string; token: string; }; res: { accessToken: string; user: User }; };
-
- // blocking
- 'blocking/create': { req: { userId: User['id'] }; res: UserDetailed; };
- 'blocking/delete': { req: { userId: User['id'] }; res: UserDetailed; };
- 'blocking/list': { req: { limit?: number; sinceId?: Blocking['id']; untilId?: Blocking['id']; }; res: Blocking[]; };
-
- // channels
- 'channels/create': { req: TODO; res: TODO; };
- 'channels/featured': { req: TODO; res: TODO; };
- 'channels/follow': { req: TODO; res: TODO; };
- 'channels/followed': { req: TODO; res: TODO; };
- 'channels/owned': { req: TODO; res: TODO; };
- 'channels/pin-note': { req: TODO; res: TODO; };
- 'channels/show': { req: TODO; res: TODO; };
- 'channels/timeline': { req: TODO; res: TODO; };
- 'channels/unfollow': { req: TODO; res: TODO; };
- 'channels/update': { req: TODO; res: TODO; };
-
- // charts
- 'charts/active-users': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: {
- local: {
- users: number[];
- };
- remote: {
- users: number[];
- };
- }; };
- 'charts/drive': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: {
- local: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- };
- remote: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- };
- }; };
- 'charts/federation': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: {
- instance: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- }; };
- 'charts/hashtag': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: TODO; };
- 'charts/instance': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; host: string; }; res: {
- drive: {
- decFiles: number[];
- decUsage: number[];
- incFiles: number[];
- incUsage: number[];
- totalFiles: number[];
- totalUsage: number[];
- };
- followers: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- following: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- notes: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- requests: {
- failed: number[];
- received: number[];
- succeeded: number[];
- };
- users: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- }; };
- 'charts/network': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: TODO; };
- 'charts/notes': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: {
- local: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- remote: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- };
- }; };
- 'charts/user/drive': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; userId: User['id']; }; res: {
- decCount: number[];
- decSize: number[];
- incCount: number[];
- incSize: number[];
- totalCount: number[];
- totalSize: number[];
- }; };
- 'charts/user/following': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; userId: User['id']; }; res: TODO; };
- 'charts/user/notes': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; userId: User['id']; }; res: {
- dec: number[];
- inc: number[];
- total: number[];
- diffs: {
- normal: number[];
- renote: number[];
- reply: number[];
- };
- }; };
- 'charts/user/reactions': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; userId: User['id']; }; res: TODO; };
- 'charts/users': { req: { span: 'day' | 'hour'; limit?: number; offset?: number | null; }; res: {
- local: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- remote: {
- dec: number[];
- inc: number[];
- total: number[];
- };
- }; };
-
- // clips
- 'clips/add-note': { req: TODO; res: TODO; };
- 'clips/create': { req: TODO; res: TODO; };
- 'clips/delete': { req: { clipId: Clip['id']; }; res: null; };
- 'clips/list': { req: TODO; res: TODO; };
- 'clips/notes': { req: TODO; res: TODO; };
- 'clips/show': { req: TODO; res: TODO; };
- 'clips/update': { req: TODO; res: TODO; };
-
- // drive
- 'drive': { req: NoParams; res: { capacity: number; usage: number; }; };
- 'drive/files': { req: { folderId?: DriveFolder['id'] | null; type?: DriveFile['type'] | null; limit?: number; sinceId?: DriveFile['id']; untilId?: DriveFile['id']; }; res: DriveFile[]; };
- 'drive/files/attached-notes': { req: TODO; res: TODO; };
- 'drive/files/check-existence': { req: TODO; res: TODO; };
- 'drive/files/create': {
- req: {
- folderId?: string,
- name?: string,
- comment?: string,
- isSentisive?: boolean,
- force?: boolean,
- };
- res: DriveFile;
- };
- 'drive/files/delete': { req: { fileId: DriveFile['id']; }; res: null; };
- 'drive/files/find-by-hash': { req: TODO; res: TODO; };
- 'drive/files/find': { req: { name: string; folderId?: DriveFolder['id'] | null; }; res: DriveFile[]; };
- 'drive/files/show': { req: { fileId?: DriveFile['id']; url?: string; }; res: DriveFile; };
- 'drive/files/update': { req: { fileId: DriveFile['id']; folderId?: DriveFolder['id'] | null; name?: string; isSensitive?: boolean; comment?: string | null; }; res: DriveFile; };
- 'drive/files/upload-from-url': { req: { url: string; folderId?: DriveFolder['id'] | null; isSensitive?: boolean; comment?: string | null; marker?: string | null; force?: boolean; }; res: null; };
- 'drive/folders': { req: { folderId?: DriveFolder['id'] | null; limit?: number; sinceId?: DriveFile['id']; untilId?: DriveFile['id']; }; res: DriveFolder[]; };
- 'drive/folders/create': { req: { name?: string; parentId?: DriveFolder['id'] | null; }; res: DriveFolder; };
- 'drive/folders/delete': { req: { folderId: DriveFolder['id']; }; res: null; };
- 'drive/folders/find': { req: { name: string; parentId?: DriveFolder['id'] | null; }; res: DriveFolder[]; };
- 'drive/folders/show': { req: { folderId: DriveFolder['id']; }; res: DriveFolder; };
- 'drive/folders/update': { req: { folderId: DriveFolder['id']; name?: string; parentId?: DriveFolder['id'] | null; }; res: DriveFolder; };
- 'drive/stream': { req: { type?: DriveFile['type'] | null; limit?: number; sinceId?: DriveFile['id']; untilId?: DriveFile['id']; }; res: DriveFile[]; };
-
- // endpoint
- 'endpoint': { req: { endpoint: string; }; res: { params: { name: string; type: string; }[]; }; };
-
- // endpoints
- 'endpoints': { req: NoParams; res: string[]; };
-
- // federation
- 'federation/dns': { req: { host: string; }; res: {
- a: string[];
- aaaa: string[];
- cname: string[];
- txt: string[];
- }; };
- 'federation/followers': { req: { host: string; limit?: number; sinceId?: Following['id']; untilId?: Following['id']; }; res: FollowingFolloweePopulated[]; };
- 'federation/following': { req: { host: string; limit?: number; sinceId?: Following['id']; untilId?: Following['id']; }; res: FollowingFolloweePopulated[]; };
- 'federation/instances': { req: {
- host?: string | null;
- blocked?: boolean | null;
- notResponding?: boolean | null;
- suspended?: boolean | null;
- federating?: boolean | null;
- subscribing?: boolean | null;
- publishing?: boolean | null;
- limit?: number;
- offset?: number;
- sort?: '+pubSub' | '-pubSub' | '+notes' | '-notes' | '+users' | '-users' | '+following' | '-following' | '+followers' | '-followers' | '+caughtAt' | '-caughtAt' | '+lastCommunicatedAt' | '-lastCommunicatedAt' | '+driveUsage' | '-driveUsage' | '+driveFiles' | '-driveFiles';
- }; res: Instance[]; };
- 'federation/show-instance': { req: { host: string; }; res: Instance; };
- 'federation/update-remote-user': { req: { userId: User['id']; }; res: null; };
- 'federation/users': { req: { host: string; limit?: number; sinceId?: User['id']; untilId?: User['id']; }; res: UserDetailed[]; };
-
- // following
- 'following/create': { req: {
- userId: User['id'],
- withReplies?: boolean,
- }; res: User; };
- 'following/delete': { req: { userId: User['id'] }; res: User; };
- 'following/requests/accept': { req: { userId: User['id'] }; res: null; };
- 'following/requests/cancel': { req: { userId: User['id'] }; res: User; };
- 'following/requests/list': { req: NoParams; res: FollowRequest[]; };
- 'following/requests/reject': { req: { userId: User['id'] }; res: null; };
-
- // gallery
- 'gallery/featured': { req: null; res: GalleryPost[]; };
- 'gallery/popular': { req: null; res: GalleryPost[]; };
- 'gallery/posts': { req: { limit?: number; sinceId?: GalleryPost['id']; untilId?: GalleryPost['id']; }; res: GalleryPost[]; };
- 'gallery/posts/create': { req: { title: GalleryPost['title']; description?: GalleryPost['description']; fileIds: GalleryPost['fileIds']; isSensitive?: GalleryPost['isSensitive'] }; res: GalleryPost; };
- 'gallery/posts/delete': { req: { postId: GalleryPost['id'] }; res: null; };
- 'gallery/posts/like': { req: { postId: GalleryPost['id'] }; res: null; };
- 'gallery/posts/show': { req: { postId: GalleryPost['id'] }; res: GalleryPost; };
- 'gallery/posts/unlike': { req: { postId: GalleryPost['id'] }; res: null; };
- 'gallery/posts/update': { req: { postId: GalleryPost['id']; title: GalleryPost['title']; description?: GalleryPost['description']; fileIds: GalleryPost['fileIds']; isSensitive?: GalleryPost['isSensitive'] }; res: GalleryPost; };
-
- // games
- 'games/reversi/games': { req: TODO; res: TODO; };
- 'games/reversi/games/show': { req: TODO; res: TODO; };
- 'games/reversi/games/surrender': { req: TODO; res: TODO; };
- 'games/reversi/invitations': { req: TODO; res: TODO; };
- 'games/reversi/match': { req: TODO; res: TODO; };
- 'games/reversi/match/cancel': { req: TODO; res: TODO; };
-
- // get-online-users-count
- 'get-online-users-count': { req: NoParams; res: { count: number; }; };
-
- // hashtags
- 'hashtags/list': { req: TODO; res: TODO; };
- 'hashtags/search': { req: TODO; res: TODO; };
- 'hashtags/show': { req: TODO; res: TODO; };
- 'hashtags/trend': { req: TODO; res: TODO; };
- 'hashtags/users': { req: TODO; res: TODO; };
-
- // i
- 'i': { req: NoParams; res: User; };
- 'i/apps': { req: TODO; res: TODO; };
- 'i/authorized-apps': { req: TODO; res: TODO; };
- 'i/change-password': { req: TODO; res: TODO; };
- 'i/delete-account': { req: { password: string; }; res: null; };
- 'i/export-blocking': { req: TODO; res: TODO; };
- 'i/export-following': { req: TODO; res: TODO; };
- 'i/export-mute': { req: TODO; res: TODO; };
- 'i/export-notes': { req: TODO; res: TODO; };
- 'i/export-user-lists': { req: TODO; res: TODO; };
- 'i/favorites': { req: { limit?: number; sinceId?: NoteFavorite['id']; untilId?: NoteFavorite['id']; }; res: NoteFavorite[]; };
- 'i/gallery/likes': { req: TODO; res: TODO; };
- 'i/gallery/posts': { req: TODO; res: TODO; };
- 'i/import-following': { req: TODO; res: TODO; };
- 'i/import-user-lists': { req: TODO; res: TODO; };
- 'i/move': { req: TODO; res: TODO; };
- 'i/notifications': { req: {
- limit?: number;
- sinceId?: Notification['id'];
- untilId?: Notification['id'];
- following?: boolean;
- markAsRead?: boolean;
- includeTypes?: Notification['type'][];
- excludeTypes?: Notification['type'][];
- }; res: Notification[]; };
- 'i/page-likes': { req: TODO; res: TODO; };
- 'i/pages': { req: TODO; res: TODO; };
- 'i/pin': { req: { noteId: Note['id']; }; res: MeDetailed; };
- 'i/read-all-messaging-messages': { req: TODO; res: TODO; };
- 'i/read-all-unread-notes': { req: TODO; res: TODO; };
- 'i/read-announcement': { req: TODO; res: TODO; };
- 'i/regenerate-token': { req: { password: string; }; res: null; };
- 'i/registry/get-all': { req: { scope?: string[]; }; res: Record; };
- 'i/registry/get-detail': { req: { key: string; scope?: string[]; }; res: { updatedAt: DateString; value: any; }; };
- 'i/registry/get': { req: { key: string; scope?: string[]; }; res: any; };
- 'i/registry/keys-with-type': { req: { scope?: string[]; }; res: Record; };
- 'i/registry/keys': { req: { scope?: string[]; }; res: string[]; };
- 'i/registry/remove': { req: { key: string; scope?: string[]; }; res: null; };
- 'i/registry/set': { req: { key: string; value: any; scope?: string[]; }; res: null; };
- 'i/revoke-token': { req: TODO; res: TODO; };
- 'i/signin-history': { req: { limit?: number; sinceId?: Signin['id']; untilId?: Signin['id']; }; res: Signin[]; };
- 'i/unpin': { req: { noteId: Note['id']; }; res: MeDetailed; };
- 'i/update-email': { req: {
- password: string;
- email?: string | null;
- }; res: MeDetailed; };
- 'i/update': { req: {
- name?: string | null;
- description?: string | null;
- lang?: string | null;
- location?: string | null;
- birthday?: string | null;
- avatarId?: DriveFile['id'] | null;
- bannerId?: DriveFile['id'] | null;
- fields?: {
- name: string;
- value: string;
- }[];
- isLocked?: boolean;
- isExplorable?: boolean;
- hideOnlineStatus?: boolean;
- carefulBot?: boolean;
- autoAcceptFollowed?: boolean;
- noCrawle?: boolean;
- isBot?: boolean;
- isCat?: boolean;
- injectFeaturedNote?: boolean;
- receiveAnnouncementEmail?: boolean;
- alwaysMarkNsfw?: boolean;
- mutedWords?: (string[] | string)[];
- hardMutedWords?: (string[] | string)[];
- notificationRecieveConfig?: any;
- emailNotificationTypes?: string[];
- alsoKnownAs?: string[];
- }; res: MeDetailed; };
- 'i/user-group-invites': { req: TODO; res: TODO; };
- 'i/2fa/done': { req: TODO; res: TODO; };
- 'i/2fa/key-done': { req: TODO; res: TODO; };
- 'i/2fa/password-less': { req: TODO; res: TODO; };
- 'i/2fa/register-key': { req: TODO; res: TODO; };
- 'i/2fa/register': { req: TODO; res: TODO; };
- 'i/2fa/remove-key': { req: TODO; res: TODO; };
- 'i/2fa/unregister': { req: TODO; res: TODO; };
-
- // invite
- 'invite/create': { req: NoParams; res: Invite; };
- 'invite/delete': { req: { inviteId: Invite['id']; }; res: null; };
- 'invite/list': { req: { limit?: number; sinceId?: Invite['id']; untilId?: Invite['id'] }; res: Invite[]; };
- 'invite/limit': { req: NoParams; res: InviteLimit; };
-
- // messaging
- 'messaging/history': { req: { limit?: number; group?: boolean; }; res: MessagingMessage[]; };
- 'messaging/messages': { req: { userId?: User['id']; groupId?: UserGroup['id']; limit?: number; sinceId?: MessagingMessage['id']; untilId?: MessagingMessage['id']; markAsRead?: boolean; }; res: MessagingMessage[]; };
- 'messaging/messages/create': { req: { userId?: User['id']; groupId?: UserGroup['id']; text?: string; fileId?: DriveFile['id']; }; res: MessagingMessage; };
- 'messaging/messages/delete': { req: { messageId: MessagingMessage['id']; }; res: null; };
- 'messaging/messages/read': { req: { messageId: MessagingMessage['id']; }; res: null; };
-
- // meta
- 'meta': { req: { detail?: boolean; }; res: {
- $switch: {
- $cases: [[
- { detail: true; },
- DetailedInstanceMetadata,
- ], [
- { detail: false; },
- LiteInstanceMetadata,
- ], [
- { detail: boolean; },
- LiteInstanceMetadata | DetailedInstanceMetadata,
- ]];
- $default: LiteInstanceMetadata;
- };
- }; };
-
- // miauth
- 'miauth/gen-token': { req: TODO; res: TODO; };
-
- // mute
- 'mute/create': { req: TODO; res: TODO; };
- 'mute/delete': { req: { userId: User['id'] }; res: null; };
- 'mute/list': { req: TODO; res: TODO; };
-
- // my
- 'my/apps': { req: TODO; res: TODO; };
-
- // notes
- 'notes': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; }; res: Note[]; };
- 'notes/children': { req: { noteId: Note['id']; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; }; res: Note[]; };
- 'notes/clips': { req: TODO; res: TODO; };
- 'notes/conversation': { req: TODO; res: TODO; };
- 'notes/create': { req: {
- visibility?: 'public' | 'home' | 'followers' | 'specified',
- visibleUserIds?: User['id'][];
- text?: null | string;
- cw?: null | string;
- viaMobile?: boolean;
- localOnly?: boolean;
- fileIds?: DriveFile['id'][];
- replyId?: null | Note['id'];
- renoteId?: null | Note['id'];
- channelId?: null | Channel['id'];
- poll?: null | {
- choices: string[];
- multiple?: boolean;
- expiresAt?: null | number;
- expiredAfter?: null | number;
- };
- }; res: { createdNote: Note }; };
- 'notes/delete': { req: { noteId: Note['id']; }; res: null; };
- 'notes/favorites/create': { req: { noteId: Note['id']; }; res: null; };
- 'notes/favorites/delete': { req: { noteId: Note['id']; }; res: null; };
- 'notes/featured': { req: TODO; res: Note[]; };
- 'notes/global-timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'notes/hybrid-timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'notes/local-timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'notes/mentions': { req: { following?: boolean; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; }; res: Note[]; };
- 'notes/polls/recommendation': { req: TODO; res: TODO; };
- 'notes/polls/vote': { req: { noteId: Note['id']; choice: number; }; res: null; };
- 'notes/reactions': { req: { noteId: Note['id']; type?: string | null; limit?: number; }; res: NoteReaction[]; };
- 'notes/reactions/create': { req: { noteId: Note['id']; reaction: string; }; res: null; };
- 'notes/reactions/delete': { req: { noteId: Note['id']; }; res: null; };
- 'notes/renotes': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; noteId: Note['id']; }; res: Note[]; };
- 'notes/replies': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; noteId: Note['id']; }; res: Note[]; };
- 'notes/search-by-tag': { req: TODO; res: TODO; };
- 'notes/search': { req: TODO; res: TODO; };
- 'notes/show': { req: { noteId: Note['id']; }; res: Note; };
- 'notes/state': { req: TODO; res: TODO; };
- 'notes/timeline': { req: { limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'notes/unrenote': { req: { noteId: Note['id']; }; res: null; };
- 'notes/user-list-timeline': { req: { listId: UserList['id']; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'notes/watching/create': { req: TODO; res: TODO; };
- 'notes/watching/delete': { req: { noteId: Note['id']; }; res: null; };
-
- // notifications
- 'notifications/create': { req: { body: string; header?: string | null; icon?: string | null; }; res: null; };
- 'notifications/test-notification': { req: NoParams; res: null; };
- 'notifications/mark-all-as-read': { req: NoParams; res: null; };
-
- // page-push
- 'page-push': { req: { pageId: Page['id']; event: string; var?: any; }; res: null; };
-
- // pages
- 'pages/create': { req: TODO; res: Page; };
- 'pages/delete': { req: { pageId: Page['id']; }; res: null; };
- 'pages/featured': { req: NoParams; res: Page[]; };
- 'pages/like': { req: { pageId: Page['id']; }; res: null; };
- 'pages/show': { req: { pageId?: Page['id']; name?: string; username?: string; }; res: Page; };
- 'pages/unlike': { req: { pageId: Page['id']; }; res: null; };
- 'pages/update': { req: TODO; res: null; };
-
- // ping
- 'ping': { req: NoParams; res: { pong: number; }; };
-
- // pinned-users
- 'pinned-users': { req: TODO; res: TODO; };
-
- // promo
- 'promo/read': { req: TODO; res: TODO; };
-
- // request-reset-password
- 'request-reset-password': { req: { username: string; email: string; }; res: null; };
-
- // reset-password
- 'reset-password': { req: { token: string; password: string; }; res: null; };
-
- // room
- 'room/show': { req: TODO; res: TODO; };
- 'room/update': { req: TODO; res: TODO; };
-
- // signup
- 'signup': {
- req: {
- username: string;
- password: string;
- host?: string;
- invitationCode?: string;
- emailAddress?: string;
- 'hcaptcha-response'?: string;
- 'g-recaptcha-response'?: string;
- 'turnstile-response'?: string;
- };
- res: MeSignup | null;
- };
-
- // stats
- 'stats': { req: NoParams; res: Stats; };
-
- // server-info
- 'server-info': { req: NoParams; res: ServerInfo; };
-
- // sw
- 'sw/register': { req: TODO; res: TODO; };
-
- // username
- 'username/available': { req: { username: string; }; res: { available: boolean; }; };
-
- // users
- 'users': { req: { limit?: number; offset?: number; sort?: UserSorting; origin?: OriginType; }; res: User[]; };
- 'users/clips': { req: TODO; res: TODO; };
- 'users/followers': { req: { userId?: User['id']; username?: User['username']; host?: User['host'] | null; limit?: number; sinceId?: Following['id']; untilId?: Following['id']; }; res: FollowingFollowerPopulated[]; };
- 'users/following': { req: { userId?: User['id']; username?: User['username']; host?: User['host'] | null; limit?: number; sinceId?: Following['id']; untilId?: Following['id']; }; res: FollowingFolloweePopulated[]; };
- 'users/gallery/posts': { req: TODO; res: TODO; };
- 'users/get-frequently-replied-users': { req: TODO; res: TODO; };
- 'users/groups/create': { req: TODO; res: TODO; };
- 'users/groups/delete': { req: { groupId: UserGroup['id'] }; res: null; };
- 'users/groups/invitations/accept': { req: TODO; res: TODO; };
- 'users/groups/invitations/reject': { req: TODO; res: TODO; };
- 'users/groups/invite': { req: TODO; res: TODO; };
- 'users/groups/joined': { req: TODO; res: TODO; };
- 'users/groups/owned': { req: TODO; res: TODO; };
- 'users/groups/pull': { req: TODO; res: TODO; };
- 'users/groups/show': { req: TODO; res: TODO; };
- 'users/groups/transfer': { req: TODO; res: TODO; };
- 'users/groups/update': { req: TODO; res: TODO; };
- 'users/lists/create': { req: { name: string; }; res: UserList; };
- 'users/lists/delete': { req: { listId: UserList['id']; }; res: null; };
- 'users/lists/list': { req: NoParams; res: UserList[]; };
- 'users/lists/pull': { req: { listId: UserList['id']; userId: User['id']; }; res: null; };
- 'users/lists/push': { req: { listId: UserList['id']; userId: User['id']; }; res: null; };
- 'users/lists/show': { req: { listId: UserList['id']; }; res: UserList; };
- 'users/lists/update': { req: { listId: UserList['id']; name: string; }; res: UserList; };
- 'users/notes': { req: { userId: User['id']; limit?: number; sinceId?: Note['id']; untilId?: Note['id']; sinceDate?: number; untilDate?: number; }; res: Note[]; };
- 'users/pages': { req: TODO; res: TODO; };
- 'users/flashs': { req: TODO; res: TODO; };
- 'users/recommendation': { req: TODO; res: TODO; };
- 'users/relation': { req: TODO; res: TODO; };
- 'users/report-abuse': { req: TODO; res: TODO; };
- 'users/search-by-username-and-host': { req: TODO; res: TODO; };
- 'users/search': { req: TODO; res: TODO; };
- 'users/show': { req: ShowUserReq | { userIds: User['id'][]; }; res: {
- $switch: {
- $cases: [[
- { userIds: User['id'][]; },
- UserDetailed[],
- ]];
- $default: UserDetailed;
- };
- }; };
-
- // fetching external data
- 'fetch-rss': { req: { url: string; }; res: TODO; };
- 'fetch-external-resources': {
- req: { url: string; hash: string; };
- res: { type: string; data: string; };
+type SwitchCase = {
+ $switch: {
+ $cases: [any, any][],
+ $default: any;
};
};
+
+type IsNeverType = [T] extends [never] ? true : false;
+type StrictExtract = Cond extends Union ? Union : never;
+
+type IsCaseMatched =
+ Endpoints[E]['res'] extends SwitchCase
+ ? IsNeverType> extends false ? true : false
+ : false
+
+type GetCaseResult =
+ Endpoints[E]['res'] extends SwitchCase
+ ? StrictExtract[1]
+ : never
+
+export type SwitchCaseResponseType = Endpoints[E]['res'] extends SwitchCase
+ ? IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ IsCaseMatched extends true ? GetCaseResult :
+ Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res'];
+
+export type Endpoints = Overwrite<
+ Gen,
+ {
+ 'users/show': {
+ req: UsersShowRequest;
+ res: {
+ $switch: {
+ $cases: [[
+ {
+ userIds?: string[];
+ }, UserDetailed[],
+ ]];
+ $default: UserDetailed;
+ };
+ };
+ }
+ }
+>
diff --git a/packages/misskey-js/src/autogen/endpoint.ts b/packages/misskey-js/src/autogen/endpoint.ts
new file mode 100644
index 000000000..64739a65d
--- /dev/null
+++ b/packages/misskey-js/src/autogen/endpoint.ts
@@ -0,0 +1,802 @@
+/*
+ * version: 2023.11.1
+ * generatedAt: 2023-11-27T02:24:45.113Z
+ */
+
+import type {
+ EmptyRequest,
+ EmptyResponse,
+ AdminMetaResponse,
+ AdminAbuseUserReportsRequest,
+ AdminAbuseUserReportsResponse,
+ AdminAccountsCreateRequest,
+ AdminAccountsCreateResponse,
+ AdminAccountsDeleteRequest,
+ AdminAccountsFindByEmailRequest,
+ AdminAdCreateRequest,
+ AdminAdDeleteRequest,
+ AdminAdListRequest,
+ AdminAdUpdateRequest,
+ AdminAnnouncementsCreateRequest,
+ AdminAnnouncementsCreateResponse,
+ AdminAnnouncementsDeleteRequest,
+ AdminAnnouncementsListRequest,
+ AdminAnnouncementsListResponse,
+ AdminAnnouncementsUpdateRequest,
+ AdminAvatarDecorationsCreateRequest,
+ AdminAvatarDecorationsDeleteRequest,
+ AdminAvatarDecorationsListRequest,
+ AdminAvatarDecorationsListResponse,
+ AdminAvatarDecorationsUpdateRequest,
+ AdminDeleteAllFilesOfAUserRequest,
+ AdminUnsetUserAvatarRequest,
+ AdminUnsetUserBannerRequest,
+ AdminDriveFilesRequest,
+ AdminDriveFilesResponse,
+ AdminDriveShowFileRequest,
+ AdminDriveShowFileResponse,
+ AdminEmojiAddAliasesBulkRequest,
+ AdminEmojiAddRequest,
+ AdminEmojiCopyRequest,
+ AdminEmojiCopyResponse,
+ AdminEmojiDeleteBulkRequest,
+ AdminEmojiDeleteRequest,
+ AdminEmojiListRemoteRequest,
+ AdminEmojiListRemoteResponse,
+ AdminEmojiListRequest,
+ AdminEmojiListResponse,
+ AdminEmojiRemoveAliasesBulkRequest,
+ AdminEmojiSetAliasesBulkRequest,
+ AdminEmojiSetCategoryBulkRequest,
+ AdminEmojiSetLicenseBulkRequest,
+ AdminEmojiUpdateRequest,
+ AdminFederationDeleteAllFilesRequest,
+ AdminFederationRefreshRemoteInstanceMetadataRequest,
+ AdminFederationRemoveAllFollowingRequest,
+ AdminFederationUpdateInstanceRequest,
+ AdminGetTableStatsResponse,
+ AdminGetUserIpsRequest,
+ AdminInviteCreateRequest,
+ AdminInviteCreateResponse,
+ AdminInviteListRequest,
+ AdminInviteListResponse,
+ AdminPromoCreateRequest,
+ AdminQueueDeliverDelayedResponse,
+ AdminQueueInboxDelayedResponse,
+ AdminQueuePromoteRequest,
+ AdminQueueStatsResponse,
+ AdminRelaysAddRequest,
+ AdminRelaysAddResponse,
+ AdminRelaysListResponse,
+ AdminRelaysRemoveRequest,
+ AdminResetPasswordRequest,
+ AdminResetPasswordResponse,
+ AdminResolveAbuseUserReportRequest,
+ AdminSendEmailRequest,
+ AdminServerInfoResponse,
+ AdminShowModerationLogsRequest,
+ AdminShowModerationLogsResponse,
+ AdminShowUserRequest,
+ AdminShowUserResponse,
+ AdminShowUsersRequest,
+ AdminShowUsersResponse,
+ AdminSuspendUserRequest,
+ AdminUnsuspendUserRequest,
+ AdminUpdateMetaRequest,
+ AdminDeleteAccountRequest,
+ AdminDeleteAccountResponse,
+ AdminUpdateUserNoteRequest,
+ AdminRolesCreateRequest,
+ AdminRolesDeleteRequest,
+ AdminRolesShowRequest,
+ AdminRolesUpdateRequest,
+ AdminRolesAssignRequest,
+ AdminRolesUnassignRequest,
+ AdminRolesUpdateDefaultPoliciesRequest,
+ AdminRolesUsersRequest,
+ AnnouncementsRequest,
+ AnnouncementsResponse,
+ AntennasCreateRequest,
+ AntennasCreateResponse,
+ AntennasDeleteRequest,
+ AntennasListResponse,
+ AntennasNotesRequest,
+ AntennasNotesResponse,
+ AntennasShowRequest,
+ AntennasShowResponse,
+ AntennasUpdateRequest,
+ AntennasUpdateResponse,
+ ApGetRequest,
+ ApGetResponse,
+ ApShowRequest,
+ ApShowResponse,
+ AppCreateRequest,
+ AppCreateResponse,
+ AppShowRequest,
+ AppShowResponse,
+ AuthSessionGenerateRequest,
+ AuthSessionGenerateResponse,
+ AuthSessionShowRequest,
+ AuthSessionShowResponse,
+ AuthSessionUserkeyRequest,
+ AuthSessionUserkeyResponse,
+ BlockingCreateRequest,
+ BlockingCreateResponse,
+ BlockingDeleteRequest,
+ BlockingDeleteResponse,
+ BlockingListRequest,
+ BlockingListResponse,
+ ChannelsCreateRequest,
+ ChannelsCreateResponse,
+ ChannelsFeaturedResponse,
+ ChannelsFollowRequest,
+ ChannelsFollowedRequest,
+ ChannelsFollowedResponse,
+ ChannelsOwnedRequest,
+ ChannelsOwnedResponse,
+ ChannelsShowRequest,
+ ChannelsShowResponse,
+ ChannelsTimelineRequest,
+ ChannelsTimelineResponse,
+ ChannelsUnfollowRequest,
+ ChannelsUpdateRequest,
+ ChannelsUpdateResponse,
+ ChannelsFavoriteRequest,
+ ChannelsUnfavoriteRequest,
+ ChannelsMyFavoritesResponse,
+ ChannelsSearchRequest,
+ ChannelsSearchResponse,
+ ChartsActiveUsersRequest,
+ ChartsActiveUsersResponse,
+ ChartsApRequestRequest,
+ ChartsApRequestResponse,
+ ChartsDriveRequest,
+ ChartsDriveResponse,
+ ChartsFederationRequest,
+ ChartsFederationResponse,
+ ChartsInstanceRequest,
+ ChartsInstanceResponse,
+ ChartsNotesRequest,
+ ChartsNotesResponse,
+ ChartsUserDriveRequest,
+ ChartsUserDriveResponse,
+ ChartsUserFollowingRequest,
+ ChartsUserFollowingResponse,
+ ChartsUserNotesRequest,
+ ChartsUserNotesResponse,
+ ChartsUserPvRequest,
+ ChartsUserPvResponse,
+ ChartsUserReactionsRequest,
+ ChartsUserReactionsResponse,
+ ChartsUsersRequest,
+ ChartsUsersResponse,
+ ClipsAddNoteRequest,
+ ClipsRemoveNoteRequest,
+ ClipsCreateRequest,
+ ClipsCreateResponse,
+ ClipsDeleteRequest,
+ ClipsListResponse,
+ ClipsNotesRequest,
+ ClipsNotesResponse,
+ ClipsShowRequest,
+ ClipsShowResponse,
+ ClipsUpdateRequest,
+ ClipsUpdateResponse,
+ ClipsFavoriteRequest,
+ ClipsUnfavoriteRequest,
+ ClipsMyFavoritesResponse,
+ DriveResponse,
+ DriveFilesRequest,
+ DriveFilesResponse,
+ DriveFilesAttachedNotesRequest,
+ DriveFilesAttachedNotesResponse,
+ DriveFilesCheckExistenceRequest,
+ DriveFilesCheckExistenceResponse,
+ DriveFilesCreateRequest,
+ DriveFilesCreateResponse,
+ DriveFilesDeleteRequest,
+ DriveFilesFindByHashRequest,
+ DriveFilesFindByHashResponse,
+ DriveFilesFindRequest,
+ DriveFilesFindResponse,
+ DriveFilesShowRequest,
+ DriveFilesShowResponse,
+ DriveFilesUpdateRequest,
+ DriveFilesUpdateResponse,
+ DriveFilesUploadFromUrlRequest,
+ DriveFoldersRequest,
+ DriveFoldersResponse,
+ DriveFoldersCreateRequest,
+ DriveFoldersCreateResponse,
+ DriveFoldersDeleteRequest,
+ DriveFoldersFindRequest,
+ DriveFoldersFindResponse,
+ DriveFoldersShowRequest,
+ DriveFoldersShowResponse,
+ DriveFoldersUpdateRequest,
+ DriveFoldersUpdateResponse,
+ DriveStreamRequest,
+ DriveStreamResponse,
+ EmailAddressAvailableRequest,
+ EmailAddressAvailableResponse,
+ EndpointRequest,
+ EndpointsResponse,
+ FederationFollowersRequest,
+ FederationFollowersResponse,
+ FederationFollowingRequest,
+ FederationFollowingResponse,
+ FederationInstancesRequest,
+ FederationInstancesResponse,
+ FederationShowInstanceRequest,
+ FederationShowInstanceResponse,
+ FederationUpdateRemoteUserRequest,
+ FederationUsersRequest,
+ FederationUsersResponse,
+ FederationStatsRequest,
+ FollowingCreateRequest,
+ FollowingCreateResponse,
+ FollowingDeleteRequest,
+ FollowingDeleteResponse,
+ FollowingUpdateRequest,
+ FollowingUpdateResponse,
+ FollowingUpdateAllRequest,
+ FollowingInvalidateRequest,
+ FollowingInvalidateResponse,
+ FollowingRequestsAcceptRequest,
+ FollowingRequestsCancelRequest,
+ FollowingRequestsCancelResponse,
+ FollowingRequestsListRequest,
+ FollowingRequestsListResponse,
+ FollowingRequestsRejectRequest,
+ GalleryFeaturedRequest,
+ GalleryFeaturedResponse,
+ GalleryPopularResponse,
+ GalleryPostsRequest,
+ GalleryPostsResponse,
+ GalleryPostsCreateRequest,
+ GalleryPostsCreateResponse,
+ GalleryPostsDeleteRequest,
+ GalleryPostsLikeRequest,
+ GalleryPostsShowRequest,
+ GalleryPostsShowResponse,
+ GalleryPostsUnlikeRequest,
+ GalleryPostsUpdateRequest,
+ GalleryPostsUpdateResponse,
+ GetAvatarDecorationsResponse,
+ HashtagsListRequest,
+ HashtagsListResponse,
+ HashtagsSearchRequest,
+ HashtagsSearchResponse,
+ HashtagsShowRequest,
+ HashtagsShowResponse,
+ HashtagsTrendResponse,
+ HashtagsUsersRequest,
+ HashtagsUsersResponse,
+ IResponse,
+ IClaimAchievementRequest,
+ IFavoritesRequest,
+ IFavoritesResponse,
+ IGalleryLikesRequest,
+ IGalleryLikesResponse,
+ IGalleryPostsRequest,
+ IGalleryPostsResponse,
+ INotificationsRequest,
+ INotificationsResponse,
+ INotificationsGroupedRequest,
+ INotificationsGroupedResponse,
+ IPageLikesRequest,
+ IPageLikesResponse,
+ IPagesRequest,
+ IPagesResponse,
+ IPinRequest,
+ IPinResponse,
+ IReadAnnouncementRequest,
+ IRegistryGetAllRequest,
+ IRegistryGetDetailRequest,
+ IRegistryGetRequest,
+ IRegistryKeysWithTypeRequest,
+ IRegistryKeysRequest,
+ IRegistryRemoveRequest,
+ IRegistrySetRequest,
+ IUnpinRequest,
+ IUnpinResponse,
+ IUpdateRequest,
+ IUpdateResponse,
+ IWebhooksCreateRequest,
+ IWebhooksShowRequest,
+ IWebhooksUpdateRequest,
+ IWebhooksDeleteRequest,
+ InviteCreateResponse,
+ InviteDeleteRequest,
+ InviteListRequest,
+ InviteListResponse,
+ InviteLimitResponse,
+ MetaRequest,
+ MetaResponse,
+ EmojisResponse,
+ EmojiRequest,
+ EmojiResponse,
+ MuteCreateRequest,
+ MuteDeleteRequest,
+ MuteListRequest,
+ MuteListResponse,
+ RenoteMuteCreateRequest,
+ RenoteMuteDeleteRequest,
+ RenoteMuteListRequest,
+ RenoteMuteListResponse,
+ MyAppsRequest,
+ MyAppsResponse,
+ NotesRequest,
+ NotesResponse,
+ NotesChildrenRequest,
+ NotesChildrenResponse,
+ NotesClipsRequest,
+ NotesClipsResponse,
+ NotesConversationRequest,
+ NotesConversationResponse,
+ NotesCreateRequest,
+ NotesCreateResponse,
+ NotesDeleteRequest,
+ NotesFavoritesCreateRequest,
+ NotesFavoritesDeleteRequest,
+ NotesFeaturedRequest,
+ NotesFeaturedResponse,
+ NotesGlobalTimelineRequest,
+ NotesGlobalTimelineResponse,
+ NotesHybridTimelineRequest,
+ NotesHybridTimelineResponse,
+ NotesLocalTimelineRequest,
+ NotesLocalTimelineResponse,
+ NotesMentionsRequest,
+ NotesMentionsResponse,
+ NotesPollsRecommendationRequest,
+ NotesPollsRecommendationResponse,
+ NotesPollsVoteRequest,
+ NotesReactionsRequest,
+ NotesReactionsResponse,
+ NotesReactionsCreateRequest,
+ NotesReactionsDeleteRequest,
+ NotesRenotesRequest,
+ NotesRenotesResponse,
+ NotesRepliesRequest,
+ NotesRepliesResponse,
+ NotesSearchByTagRequest,
+ NotesSearchByTagResponse,
+ NotesSearchRequest,
+ NotesSearchResponse,
+ NotesShowRequest,
+ NotesShowResponse,
+ NotesStateRequest,
+ NotesStateResponse,
+ NotesThreadMutingCreateRequest,
+ NotesThreadMutingDeleteRequest,
+ NotesTimelineRequest,
+ NotesTimelineResponse,
+ NotesTranslateRequest,
+ NotesTranslateResponse,
+ NotesUnrenoteRequest,
+ NotesUserListTimelineRequest,
+ NotesUserListTimelineResponse,
+ NotificationsCreateRequest,
+ PagesCreateRequest,
+ PagesCreateResponse,
+ PagesDeleteRequest,
+ PagesFeaturedResponse,
+ PagesLikeRequest,
+ PagesShowRequest,
+ PagesShowResponse,
+ PagesUnlikeRequest,
+ PagesUpdateRequest,
+ FlashCreateRequest,
+ FlashDeleteRequest,
+ FlashFeaturedResponse,
+ FlashLikeRequest,
+ FlashShowRequest,
+ FlashShowResponse,
+ FlashUnlikeRequest,
+ FlashUpdateRequest,
+ FlashMyRequest,
+ FlashMyResponse,
+ FlashMyLikesRequest,
+ FlashMyLikesResponse,
+ PingResponse,
+ PinnedUsersResponse,
+ PromoReadRequest,
+ RolesShowRequest,
+ RolesUsersRequest,
+ RolesNotesRequest,
+ RolesNotesResponse,
+ RequestResetPasswordRequest,
+ ResetPasswordRequest,
+ StatsResponse,
+ SwShowRegistrationRequest,
+ SwShowRegistrationResponse,
+ SwUpdateRegistrationRequest,
+ SwUpdateRegistrationResponse,
+ SwRegisterRequest,
+ SwRegisterResponse,
+ SwUnregisterRequest,
+ TestRequest,
+ UsernameAvailableRequest,
+ UsernameAvailableResponse,
+ UsersRequest,
+ UsersResponse,
+ UsersClipsRequest,
+ UsersClipsResponse,
+ UsersFollowersRequest,
+ UsersFollowersResponse,
+ UsersFollowingRequest,
+ UsersFollowingResponse,
+ UsersGalleryPostsRequest,
+ UsersGalleryPostsResponse,
+ UsersGetFrequentlyRepliedUsersRequest,
+ UsersGetFrequentlyRepliedUsersResponse,
+ UsersFeaturedNotesRequest,
+ UsersFeaturedNotesResponse,
+ UsersListsCreateRequest,
+ UsersListsCreateResponse,
+ UsersListsDeleteRequest,
+ UsersListsListRequest,
+ UsersListsListResponse,
+ UsersListsPullRequest,
+ UsersListsPushRequest,
+ UsersListsShowRequest,
+ UsersListsShowResponse,
+ UsersListsFavoriteRequest,
+ UsersListsUnfavoriteRequest,
+ UsersListsUpdateRequest,
+ UsersListsUpdateResponse,
+ UsersListsCreateFromPublicRequest,
+ UsersListsCreateFromPublicResponse,
+ UsersListsUpdateMembershipRequest,
+ UsersListsGetMembershipsRequest,
+ UsersNotesRequest,
+ UsersNotesResponse,
+ UsersPagesRequest,
+ UsersPagesResponse,
+ UsersFlashsRequest,
+ UsersFlashsResponse,
+ UsersReactionsRequest,
+ UsersReactionsResponse,
+ UsersRecommendationRequest,
+ UsersRecommendationResponse,
+ UsersRelationRequest,
+ UsersRelationResponse,
+ UsersReportAbuseRequest,
+ UsersSearchByUsernameAndHostRequest,
+ UsersSearchByUsernameAndHostResponse,
+ UsersSearchRequest,
+ UsersSearchResponse,
+ UsersShowRequest,
+ UsersShowResponse,
+ UsersAchievementsRequest,
+ UsersUpdateMemoRequest,
+ FetchRssRequest,
+ FetchExternalResourcesRequest,
+ RetentionResponse,
+} from './entities.js';
+
+export type Endpoints = {
+ 'admin/meta': { req: EmptyRequest; res: AdminMetaResponse };
+ 'admin/abuse-user-reports': { req: AdminAbuseUserReportsRequest; res: AdminAbuseUserReportsResponse };
+ 'admin/accounts/create': { req: AdminAccountsCreateRequest; res: AdminAccountsCreateResponse };
+ 'admin/accounts/delete': { req: AdminAccountsDeleteRequest; res: EmptyResponse };
+ 'admin/accounts/find-by-email': { req: AdminAccountsFindByEmailRequest; res: EmptyResponse };
+ 'admin/ad/create': { req: AdminAdCreateRequest; res: EmptyResponse };
+ 'admin/ad/delete': { req: AdminAdDeleteRequest; res: EmptyResponse };
+ 'admin/ad/list': { req: AdminAdListRequest; res: EmptyResponse };
+ 'admin/ad/update': { req: AdminAdUpdateRequest; res: EmptyResponse };
+ 'admin/announcements/create': { req: AdminAnnouncementsCreateRequest; res: AdminAnnouncementsCreateResponse };
+ 'admin/announcements/delete': { req: AdminAnnouncementsDeleteRequest; res: EmptyResponse };
+ 'admin/announcements/list': { req: AdminAnnouncementsListRequest; res: AdminAnnouncementsListResponse };
+ 'admin/announcements/update': { req: AdminAnnouncementsUpdateRequest; res: EmptyResponse };
+ 'admin/avatar-decorations/create': { req: AdminAvatarDecorationsCreateRequest; res: EmptyResponse };
+ 'admin/avatar-decorations/delete': { req: AdminAvatarDecorationsDeleteRequest; res: EmptyResponse };
+ 'admin/avatar-decorations/list': { req: AdminAvatarDecorationsListRequest; res: AdminAvatarDecorationsListResponse };
+ 'admin/avatar-decorations/update': { req: AdminAvatarDecorationsUpdateRequest; res: EmptyResponse };
+ 'admin/delete-all-files-of-a-user': { req: AdminDeleteAllFilesOfAUserRequest; res: EmptyResponse };
+ 'admin/unset-user-avatar': { req: AdminUnsetUserAvatarRequest; res: EmptyResponse };
+ 'admin/unset-user-banner': { req: AdminUnsetUserBannerRequest; res: EmptyResponse };
+ 'admin/drive/clean-remote-files': { req: EmptyRequest; res: EmptyResponse };
+ 'admin/drive/cleanup': { req: EmptyRequest; res: EmptyResponse };
+ 'admin/drive/files': { req: AdminDriveFilesRequest; res: AdminDriveFilesResponse };
+ 'admin/drive/show-file': { req: AdminDriveShowFileRequest; res: AdminDriveShowFileResponse };
+ 'admin/emoji/add-aliases-bulk': { req: AdminEmojiAddAliasesBulkRequest; res: EmptyResponse };
+ 'admin/emoji/add': { req: AdminEmojiAddRequest; res: EmptyResponse };
+ 'admin/emoji/copy': { req: AdminEmojiCopyRequest; res: AdminEmojiCopyResponse };
+ 'admin/emoji/delete-bulk': { req: AdminEmojiDeleteBulkRequest; res: EmptyResponse };
+ 'admin/emoji/delete': { req: AdminEmojiDeleteRequest; res: EmptyResponse };
+ 'admin/emoji/list-remote': { req: AdminEmojiListRemoteRequest; res: AdminEmojiListRemoteResponse };
+ 'admin/emoji/list': { req: AdminEmojiListRequest; res: AdminEmojiListResponse };
+ 'admin/emoji/remove-aliases-bulk': { req: AdminEmojiRemoveAliasesBulkRequest; res: EmptyResponse };
+ 'admin/emoji/set-aliases-bulk': { req: AdminEmojiSetAliasesBulkRequest; res: EmptyResponse };
+ 'admin/emoji/set-category-bulk': { req: AdminEmojiSetCategoryBulkRequest; res: EmptyResponse };
+ 'admin/emoji/set-license-bulk': { req: AdminEmojiSetLicenseBulkRequest; res: EmptyResponse };
+ 'admin/emoji/update': { req: AdminEmojiUpdateRequest; res: EmptyResponse };
+ 'admin/federation/delete-all-files': { req: AdminFederationDeleteAllFilesRequest; res: EmptyResponse };
+ 'admin/federation/refresh-remote-instance-metadata': { req: AdminFederationRefreshRemoteInstanceMetadataRequest; res: EmptyResponse };
+ 'admin/federation/remove-all-following': { req: AdminFederationRemoveAllFollowingRequest; res: EmptyResponse };
+ 'admin/federation/update-instance': { req: AdminFederationUpdateInstanceRequest; res: EmptyResponse };
+ 'admin/get-index-stats': { req: EmptyRequest; res: EmptyResponse };
+ 'admin/get-table-stats': { req: EmptyRequest; res: AdminGetTableStatsResponse };
+ 'admin/get-user-ips': { req: AdminGetUserIpsRequest; res: EmptyResponse };
+ 'admin/invite/create': { req: AdminInviteCreateRequest; res: AdminInviteCreateResponse };
+ 'admin/invite/list': { req: AdminInviteListRequest; res: AdminInviteListResponse };
+ 'admin/promo/create': { req: AdminPromoCreateRequest; res: EmptyResponse };
+ 'admin/queue/clear': { req: EmptyRequest; res: EmptyResponse };
+ 'admin/queue/deliver-delayed': { req: EmptyRequest; res: AdminQueueDeliverDelayedResponse };
+ 'admin/queue/inbox-delayed': { req: EmptyRequest; res: AdminQueueInboxDelayedResponse };
+ 'admin/queue/promote': { req: AdminQueuePromoteRequest; res: EmptyResponse };
+ 'admin/queue/stats': { req: EmptyRequest; res: AdminQueueStatsResponse };
+ 'admin/relays/add': { req: AdminRelaysAddRequest; res: AdminRelaysAddResponse };
+ 'admin/relays/list': { req: EmptyRequest; res: AdminRelaysListResponse };
+ 'admin/relays/remove': { req: AdminRelaysRemoveRequest; res: EmptyResponse };
+ 'admin/reset-password': { req: AdminResetPasswordRequest; res: AdminResetPasswordResponse };
+ 'admin/resolve-abuse-user-report': { req: AdminResolveAbuseUserReportRequest; res: EmptyResponse };
+ 'admin/send-email': { req: AdminSendEmailRequest; res: EmptyResponse };
+ 'admin/server-info': { req: EmptyRequest; res: AdminServerInfoResponse };
+ 'admin/show-moderation-logs': { req: AdminShowModerationLogsRequest; res: AdminShowModerationLogsResponse };
+ 'admin/show-user': { req: AdminShowUserRequest; res: AdminShowUserResponse };
+ 'admin/show-users': { req: AdminShowUsersRequest; res: AdminShowUsersResponse };
+ 'admin/suspend-user': { req: AdminSuspendUserRequest; res: EmptyResponse };
+ 'admin/unsuspend-user': { req: AdminUnsuspendUserRequest; res: EmptyResponse };
+ 'admin/update-meta': { req: AdminUpdateMetaRequest; res: EmptyResponse };
+ 'admin/delete-account': { req: AdminDeleteAccountRequest; res: AdminDeleteAccountResponse };
+ 'admin/update-user-note': { req: AdminUpdateUserNoteRequest; res: EmptyResponse };
+ 'admin/roles/create': { req: AdminRolesCreateRequest; res: EmptyResponse };
+ 'admin/roles/delete': { req: AdminRolesDeleteRequest; res: EmptyResponse };
+ 'admin/roles/list': { req: EmptyRequest; res: EmptyResponse };
+ 'admin/roles/show': { req: AdminRolesShowRequest; res: EmptyResponse };
+ 'admin/roles/update': { req: AdminRolesUpdateRequest; res: EmptyResponse };
+ 'admin/roles/assign': { req: AdminRolesAssignRequest; res: EmptyResponse };
+ 'admin/roles/unassign': { req: AdminRolesUnassignRequest; res: EmptyResponse };
+ 'admin/roles/update-default-policies': { req: AdminRolesUpdateDefaultPoliciesRequest; res: EmptyResponse };
+ 'admin/roles/users': { req: AdminRolesUsersRequest; res: EmptyResponse };
+ 'announcements': { req: AnnouncementsRequest; res: AnnouncementsResponse };
+ 'antennas/create': { req: AntennasCreateRequest; res: AntennasCreateResponse };
+ 'antennas/delete': { req: AntennasDeleteRequest; res: EmptyResponse };
+ 'antennas/list': { req: EmptyRequest; res: AntennasListResponse };
+ 'antennas/notes': { req: AntennasNotesRequest; res: AntennasNotesResponse };
+ 'antennas/show': { req: AntennasShowRequest; res: AntennasShowResponse };
+ 'antennas/update': { req: AntennasUpdateRequest; res: AntennasUpdateResponse };
+ 'ap/get': { req: ApGetRequest; res: ApGetResponse };
+ 'ap/show': { req: ApShowRequest; res: ApShowResponse };
+ 'app/create': { req: AppCreateRequest; res: AppCreateResponse };
+ 'app/show': { req: AppShowRequest; res: AppShowResponse };
+ 'auth/session/generate': { req: AuthSessionGenerateRequest; res: AuthSessionGenerateResponse };
+ 'auth/session/show': { req: AuthSessionShowRequest; res: AuthSessionShowResponse };
+ 'auth/session/userkey': { req: AuthSessionUserkeyRequest; res: AuthSessionUserkeyResponse };
+ 'blocking/create': { req: BlockingCreateRequest; res: BlockingCreateResponse };
+ 'blocking/delete': { req: BlockingDeleteRequest; res: BlockingDeleteResponse };
+ 'blocking/list': { req: BlockingListRequest; res: BlockingListResponse };
+ 'channels/create': { req: ChannelsCreateRequest; res: ChannelsCreateResponse };
+ 'channels/featured': { req: EmptyRequest; res: ChannelsFeaturedResponse };
+ 'channels/follow': { req: ChannelsFollowRequest; res: EmptyResponse };
+ 'channels/followed': { req: ChannelsFollowedRequest; res: ChannelsFollowedResponse };
+ 'channels/owned': { req: ChannelsOwnedRequest; res: ChannelsOwnedResponse };
+ 'channels/show': { req: ChannelsShowRequest; res: ChannelsShowResponse };
+ 'channels/timeline': { req: ChannelsTimelineRequest; res: ChannelsTimelineResponse };
+ 'channels/unfollow': { req: ChannelsUnfollowRequest; res: EmptyResponse };
+ 'channels/update': { req: ChannelsUpdateRequest; res: ChannelsUpdateResponse };
+ 'channels/favorite': { req: ChannelsFavoriteRequest; res: EmptyResponse };
+ 'channels/unfavorite': { req: ChannelsUnfavoriteRequest; res: EmptyResponse };
+ 'channels/my-favorites': { req: EmptyRequest; res: ChannelsMyFavoritesResponse };
+ 'channels/search': { req: ChannelsSearchRequest; res: ChannelsSearchResponse };
+ 'charts/active-users': { req: ChartsActiveUsersRequest; res: ChartsActiveUsersResponse };
+ 'charts/ap-request': { req: ChartsApRequestRequest; res: ChartsApRequestResponse };
+ 'charts/drive': { req: ChartsDriveRequest; res: ChartsDriveResponse };
+ 'charts/federation': { req: ChartsFederationRequest; res: ChartsFederationResponse };
+ 'charts/instance': { req: ChartsInstanceRequest; res: ChartsInstanceResponse };
+ 'charts/notes': { req: ChartsNotesRequest; res: ChartsNotesResponse };
+ 'charts/user/drive': { req: ChartsUserDriveRequest; res: ChartsUserDriveResponse };
+ 'charts/user/following': { req: ChartsUserFollowingRequest; res: ChartsUserFollowingResponse };
+ 'charts/user/notes': { req: ChartsUserNotesRequest; res: ChartsUserNotesResponse };
+ 'charts/user/pv': { req: ChartsUserPvRequest; res: ChartsUserPvResponse };
+ 'charts/user/reactions': { req: ChartsUserReactionsRequest; res: ChartsUserReactionsResponse };
+ 'charts/users': { req: ChartsUsersRequest; res: ChartsUsersResponse };
+ 'clips/add-note': { req: ClipsAddNoteRequest; res: EmptyResponse };
+ 'clips/remove-note': { req: ClipsRemoveNoteRequest; res: EmptyResponse };
+ 'clips/create': { req: ClipsCreateRequest; res: ClipsCreateResponse };
+ 'clips/delete': { req: ClipsDeleteRequest; res: EmptyResponse };
+ 'clips/list': { req: EmptyRequest; res: ClipsListResponse };
+ 'clips/notes': { req: ClipsNotesRequest; res: ClipsNotesResponse };
+ 'clips/show': { req: ClipsShowRequest; res: ClipsShowResponse };
+ 'clips/update': { req: ClipsUpdateRequest; res: ClipsUpdateResponse };
+ 'clips/favorite': { req: ClipsFavoriteRequest; res: EmptyResponse };
+ 'clips/unfavorite': { req: ClipsUnfavoriteRequest; res: EmptyResponse };
+ 'clips/my-favorites': { req: EmptyRequest; res: ClipsMyFavoritesResponse };
+ 'drive': { req: EmptyRequest; res: DriveResponse };
+ 'drive/files': { req: DriveFilesRequest; res: DriveFilesResponse };
+ 'drive/files/attached-notes': { req: DriveFilesAttachedNotesRequest; res: DriveFilesAttachedNotesResponse };
+ 'drive/files/check-existence': { req: DriveFilesCheckExistenceRequest; res: DriveFilesCheckExistenceResponse };
+ 'drive/files/create': { req: DriveFilesCreateRequest; res: DriveFilesCreateResponse };
+ 'drive/files/delete': { req: DriveFilesDeleteRequest; res: EmptyResponse };
+ 'drive/files/find-by-hash': { req: DriveFilesFindByHashRequest; res: DriveFilesFindByHashResponse };
+ 'drive/files/find': { req: DriveFilesFindRequest; res: DriveFilesFindResponse };
+ 'drive/files/show': { req: DriveFilesShowRequest; res: DriveFilesShowResponse };
+ 'drive/files/update': { req: DriveFilesUpdateRequest; res: DriveFilesUpdateResponse };
+ 'drive/files/upload-from-url': { req: DriveFilesUploadFromUrlRequest; res: EmptyResponse };
+ 'drive/folders': { req: DriveFoldersRequest; res: DriveFoldersResponse };
+ 'drive/folders/create': { req: DriveFoldersCreateRequest; res: DriveFoldersCreateResponse };
+ 'drive/folders/delete': { req: DriveFoldersDeleteRequest; res: EmptyResponse };
+ 'drive/folders/find': { req: DriveFoldersFindRequest; res: DriveFoldersFindResponse };
+ 'drive/folders/show': { req: DriveFoldersShowRequest; res: DriveFoldersShowResponse };
+ 'drive/folders/update': { req: DriveFoldersUpdateRequest; res: DriveFoldersUpdateResponse };
+ 'drive/stream': { req: DriveStreamRequest; res: DriveStreamResponse };
+ 'email-address/available': { req: EmailAddressAvailableRequest; res: EmailAddressAvailableResponse };
+ 'endpoint': { req: EndpointRequest; res: EmptyResponse };
+ 'endpoints': { req: EmptyRequest; res: EndpointsResponse };
+ 'federation/followers': { req: FederationFollowersRequest; res: FederationFollowersResponse };
+ 'federation/following': { req: FederationFollowingRequest; res: FederationFollowingResponse };
+ 'federation/instances': { req: FederationInstancesRequest; res: FederationInstancesResponse };
+ 'federation/show-instance': { req: FederationShowInstanceRequest; res: FederationShowInstanceResponse };
+ 'federation/update-remote-user': { req: FederationUpdateRemoteUserRequest; res: EmptyResponse };
+ 'federation/users': { req: FederationUsersRequest; res: FederationUsersResponse };
+ 'federation/stats': { req: FederationStatsRequest; res: EmptyResponse };
+ 'following/create': { req: FollowingCreateRequest; res: FollowingCreateResponse };
+ 'following/delete': { req: FollowingDeleteRequest; res: FollowingDeleteResponse };
+ 'following/update': { req: FollowingUpdateRequest; res: FollowingUpdateResponse };
+ 'following/update-all': { req: FollowingUpdateAllRequest; res: EmptyResponse };
+ 'following/invalidate': { req: FollowingInvalidateRequest; res: FollowingInvalidateResponse };
+ 'following/requests/accept': { req: FollowingRequestsAcceptRequest; res: EmptyResponse };
+ 'following/requests/cancel': { req: FollowingRequestsCancelRequest; res: FollowingRequestsCancelResponse };
+ 'following/requests/list': { req: FollowingRequestsListRequest; res: FollowingRequestsListResponse };
+ 'following/requests/reject': { req: FollowingRequestsRejectRequest; res: EmptyResponse };
+ 'gallery/featured': { req: GalleryFeaturedRequest; res: GalleryFeaturedResponse };
+ 'gallery/popular': { req: EmptyRequest; res: GalleryPopularResponse };
+ 'gallery/posts': { req: GalleryPostsRequest; res: GalleryPostsResponse };
+ 'gallery/posts/create': { req: GalleryPostsCreateRequest; res: GalleryPostsCreateResponse };
+ 'gallery/posts/delete': { req: GalleryPostsDeleteRequest; res: EmptyResponse };
+ 'gallery/posts/like': { req: GalleryPostsLikeRequest; res: EmptyResponse };
+ 'gallery/posts/show': { req: GalleryPostsShowRequest; res: GalleryPostsShowResponse };
+ 'gallery/posts/unlike': { req: GalleryPostsUnlikeRequest; res: EmptyResponse };
+ 'gallery/posts/update': { req: GalleryPostsUpdateRequest; res: GalleryPostsUpdateResponse };
+ 'get-online-users-count': { req: EmptyRequest; res: EmptyResponse };
+ 'get-avatar-decorations': { req: EmptyRequest; res: GetAvatarDecorationsResponse };
+ 'hashtags/list': { req: HashtagsListRequest; res: HashtagsListResponse };
+ 'hashtags/search': { req: HashtagsSearchRequest; res: HashtagsSearchResponse };
+ 'hashtags/show': { req: HashtagsShowRequest; res: HashtagsShowResponse };
+ 'hashtags/trend': { req: EmptyRequest; res: HashtagsTrendResponse };
+ 'hashtags/users': { req: HashtagsUsersRequest; res: HashtagsUsersResponse };
+ 'i': { req: EmptyRequest; res: IResponse };
+ 'i/claim-achievement': { req: IClaimAchievementRequest; res: EmptyResponse };
+ 'i/favorites': { req: IFavoritesRequest; res: IFavoritesResponse };
+ 'i/gallery/likes': { req: IGalleryLikesRequest; res: IGalleryLikesResponse };
+ 'i/gallery/posts': { req: IGalleryPostsRequest; res: IGalleryPostsResponse };
+ 'i/notifications': { req: INotificationsRequest; res: INotificationsResponse };
+ 'i/notifications-grouped': { req: INotificationsGroupedRequest; res: INotificationsGroupedResponse };
+ 'i/page-likes': { req: IPageLikesRequest; res: IPageLikesResponse };
+ 'i/pages': { req: IPagesRequest; res: IPagesResponse };
+ 'i/pin': { req: IPinRequest; res: IPinResponse };
+ 'i/read-all-unread-notes': { req: EmptyRequest; res: EmptyResponse };
+ 'i/read-announcement': { req: IReadAnnouncementRequest; res: EmptyResponse };
+ 'i/registry/get-all': { req: IRegistryGetAllRequest; res: EmptyResponse };
+ 'i/registry/get-detail': { req: IRegistryGetDetailRequest; res: EmptyResponse };
+ 'i/registry/get': { req: IRegistryGetRequest; res: EmptyResponse };
+ 'i/registry/keys-with-type': { req: IRegistryKeysWithTypeRequest; res: EmptyResponse };
+ 'i/registry/keys': { req: IRegistryKeysRequest; res: EmptyResponse };
+ 'i/registry/remove': { req: IRegistryRemoveRequest; res: EmptyResponse };
+ 'i/registry/set': { req: IRegistrySetRequest; res: EmptyResponse };
+ 'i/unpin': { req: IUnpinRequest; res: IUnpinResponse };
+ 'i/update': { req: IUpdateRequest; res: IUpdateResponse };
+ 'i/webhooks/create': { req: IWebhooksCreateRequest; res: EmptyResponse };
+ 'i/webhooks/list': { req: EmptyRequest; res: EmptyResponse };
+ 'i/webhooks/show': { req: IWebhooksShowRequest; res: EmptyResponse };
+ 'i/webhooks/update': { req: IWebhooksUpdateRequest; res: EmptyResponse };
+ 'i/webhooks/delete': { req: IWebhooksDeleteRequest; res: EmptyResponse };
+ 'invite/create': { req: EmptyRequest; res: InviteCreateResponse };
+ 'invite/delete': { req: InviteDeleteRequest; res: EmptyResponse };
+ 'invite/list': { req: InviteListRequest; res: InviteListResponse };
+ 'invite/limit': { req: EmptyRequest; res: InviteLimitResponse };
+ 'meta': { req: MetaRequest; res: MetaResponse };
+ 'emojis': { req: EmptyRequest; res: EmojisResponse };
+ 'emoji': { req: EmojiRequest; res: EmojiResponse };
+ 'mute/create': { req: MuteCreateRequest; res: EmptyResponse };
+ 'mute/delete': { req: MuteDeleteRequest; res: EmptyResponse };
+ 'mute/list': { req: MuteListRequest; res: MuteListResponse };
+ 'renote-mute/create': { req: RenoteMuteCreateRequest; res: EmptyResponse };
+ 'renote-mute/delete': { req: RenoteMuteDeleteRequest; res: EmptyResponse };
+ 'renote-mute/list': { req: RenoteMuteListRequest; res: RenoteMuteListResponse };
+ 'my/apps': { req: MyAppsRequest; res: MyAppsResponse };
+ 'notes': { req: NotesRequest; res: NotesResponse };
+ 'notes/children': { req: NotesChildrenRequest; res: NotesChildrenResponse };
+ 'notes/clips': { req: NotesClipsRequest; res: NotesClipsResponse };
+ 'notes/conversation': { req: NotesConversationRequest; res: NotesConversationResponse };
+ 'notes/create': { req: NotesCreateRequest; res: NotesCreateResponse };
+ 'notes/delete': { req: NotesDeleteRequest; res: EmptyResponse };
+ 'notes/favorites/create': { req: NotesFavoritesCreateRequest; res: EmptyResponse };
+ 'notes/favorites/delete': { req: NotesFavoritesDeleteRequest; res: EmptyResponse };
+ 'notes/featured': { req: NotesFeaturedRequest; res: NotesFeaturedResponse };
+ 'notes/global-timeline': { req: NotesGlobalTimelineRequest; res: NotesGlobalTimelineResponse };
+ 'notes/hybrid-timeline': { req: NotesHybridTimelineRequest; res: NotesHybridTimelineResponse };
+ 'notes/local-timeline': { req: NotesLocalTimelineRequest; res: NotesLocalTimelineResponse };
+ 'notes/mentions': { req: NotesMentionsRequest; res: NotesMentionsResponse };
+ 'notes/polls/recommendation': { req: NotesPollsRecommendationRequest; res: NotesPollsRecommendationResponse };
+ 'notes/polls/vote': { req: NotesPollsVoteRequest; res: EmptyResponse };
+ 'notes/reactions': { req: NotesReactionsRequest; res: NotesReactionsResponse };
+ 'notes/reactions/create': { req: NotesReactionsCreateRequest; res: EmptyResponse };
+ 'notes/reactions/delete': { req: NotesReactionsDeleteRequest; res: EmptyResponse };
+ 'notes/renotes': { req: NotesRenotesRequest; res: NotesRenotesResponse };
+ 'notes/replies': { req: NotesRepliesRequest; res: NotesRepliesResponse };
+ 'notes/search-by-tag': { req: NotesSearchByTagRequest; res: NotesSearchByTagResponse };
+ 'notes/search': { req: NotesSearchRequest; res: NotesSearchResponse };
+ 'notes/show': { req: NotesShowRequest; res: NotesShowResponse };
+ 'notes/state': { req: NotesStateRequest; res: NotesStateResponse };
+ 'notes/thread-muting/create': { req: NotesThreadMutingCreateRequest; res: EmptyResponse };
+ 'notes/thread-muting/delete': { req: NotesThreadMutingDeleteRequest; res: EmptyResponse };
+ 'notes/timeline': { req: NotesTimelineRequest; res: NotesTimelineResponse };
+ 'notes/translate': { req: NotesTranslateRequest; res: NotesTranslateResponse };
+ 'notes/unrenote': { req: NotesUnrenoteRequest; res: EmptyResponse };
+ 'notes/user-list-timeline': { req: NotesUserListTimelineRequest; res: NotesUserListTimelineResponse };
+ 'notifications/create': { req: NotificationsCreateRequest; res: EmptyResponse };
+ 'notifications/mark-all-as-read': { req: EmptyRequest; res: EmptyResponse };
+ 'notifications/test-notification': { req: EmptyRequest; res: EmptyResponse };
+ 'pages/create': { req: PagesCreateRequest; res: PagesCreateResponse };
+ 'pages/delete': { req: PagesDeleteRequest; res: EmptyResponse };
+ 'pages/featured': { req: EmptyRequest; res: PagesFeaturedResponse };
+ 'pages/like': { req: PagesLikeRequest; res: EmptyResponse };
+ 'pages/show': { req: PagesShowRequest; res: PagesShowResponse };
+ 'pages/unlike': { req: PagesUnlikeRequest; res: EmptyResponse };
+ 'pages/update': { req: PagesUpdateRequest; res: EmptyResponse };
+ 'flash/create': { req: FlashCreateRequest; res: EmptyResponse };
+ 'flash/delete': { req: FlashDeleteRequest; res: EmptyResponse };
+ 'flash/featured': { req: EmptyRequest; res: FlashFeaturedResponse };
+ 'flash/like': { req: FlashLikeRequest; res: EmptyResponse };
+ 'flash/show': { req: FlashShowRequest; res: FlashShowResponse };
+ 'flash/unlike': { req: FlashUnlikeRequest; res: EmptyResponse };
+ 'flash/update': { req: FlashUpdateRequest; res: EmptyResponse };
+ 'flash/my': { req: FlashMyRequest; res: FlashMyResponse };
+ 'flash/my-likes': { req: FlashMyLikesRequest; res: FlashMyLikesResponse };
+ 'ping': { req: EmptyRequest; res: PingResponse };
+ 'pinned-users': { req: EmptyRequest; res: PinnedUsersResponse };
+ 'promo/read': { req: PromoReadRequest; res: EmptyResponse };
+ 'roles/list': { req: EmptyRequest; res: EmptyResponse };
+ 'roles/show': { req: RolesShowRequest; res: EmptyResponse };
+ 'roles/users': { req: RolesUsersRequest; res: EmptyResponse };
+ 'roles/notes': { req: RolesNotesRequest; res: RolesNotesResponse };
+ 'request-reset-password': { req: RequestResetPasswordRequest; res: EmptyResponse };
+ 'reset-db': { req: EmptyRequest; res: EmptyResponse };
+ 'reset-password': { req: ResetPasswordRequest; res: EmptyResponse };
+ 'server-info': { req: EmptyRequest; res: EmptyResponse };
+ 'stats': { req: EmptyRequest; res: StatsResponse };
+ 'sw/show-registration': { req: SwShowRegistrationRequest; res: SwShowRegistrationResponse };
+ 'sw/update-registration': { req: SwUpdateRegistrationRequest; res: SwUpdateRegistrationResponse };
+ 'sw/register': { req: SwRegisterRequest; res: SwRegisterResponse };
+ 'sw/unregister': { req: SwUnregisterRequest; res: EmptyResponse };
+ 'test': { req: TestRequest; res: EmptyResponse };
+ 'username/available': { req: UsernameAvailableRequest; res: UsernameAvailableResponse };
+ 'users': { req: UsersRequest; res: UsersResponse };
+ 'users/clips': { req: UsersClipsRequest; res: UsersClipsResponse };
+ 'users/followers': { req: UsersFollowersRequest; res: UsersFollowersResponse };
+ 'users/following': { req: UsersFollowingRequest; res: UsersFollowingResponse };
+ 'users/gallery/posts': { req: UsersGalleryPostsRequest; res: UsersGalleryPostsResponse };
+ 'users/get-frequently-replied-users': { req: UsersGetFrequentlyRepliedUsersRequest; res: UsersGetFrequentlyRepliedUsersResponse };
+ 'users/featured-notes': { req: UsersFeaturedNotesRequest; res: UsersFeaturedNotesResponse };
+ 'users/lists/create': { req: UsersListsCreateRequest; res: UsersListsCreateResponse };
+ 'users/lists/delete': { req: UsersListsDeleteRequest; res: EmptyResponse };
+ 'users/lists/list': { req: UsersListsListRequest; res: UsersListsListResponse };
+ 'users/lists/pull': { req: UsersListsPullRequest; res: EmptyResponse };
+ 'users/lists/push': { req: UsersListsPushRequest; res: EmptyResponse };
+ 'users/lists/show': { req: UsersListsShowRequest; res: UsersListsShowResponse };
+ 'users/lists/favorite': { req: UsersListsFavoriteRequest; res: EmptyResponse };
+ 'users/lists/unfavorite': { req: UsersListsUnfavoriteRequest; res: EmptyResponse };
+ 'users/lists/update': { req: UsersListsUpdateRequest; res: UsersListsUpdateResponse };
+ 'users/lists/create-from-public': { req: UsersListsCreateFromPublicRequest; res: UsersListsCreateFromPublicResponse };
+ 'users/lists/update-membership': { req: UsersListsUpdateMembershipRequest; res: EmptyResponse };
+ 'users/lists/get-memberships': { req: UsersListsGetMembershipsRequest; res: EmptyResponse };
+ 'users/notes': { req: UsersNotesRequest; res: UsersNotesResponse };
+ 'users/pages': { req: UsersPagesRequest; res: UsersPagesResponse };
+ 'users/flashs': { req: UsersFlashsRequest; res: UsersFlashsResponse };
+ 'users/reactions': { req: UsersReactionsRequest; res: UsersReactionsResponse };
+ 'users/recommendation': { req: UsersRecommendationRequest; res: UsersRecommendationResponse };
+ 'users/relation': { req: UsersRelationRequest; res: UsersRelationResponse };
+ 'users/report-abuse': { req: UsersReportAbuseRequest; res: EmptyResponse };
+ 'users/search-by-username-and-host': { req: UsersSearchByUsernameAndHostRequest; res: UsersSearchByUsernameAndHostResponse };
+ 'users/search': { req: UsersSearchRequest; res: UsersSearchResponse };
+ 'users/show': { req: UsersShowRequest; res: UsersShowResponse };
+ 'users/achievements': { req: UsersAchievementsRequest; res: EmptyResponse };
+ 'users/update-memo': { req: UsersUpdateMemoRequest; res: EmptyResponse };
+ 'fetch-rss': { req: FetchRssRequest; res: EmptyResponse };
+ 'fetch-external-resources': { req: FetchExternalResourcesRequest; res: EmptyResponse };
+ 'retention': { req: EmptyRequest; res: RetentionResponse };
+}
diff --git a/packages/misskey-js/src/autogen/entities.ts b/packages/misskey-js/src/autogen/entities.ts
new file mode 100644
index 000000000..133a30b4c
--- /dev/null
+++ b/packages/misskey-js/src/autogen/entities.ts
@@ -0,0 +1,478 @@
+/*
+ * version: 2023.11.1
+ * generatedAt: 2023-11-27T02:24:45.111Z
+ */
+
+import { operations } from './types.js';
+
+export type EmptyRequest = Record | undefined;
+export type EmptyResponse = Record | undefined;
+
+export type AdminMetaResponse = operations['admin/meta']['responses']['200']['content']['application/json'];
+export type AdminAbuseUserReportsRequest = operations['admin/abuse-user-reports']['requestBody']['content']['application/json'];
+export type AdminAbuseUserReportsResponse = operations['admin/abuse-user-reports']['responses']['200']['content']['application/json'];
+export type AdminAccountsCreateRequest = operations['admin/accounts/create']['requestBody']['content']['application/json'];
+export type AdminAccountsCreateResponse = operations['admin/accounts/create']['responses']['200']['content']['application/json'];
+export type AdminAccountsDeleteRequest = operations['admin/accounts/delete']['requestBody']['content']['application/json'];
+export type AdminAccountsFindByEmailRequest = operations['admin/accounts/find-by-email']['requestBody']['content']['application/json'];
+export type AdminAdCreateRequest = operations['admin/ad/create']['requestBody']['content']['application/json'];
+export type AdminAdDeleteRequest = operations['admin/ad/delete']['requestBody']['content']['application/json'];
+export type AdminAdListRequest = operations['admin/ad/list']['requestBody']['content']['application/json'];
+export type AdminAdUpdateRequest = operations['admin/ad/update']['requestBody']['content']['application/json'];
+export type AdminAnnouncementsCreateRequest = operations['admin/announcements/create']['requestBody']['content']['application/json'];
+export type AdminAnnouncementsCreateResponse = operations['admin/announcements/create']['responses']['200']['content']['application/json'];
+export type AdminAnnouncementsDeleteRequest = operations['admin/announcements/delete']['requestBody']['content']['application/json'];
+export type AdminAnnouncementsListRequest = operations['admin/announcements/list']['requestBody']['content']['application/json'];
+export type AdminAnnouncementsListResponse = operations['admin/announcements/list']['responses']['200']['content']['application/json'];
+export type AdminAnnouncementsUpdateRequest = operations['admin/announcements/update']['requestBody']['content']['application/json'];
+export type AdminAvatarDecorationsCreateRequest = operations['admin/avatar-decorations/create']['requestBody']['content']['application/json'];
+export type AdminAvatarDecorationsDeleteRequest = operations['admin/avatar-decorations/delete']['requestBody']['content']['application/json'];
+export type AdminAvatarDecorationsListRequest = operations['admin/avatar-decorations/list']['requestBody']['content']['application/json'];
+export type AdminAvatarDecorationsListResponse = operations['admin/avatar-decorations/list']['responses']['200']['content']['application/json'];
+export type AdminAvatarDecorationsUpdateRequest = operations['admin/avatar-decorations/update']['requestBody']['content']['application/json'];
+export type AdminDeleteAllFilesOfAUserRequest = operations['admin/delete-all-files-of-a-user']['requestBody']['content']['application/json'];
+export type AdminUnsetUserAvatarRequest = operations['admin/unset-user-avatar']['requestBody']['content']['application/json'];
+export type AdminUnsetUserBannerRequest = operations['admin/unset-user-banner']['requestBody']['content']['application/json'];
+export type AdminDriveFilesRequest = operations['admin/drive/files']['requestBody']['content']['application/json'];
+export type AdminDriveFilesResponse = operations['admin/drive/files']['responses']['200']['content']['application/json'];
+export type AdminDriveShowFileRequest = operations['admin/drive/show-file']['requestBody']['content']['application/json'];
+export type AdminDriveShowFileResponse = operations['admin/drive/show-file']['responses']['200']['content']['application/json'];
+export type AdminEmojiAddAliasesBulkRequest = operations['admin/emoji/add-aliases-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiAddRequest = operations['admin/emoji/add']['requestBody']['content']['application/json'];
+export type AdminEmojiCopyRequest = operations['admin/emoji/copy']['requestBody']['content']['application/json'];
+export type AdminEmojiCopyResponse = operations['admin/emoji/copy']['responses']['200']['content']['application/json'];
+export type AdminEmojiDeleteBulkRequest = operations['admin/emoji/delete-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiDeleteRequest = operations['admin/emoji/delete']['requestBody']['content']['application/json'];
+export type AdminEmojiListRemoteRequest = operations['admin/emoji/list-remote']['requestBody']['content']['application/json'];
+export type AdminEmojiListRemoteResponse = operations['admin/emoji/list-remote']['responses']['200']['content']['application/json'];
+export type AdminEmojiListRequest = operations['admin/emoji/list']['requestBody']['content']['application/json'];
+export type AdminEmojiListResponse = operations['admin/emoji/list']['responses']['200']['content']['application/json'];
+export type AdminEmojiRemoveAliasesBulkRequest = operations['admin/emoji/remove-aliases-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiSetAliasesBulkRequest = operations['admin/emoji/set-aliases-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiSetCategoryBulkRequest = operations['admin/emoji/set-category-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiSetLicenseBulkRequest = operations['admin/emoji/set-license-bulk']['requestBody']['content']['application/json'];
+export type AdminEmojiUpdateRequest = operations['admin/emoji/update']['requestBody']['content']['application/json'];
+export type AdminFederationDeleteAllFilesRequest = operations['admin/federation/delete-all-files']['requestBody']['content']['application/json'];
+export type AdminFederationRefreshRemoteInstanceMetadataRequest = operations['admin/federation/refresh-remote-instance-metadata']['requestBody']['content']['application/json'];
+export type AdminFederationRemoveAllFollowingRequest = operations['admin/federation/remove-all-following']['requestBody']['content']['application/json'];
+export type AdminFederationUpdateInstanceRequest = operations['admin/federation/update-instance']['requestBody']['content']['application/json'];
+export type AdminGetTableStatsResponse = operations['admin/get-table-stats']['responses']['200']['content']['application/json'];
+export type AdminGetUserIpsRequest = operations['admin/get-user-ips']['requestBody']['content']['application/json'];
+export type AdminInviteCreateRequest = operations['admin/invite/create']['requestBody']['content']['application/json'];
+export type AdminInviteCreateResponse = operations['admin/invite/create']['responses']['200']['content']['application/json'];
+export type AdminInviteListRequest = operations['admin/invite/list']['requestBody']['content']['application/json'];
+export type AdminInviteListResponse = operations['admin/invite/list']['responses']['200']['content']['application/json'];
+export type AdminPromoCreateRequest = operations['admin/promo/create']['requestBody']['content']['application/json'];
+export type AdminQueueDeliverDelayedResponse = operations['admin/queue/deliver-delayed']['responses']['200']['content']['application/json'];
+export type AdminQueueInboxDelayedResponse = operations['admin/queue/inbox-delayed']['responses']['200']['content']['application/json'];
+export type AdminQueuePromoteRequest = operations['admin/queue/promote']['requestBody']['content']['application/json'];
+export type AdminQueueStatsResponse = operations['admin/queue/stats']['responses']['200']['content']['application/json'];
+export type AdminRelaysAddRequest = operations['admin/relays/add']['requestBody']['content']['application/json'];
+export type AdminRelaysAddResponse = operations['admin/relays/add']['responses']['200']['content']['application/json'];
+export type AdminRelaysListResponse = operations['admin/relays/list']['responses']['200']['content']['application/json'];
+export type AdminRelaysRemoveRequest = operations['admin/relays/remove']['requestBody']['content']['application/json'];
+export type AdminResetPasswordRequest = operations['admin/reset-password']['requestBody']['content']['application/json'];
+export type AdminResetPasswordResponse = operations['admin/reset-password']['responses']['200']['content']['application/json'];
+export type AdminResolveAbuseUserReportRequest = operations['admin/resolve-abuse-user-report']['requestBody']['content']['application/json'];
+export type AdminSendEmailRequest = operations['admin/send-email']['requestBody']['content']['application/json'];
+export type AdminServerInfoResponse = operations['admin/server-info']['responses']['200']['content']['application/json'];
+export type AdminShowModerationLogsRequest = operations['admin/show-moderation-logs']['requestBody']['content']['application/json'];
+export type AdminShowModerationLogsResponse = operations['admin/show-moderation-logs']['responses']['200']['content']['application/json'];
+export type AdminShowUserRequest = operations['admin/show-user']['requestBody']['content']['application/json'];
+export type AdminShowUserResponse = operations['admin/show-user']['responses']['200']['content']['application/json'];
+export type AdminShowUsersRequest = operations['admin/show-users']['requestBody']['content']['application/json'];
+export type AdminShowUsersResponse = operations['admin/show-users']['responses']['200']['content']['application/json'];
+export type AdminSuspendUserRequest = operations['admin/suspend-user']['requestBody']['content']['application/json'];
+export type AdminUnsuspendUserRequest = operations['admin/unsuspend-user']['requestBody']['content']['application/json'];
+export type AdminUpdateMetaRequest = operations['admin/update-meta']['requestBody']['content']['application/json'];
+export type AdminDeleteAccountRequest = operations['admin/delete-account']['requestBody']['content']['application/json'];
+export type AdminDeleteAccountResponse = operations['admin/delete-account']['responses']['200']['content']['application/json'];
+export type AdminUpdateUserNoteRequest = operations['admin/update-user-note']['requestBody']['content']['application/json'];
+export type AdminRolesCreateRequest = operations['admin/roles/create']['requestBody']['content']['application/json'];
+export type AdminRolesDeleteRequest = operations['admin/roles/delete']['requestBody']['content']['application/json'];
+export type AdminRolesShowRequest = operations['admin/roles/show']['requestBody']['content']['application/json'];
+export type AdminRolesUpdateRequest = operations['admin/roles/update']['requestBody']['content']['application/json'];
+export type AdminRolesAssignRequest = operations['admin/roles/assign']['requestBody']['content']['application/json'];
+export type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
+export type AdminRolesUpdateDefaultPoliciesRequest = operations['admin/roles/update-default-policies']['requestBody']['content']['application/json'];
+export type AdminRolesUsersRequest = operations['admin/roles/users']['requestBody']['content']['application/json'];
+export type AnnouncementsRequest = operations['announcements']['requestBody']['content']['application/json'];
+export type AnnouncementsResponse = operations['announcements']['responses']['200']['content']['application/json'];
+export type AntennasCreateRequest = operations['antennas/create']['requestBody']['content']['application/json'];
+export type AntennasCreateResponse = operations['antennas/create']['responses']['200']['content']['application/json'];
+export type AntennasDeleteRequest = operations['antennas/delete']['requestBody']['content']['application/json'];
+export type AntennasListResponse = operations['antennas/list']['responses']['200']['content']['application/json'];
+export type AntennasNotesRequest = operations['antennas/notes']['requestBody']['content']['application/json'];
+export type AntennasNotesResponse = operations['antennas/notes']['responses']['200']['content']['application/json'];
+export type AntennasShowRequest = operations['antennas/show']['requestBody']['content']['application/json'];
+export type AntennasShowResponse = operations['antennas/show']['responses']['200']['content']['application/json'];
+export type AntennasUpdateRequest = operations['antennas/update']['requestBody']['content']['application/json'];
+export type AntennasUpdateResponse = operations['antennas/update']['responses']['200']['content']['application/json'];
+export type ApGetRequest = operations['ap/get']['requestBody']['content']['application/json'];
+export type ApGetResponse = operations['ap/get']['responses']['200']['content']['application/json'];
+export type ApShowRequest = operations['ap/show']['requestBody']['content']['application/json'];
+export type ApShowResponse = operations['ap/show']['responses']['200']['content']['application/json'];
+export type AppCreateRequest = operations['app/create']['requestBody']['content']['application/json'];
+export type AppCreateResponse = operations['app/create']['responses']['200']['content']['application/json'];
+export type AppShowRequest = operations['app/show']['requestBody']['content']['application/json'];
+export type AppShowResponse = operations['app/show']['responses']['200']['content']['application/json'];
+export type AuthSessionGenerateRequest = operations['auth/session/generate']['requestBody']['content']['application/json'];
+export type AuthSessionGenerateResponse = operations['auth/session/generate']['responses']['200']['content']['application/json'];
+export type AuthSessionShowRequest = operations['auth/session/show']['requestBody']['content']['application/json'];
+export type AuthSessionShowResponse = operations['auth/session/show']['responses']['200']['content']['application/json'];
+export type AuthSessionUserkeyRequest = operations['auth/session/userkey']['requestBody']['content']['application/json'];
+export type AuthSessionUserkeyResponse = operations['auth/session/userkey']['responses']['200']['content']['application/json'];
+export type BlockingCreateRequest = operations['blocking/create']['requestBody']['content']['application/json'];
+export type BlockingCreateResponse = operations['blocking/create']['responses']['200']['content']['application/json'];
+export type BlockingDeleteRequest = operations['blocking/delete']['requestBody']['content']['application/json'];
+export type BlockingDeleteResponse = operations['blocking/delete']['responses']['200']['content']['application/json'];
+export type BlockingListRequest = operations['blocking/list']['requestBody']['content']['application/json'];
+export type BlockingListResponse = operations['blocking/list']['responses']['200']['content']['application/json'];
+export type ChannelsCreateRequest = operations['channels/create']['requestBody']['content']['application/json'];
+export type ChannelsCreateResponse = operations['channels/create']['responses']['200']['content']['application/json'];
+export type ChannelsFeaturedResponse = operations['channels/featured']['responses']['200']['content']['application/json'];
+export type ChannelsFollowRequest = operations['channels/follow']['requestBody']['content']['application/json'];
+export type ChannelsFollowedRequest = operations['channels/followed']['requestBody']['content']['application/json'];
+export type ChannelsFollowedResponse = operations['channels/followed']['responses']['200']['content']['application/json'];
+export type ChannelsOwnedRequest = operations['channels/owned']['requestBody']['content']['application/json'];
+export type ChannelsOwnedResponse = operations['channels/owned']['responses']['200']['content']['application/json'];
+export type ChannelsShowRequest = operations['channels/show']['requestBody']['content']['application/json'];
+export type ChannelsShowResponse = operations['channels/show']['responses']['200']['content']['application/json'];
+export type ChannelsTimelineRequest = operations['channels/timeline']['requestBody']['content']['application/json'];
+export type ChannelsTimelineResponse = operations['channels/timeline']['responses']['200']['content']['application/json'];
+export type ChannelsUnfollowRequest = operations['channels/unfollow']['requestBody']['content']['application/json'];
+export type ChannelsUpdateRequest = operations['channels/update']['requestBody']['content']['application/json'];
+export type ChannelsUpdateResponse = operations['channels/update']['responses']['200']['content']['application/json'];
+export type ChannelsFavoriteRequest = operations['channels/favorite']['requestBody']['content']['application/json'];
+export type ChannelsUnfavoriteRequest = operations['channels/unfavorite']['requestBody']['content']['application/json'];
+export type ChannelsMyFavoritesResponse = operations['channels/my-favorites']['responses']['200']['content']['application/json'];
+export type ChannelsSearchRequest = operations['channels/search']['requestBody']['content']['application/json'];
+export type ChannelsSearchResponse = operations['channels/search']['responses']['200']['content']['application/json'];
+export type ChartsActiveUsersRequest = operations['charts/active-users']['requestBody']['content']['application/json'];
+export type ChartsActiveUsersResponse = operations['charts/active-users']['responses']['200']['content']['application/json'];
+export type ChartsApRequestRequest = operations['charts/ap-request']['requestBody']['content']['application/json'];
+export type ChartsApRequestResponse = operations['charts/ap-request']['responses']['200']['content']['application/json'];
+export type ChartsDriveRequest = operations['charts/drive']['requestBody']['content']['application/json'];
+export type ChartsDriveResponse = operations['charts/drive']['responses']['200']['content']['application/json'];
+export type ChartsFederationRequest = operations['charts/federation']['requestBody']['content']['application/json'];
+export type ChartsFederationResponse = operations['charts/federation']['responses']['200']['content']['application/json'];
+export type ChartsInstanceRequest = operations['charts/instance']['requestBody']['content']['application/json'];
+export type ChartsInstanceResponse = operations['charts/instance']['responses']['200']['content']['application/json'];
+export type ChartsNotesRequest = operations['charts/notes']['requestBody']['content']['application/json'];
+export type ChartsNotesResponse = operations['charts/notes']['responses']['200']['content']['application/json'];
+export type ChartsUserDriveRequest = operations['charts/user/drive']['requestBody']['content']['application/json'];
+export type ChartsUserDriveResponse = operations['charts/user/drive']['responses']['200']['content']['application/json'];
+export type ChartsUserFollowingRequest = operations['charts/user/following']['requestBody']['content']['application/json'];
+export type ChartsUserFollowingResponse = operations['charts/user/following']['responses']['200']['content']['application/json'];
+export type ChartsUserNotesRequest = operations['charts/user/notes']['requestBody']['content']['application/json'];
+export type ChartsUserNotesResponse = operations['charts/user/notes']['responses']['200']['content']['application/json'];
+export type ChartsUserPvRequest = operations['charts/user/pv']['requestBody']['content']['application/json'];
+export type ChartsUserPvResponse = operations['charts/user/pv']['responses']['200']['content']['application/json'];
+export type ChartsUserReactionsRequest = operations['charts/user/reactions']['requestBody']['content']['application/json'];
+export type ChartsUserReactionsResponse = operations['charts/user/reactions']['responses']['200']['content']['application/json'];
+export type ChartsUsersRequest = operations['charts/users']['requestBody']['content']['application/json'];
+export type ChartsUsersResponse = operations['charts/users']['responses']['200']['content']['application/json'];
+export type ClipsAddNoteRequest = operations['clips/add-note']['requestBody']['content']['application/json'];
+export type ClipsRemoveNoteRequest = operations['clips/remove-note']['requestBody']['content']['application/json'];
+export type ClipsCreateRequest = operations['clips/create']['requestBody']['content']['application/json'];
+export type ClipsCreateResponse = operations['clips/create']['responses']['200']['content']['application/json'];
+export type ClipsDeleteRequest = operations['clips/delete']['requestBody']['content']['application/json'];
+export type ClipsListResponse = operations['clips/list']['responses']['200']['content']['application/json'];
+export type ClipsNotesRequest = operations['clips/notes']['requestBody']['content']['application/json'];
+export type ClipsNotesResponse = operations['clips/notes']['responses']['200']['content']['application/json'];
+export type ClipsShowRequest = operations['clips/show']['requestBody']['content']['application/json'];
+export type ClipsShowResponse = operations['clips/show']['responses']['200']['content']['application/json'];
+export type ClipsUpdateRequest = operations['clips/update']['requestBody']['content']['application/json'];
+export type ClipsUpdateResponse = operations['clips/update']['responses']['200']['content']['application/json'];
+export type ClipsFavoriteRequest = operations['clips/favorite']['requestBody']['content']['application/json'];
+export type ClipsUnfavoriteRequest = operations['clips/unfavorite']['requestBody']['content']['application/json'];
+export type ClipsMyFavoritesResponse = operations['clips/my-favorites']['responses']['200']['content']['application/json'];
+export type DriveResponse = operations['drive']['responses']['200']['content']['application/json'];
+export type DriveFilesRequest = operations['drive/files']['requestBody']['content']['application/json'];
+export type DriveFilesResponse = operations['drive/files']['responses']['200']['content']['application/json'];
+export type DriveFilesAttachedNotesRequest = operations['drive/files/attached-notes']['requestBody']['content']['application/json'];
+export type DriveFilesAttachedNotesResponse = operations['drive/files/attached-notes']['responses']['200']['content']['application/json'];
+export type DriveFilesCheckExistenceRequest = operations['drive/files/check-existence']['requestBody']['content']['application/json'];
+export type DriveFilesCheckExistenceResponse = operations['drive/files/check-existence']['responses']['200']['content']['application/json'];
+export type DriveFilesCreateRequest = operations['drive/files/create']['requestBody']['content']['multipart/form-data'];
+export type DriveFilesCreateResponse = operations['drive/files/create']['responses']['200']['content']['application/json'];
+export type DriveFilesDeleteRequest = operations['drive/files/delete']['requestBody']['content']['application/json'];
+export type DriveFilesFindByHashRequest = operations['drive/files/find-by-hash']['requestBody']['content']['application/json'];
+export type DriveFilesFindByHashResponse = operations['drive/files/find-by-hash']['responses']['200']['content']['application/json'];
+export type DriveFilesFindRequest = operations['drive/files/find']['requestBody']['content']['application/json'];
+export type DriveFilesFindResponse = operations['drive/files/find']['responses']['200']['content']['application/json'];
+export type DriveFilesShowRequest = operations['drive/files/show']['requestBody']['content']['application/json'];
+export type DriveFilesShowResponse = operations['drive/files/show']['responses']['200']['content']['application/json'];
+export type DriveFilesUpdateRequest = operations['drive/files/update']['requestBody']['content']['application/json'];
+export type DriveFilesUpdateResponse = operations['drive/files/update']['responses']['200']['content']['application/json'];
+export type DriveFilesUploadFromUrlRequest = operations['drive/files/upload-from-url']['requestBody']['content']['application/json'];
+export type DriveFoldersRequest = operations['drive/folders']['requestBody']['content']['application/json'];
+export type DriveFoldersResponse = operations['drive/folders']['responses']['200']['content']['application/json'];
+export type DriveFoldersCreateRequest = operations['drive/folders/create']['requestBody']['content']['application/json'];
+export type DriveFoldersCreateResponse = operations['drive/folders/create']['responses']['200']['content']['application/json'];
+export type DriveFoldersDeleteRequest = operations['drive/folders/delete']['requestBody']['content']['application/json'];
+export type DriveFoldersFindRequest = operations['drive/folders/find']['requestBody']['content']['application/json'];
+export type DriveFoldersFindResponse = operations['drive/folders/find']['responses']['200']['content']['application/json'];
+export type DriveFoldersShowRequest = operations['drive/folders/show']['requestBody']['content']['application/json'];
+export type DriveFoldersShowResponse = operations['drive/folders/show']['responses']['200']['content']['application/json'];
+export type DriveFoldersUpdateRequest = operations['drive/folders/update']['requestBody']['content']['application/json'];
+export type DriveFoldersUpdateResponse = operations['drive/folders/update']['responses']['200']['content']['application/json'];
+export type DriveStreamRequest = operations['drive/stream']['requestBody']['content']['application/json'];
+export type DriveStreamResponse = operations['drive/stream']['responses']['200']['content']['application/json'];
+export type EmailAddressAvailableRequest = operations['email-address/available']['requestBody']['content']['application/json'];
+export type EmailAddressAvailableResponse = operations['email-address/available']['responses']['200']['content']['application/json'];
+export type EndpointRequest = operations['endpoint']['requestBody']['content']['application/json'];
+export type EndpointsResponse = operations['endpoints']['responses']['200']['content']['application/json'];
+export type FederationFollowersRequest = operations['federation/followers']['requestBody']['content']['application/json'];
+export type FederationFollowersResponse = operations['federation/followers']['responses']['200']['content']['application/json'];
+export type FederationFollowingRequest = operations['federation/following']['requestBody']['content']['application/json'];
+export type FederationFollowingResponse = operations['federation/following']['responses']['200']['content']['application/json'];
+export type FederationInstancesRequest = operations['federation/instances']['requestBody']['content']['application/json'];
+export type FederationInstancesResponse = operations['federation/instances']['responses']['200']['content']['application/json'];
+export type FederationShowInstanceRequest = operations['federation/show-instance']['requestBody']['content']['application/json'];
+export type FederationShowInstanceResponse = operations['federation/show-instance']['responses']['200']['content']['application/json'];
+export type FederationUpdateRemoteUserRequest = operations['federation/update-remote-user']['requestBody']['content']['application/json'];
+export type FederationUsersRequest = operations['federation/users']['requestBody']['content']['application/json'];
+export type FederationUsersResponse = operations['federation/users']['responses']['200']['content']['application/json'];
+export type FederationStatsRequest = operations['federation/stats']['requestBody']['content']['application/json'];
+export type FollowingCreateRequest = operations['following/create']['requestBody']['content']['application/json'];
+export type FollowingCreateResponse = operations['following/create']['responses']['200']['content']['application/json'];
+export type FollowingDeleteRequest = operations['following/delete']['requestBody']['content']['application/json'];
+export type FollowingDeleteResponse = operations['following/delete']['responses']['200']['content']['application/json'];
+export type FollowingUpdateRequest = operations['following/update']['requestBody']['content']['application/json'];
+export type FollowingUpdateResponse = operations['following/update']['responses']['200']['content']['application/json'];
+export type FollowingUpdateAllRequest = operations['following/update-all']['requestBody']['content']['application/json'];
+export type FollowingInvalidateRequest = operations['following/invalidate']['requestBody']['content']['application/json'];
+export type FollowingInvalidateResponse = operations['following/invalidate']['responses']['200']['content']['application/json'];
+export type FollowingRequestsAcceptRequest = operations['following/requests/accept']['requestBody']['content']['application/json'];
+export type FollowingRequestsCancelRequest = operations['following/requests/cancel']['requestBody']['content']['application/json'];
+export type FollowingRequestsCancelResponse = operations['following/requests/cancel']['responses']['200']['content']['application/json'];
+export type FollowingRequestsListRequest = operations['following/requests/list']['requestBody']['content']['application/json'];
+export type FollowingRequestsListResponse = operations['following/requests/list']['responses']['200']['content']['application/json'];
+export type FollowingRequestsRejectRequest = operations['following/requests/reject']['requestBody']['content']['application/json'];
+export type GalleryFeaturedRequest = operations['gallery/featured']['requestBody']['content']['application/json'];
+export type GalleryFeaturedResponse = operations['gallery/featured']['responses']['200']['content']['application/json'];
+export type GalleryPopularResponse = operations['gallery/popular']['responses']['200']['content']['application/json'];
+export type GalleryPostsRequest = operations['gallery/posts']['requestBody']['content']['application/json'];
+export type GalleryPostsResponse = operations['gallery/posts']['responses']['200']['content']['application/json'];
+export type GalleryPostsCreateRequest = operations['gallery/posts/create']['requestBody']['content']['application/json'];
+export type GalleryPostsCreateResponse = operations['gallery/posts/create']['responses']['200']['content']['application/json'];
+export type GalleryPostsDeleteRequest = operations['gallery/posts/delete']['requestBody']['content']['application/json'];
+export type GalleryPostsLikeRequest = operations['gallery/posts/like']['requestBody']['content']['application/json'];
+export type GalleryPostsShowRequest = operations['gallery/posts/show']['requestBody']['content']['application/json'];
+export type GalleryPostsShowResponse = operations['gallery/posts/show']['responses']['200']['content']['application/json'];
+export type GalleryPostsUnlikeRequest = operations['gallery/posts/unlike']['requestBody']['content']['application/json'];
+export type GalleryPostsUpdateRequest = operations['gallery/posts/update']['requestBody']['content']['application/json'];
+export type GalleryPostsUpdateResponse = operations['gallery/posts/update']['responses']['200']['content']['application/json'];
+export type GetAvatarDecorationsResponse = operations['get-avatar-decorations']['responses']['200']['content']['application/json'];
+export type HashtagsListRequest = operations['hashtags/list']['requestBody']['content']['application/json'];
+export type HashtagsListResponse = operations['hashtags/list']['responses']['200']['content']['application/json'];
+export type HashtagsSearchRequest = operations['hashtags/search']['requestBody']['content']['application/json'];
+export type HashtagsSearchResponse = operations['hashtags/search']['responses']['200']['content']['application/json'];
+export type HashtagsShowRequest = operations['hashtags/show']['requestBody']['content']['application/json'];
+export type HashtagsShowResponse = operations['hashtags/show']['responses']['200']['content']['application/json'];
+export type HashtagsTrendResponse = operations['hashtags/trend']['responses']['200']['content']['application/json'];
+export type HashtagsUsersRequest = operations['hashtags/users']['requestBody']['content']['application/json'];
+export type HashtagsUsersResponse = operations['hashtags/users']['responses']['200']['content']['application/json'];
+export type IResponse = operations['i']['responses']['200']['content']['application/json'];
+export type IClaimAchievementRequest = operations['i/claim-achievement']['requestBody']['content']['application/json'];
+export type IFavoritesRequest = operations['i/favorites']['requestBody']['content']['application/json'];
+export type IFavoritesResponse = operations['i/favorites']['responses']['200']['content']['application/json'];
+export type IGalleryLikesRequest = operations['i/gallery/likes']['requestBody']['content']['application/json'];
+export type IGalleryLikesResponse = operations['i/gallery/likes']['responses']['200']['content']['application/json'];
+export type IGalleryPostsRequest = operations['i/gallery/posts']['requestBody']['content']['application/json'];
+export type IGalleryPostsResponse = operations['i/gallery/posts']['responses']['200']['content']['application/json'];
+export type INotificationsRequest = operations['i/notifications']['requestBody']['content']['application/json'];
+export type INotificationsResponse = operations['i/notifications']['responses']['200']['content']['application/json'];
+export type INotificationsGroupedRequest = operations['i/notifications-grouped']['requestBody']['content']['application/json'];
+export type INotificationsGroupedResponse = operations['i/notifications-grouped']['responses']['200']['content']['application/json'];
+export type IPageLikesRequest = operations['i/page-likes']['requestBody']['content']['application/json'];
+export type IPageLikesResponse = operations['i/page-likes']['responses']['200']['content']['application/json'];
+export type IPagesRequest = operations['i/pages']['requestBody']['content']['application/json'];
+export type IPagesResponse = operations['i/pages']['responses']['200']['content']['application/json'];
+export type IPinRequest = operations['i/pin']['requestBody']['content']['application/json'];
+export type IPinResponse = operations['i/pin']['responses']['200']['content']['application/json'];
+export type IReadAnnouncementRequest = operations['i/read-announcement']['requestBody']['content']['application/json'];
+export type IRegistryGetAllRequest = operations['i/registry/get-all']['requestBody']['content']['application/json'];
+export type IRegistryGetDetailRequest = operations['i/registry/get-detail']['requestBody']['content']['application/json'];
+export type IRegistryGetRequest = operations['i/registry/get']['requestBody']['content']['application/json'];
+export type IRegistryKeysWithTypeRequest = operations['i/registry/keys-with-type']['requestBody']['content']['application/json'];
+export type IRegistryKeysRequest = operations['i/registry/keys']['requestBody']['content']['application/json'];
+export type IRegistryRemoveRequest = operations['i/registry/remove']['requestBody']['content']['application/json'];
+export type IRegistrySetRequest = operations['i/registry/set']['requestBody']['content']['application/json'];
+export type IUnpinRequest = operations['i/unpin']['requestBody']['content']['application/json'];
+export type IUnpinResponse = operations['i/unpin']['responses']['200']['content']['application/json'];
+export type IUpdateRequest = operations['i/update']['requestBody']['content']['application/json'];
+export type IUpdateResponse = operations['i/update']['responses']['200']['content']['application/json'];
+export type IWebhooksCreateRequest = operations['i/webhooks/create']['requestBody']['content']['application/json'];
+export type IWebhooksShowRequest = operations['i/webhooks/show']['requestBody']['content']['application/json'];
+export type IWebhooksUpdateRequest = operations['i/webhooks/update']['requestBody']['content']['application/json'];
+export type IWebhooksDeleteRequest = operations['i/webhooks/delete']['requestBody']['content']['application/json'];
+export type InviteCreateResponse = operations['invite/create']['responses']['200']['content']['application/json'];
+export type InviteDeleteRequest = operations['invite/delete']['requestBody']['content']['application/json'];
+export type InviteListRequest = operations['invite/list']['requestBody']['content']['application/json'];
+export type InviteListResponse = operations['invite/list']['responses']['200']['content']['application/json'];
+export type InviteLimitResponse = operations['invite/limit']['responses']['200']['content']['application/json'];
+export type MetaRequest = operations['meta']['requestBody']['content']['application/json'];
+export type MetaResponse = operations['meta']['responses']['200']['content']['application/json'];
+export type EmojisResponse = operations['emojis']['responses']['200']['content']['application/json'];
+export type EmojiRequest = operations['emoji']['requestBody']['content']['application/json'];
+export type EmojiResponse = operations['emoji']['responses']['200']['content']['application/json'];
+export type MuteCreateRequest = operations['mute/create']['requestBody']['content']['application/json'];
+export type MuteDeleteRequest = operations['mute/delete']['requestBody']['content']['application/json'];
+export type MuteListRequest = operations['mute/list']['requestBody']['content']['application/json'];
+export type MuteListResponse = operations['mute/list']['responses']['200']['content']['application/json'];
+export type RenoteMuteCreateRequest = operations['renote-mute/create']['requestBody']['content']['application/json'];
+export type RenoteMuteDeleteRequest = operations['renote-mute/delete']['requestBody']['content']['application/json'];
+export type RenoteMuteListRequest = operations['renote-mute/list']['requestBody']['content']['application/json'];
+export type RenoteMuteListResponse = operations['renote-mute/list']['responses']['200']['content']['application/json'];
+export type MyAppsRequest = operations['my/apps']['requestBody']['content']['application/json'];
+export type MyAppsResponse = operations['my/apps']['responses']['200']['content']['application/json'];
+export type NotesRequest = operations['notes']['requestBody']['content']['application/json'];
+export type NotesResponse = operations['notes']['responses']['200']['content']['application/json'];
+export type NotesChildrenRequest = operations['notes/children']['requestBody']['content']['application/json'];
+export type NotesChildrenResponse = operations['notes/children']['responses']['200']['content']['application/json'];
+export type NotesClipsRequest = operations['notes/clips']['requestBody']['content']['application/json'];
+export type NotesClipsResponse = operations['notes/clips']['responses']['200']['content']['application/json'];
+export type NotesConversationRequest = operations['notes/conversation']['requestBody']['content']['application/json'];
+export type NotesConversationResponse = operations['notes/conversation']['responses']['200']['content']['application/json'];
+export type NotesCreateRequest = operations['notes/create']['requestBody']['content']['application/json'];
+export type NotesCreateResponse = operations['notes/create']['responses']['200']['content']['application/json'];
+export type NotesDeleteRequest = operations['notes/delete']['requestBody']['content']['application/json'];
+export type NotesFavoritesCreateRequest = operations['notes/favorites/create']['requestBody']['content']['application/json'];
+export type NotesFavoritesDeleteRequest = operations['notes/favorites/delete']['requestBody']['content']['application/json'];
+export type NotesFeaturedRequest = operations['notes/featured']['requestBody']['content']['application/json'];
+export type NotesFeaturedResponse = operations['notes/featured']['responses']['200']['content']['application/json'];
+export type NotesGlobalTimelineRequest = operations['notes/global-timeline']['requestBody']['content']['application/json'];
+export type NotesGlobalTimelineResponse = operations['notes/global-timeline']['responses']['200']['content']['application/json'];
+export type NotesHybridTimelineRequest = operations['notes/hybrid-timeline']['requestBody']['content']['application/json'];
+export type NotesHybridTimelineResponse = operations['notes/hybrid-timeline']['responses']['200']['content']['application/json'];
+export type NotesLocalTimelineRequest = operations['notes/local-timeline']['requestBody']['content']['application/json'];
+export type NotesLocalTimelineResponse = operations['notes/local-timeline']['responses']['200']['content']['application/json'];
+export type NotesMentionsRequest = operations['notes/mentions']['requestBody']['content']['application/json'];
+export type NotesMentionsResponse = operations['notes/mentions']['responses']['200']['content']['application/json'];
+export type NotesPollsRecommendationRequest = operations['notes/polls/recommendation']['requestBody']['content']['application/json'];
+export type NotesPollsRecommendationResponse = operations['notes/polls/recommendation']['responses']['200']['content']['application/json'];
+export type NotesPollsVoteRequest = operations['notes/polls/vote']['requestBody']['content']['application/json'];
+export type NotesReactionsRequest = operations['notes/reactions']['requestBody']['content']['application/json'];
+export type NotesReactionsResponse = operations['notes/reactions']['responses']['200']['content']['application/json'];
+export type NotesReactionsCreateRequest = operations['notes/reactions/create']['requestBody']['content']['application/json'];
+export type NotesReactionsDeleteRequest = operations['notes/reactions/delete']['requestBody']['content']['application/json'];
+export type NotesRenotesRequest = operations['notes/renotes']['requestBody']['content']['application/json'];
+export type NotesRenotesResponse = operations['notes/renotes']['responses']['200']['content']['application/json'];
+export type NotesRepliesRequest = operations['notes/replies']['requestBody']['content']['application/json'];
+export type NotesRepliesResponse = operations['notes/replies']['responses']['200']['content']['application/json'];
+export type NotesSearchByTagRequest = operations['notes/search-by-tag']['requestBody']['content']['application/json'];
+export type NotesSearchByTagResponse = operations['notes/search-by-tag']['responses']['200']['content']['application/json'];
+export type NotesSearchRequest = operations['notes/search']['requestBody']['content']['application/json'];
+export type NotesSearchResponse = operations['notes/search']['responses']['200']['content']['application/json'];
+export type NotesShowRequest = operations['notes/show']['requestBody']['content']['application/json'];
+export type NotesShowResponse = operations['notes/show']['responses']['200']['content']['application/json'];
+export type NotesStateRequest = operations['notes/state']['requestBody']['content']['application/json'];
+export type NotesStateResponse = operations['notes/state']['responses']['200']['content']['application/json'];
+export type NotesThreadMutingCreateRequest = operations['notes/thread-muting/create']['requestBody']['content']['application/json'];
+export type NotesThreadMutingDeleteRequest = operations['notes/thread-muting/delete']['requestBody']['content']['application/json'];
+export type NotesTimelineRequest = operations['notes/timeline']['requestBody']['content']['application/json'];
+export type NotesTimelineResponse = operations['notes/timeline']['responses']['200']['content']['application/json'];
+export type NotesTranslateRequest = operations['notes/translate']['requestBody']['content']['application/json'];
+export type NotesTranslateResponse = operations['notes/translate']['responses']['200']['content']['application/json'];
+export type NotesUnrenoteRequest = operations['notes/unrenote']['requestBody']['content']['application/json'];
+export type NotesUserListTimelineRequest = operations['notes/user-list-timeline']['requestBody']['content']['application/json'];
+export type NotesUserListTimelineResponse = operations['notes/user-list-timeline']['responses']['200']['content']['application/json'];
+export type NotificationsCreateRequest = operations['notifications/create']['requestBody']['content']['application/json'];
+export type PagesCreateRequest = operations['pages/create']['requestBody']['content']['application/json'];
+export type PagesCreateResponse = operations['pages/create']['responses']['200']['content']['application/json'];
+export type PagesDeleteRequest = operations['pages/delete']['requestBody']['content']['application/json'];
+export type PagesFeaturedResponse = operations['pages/featured']['responses']['200']['content']['application/json'];
+export type PagesLikeRequest = operations['pages/like']['requestBody']['content']['application/json'];
+export type PagesShowRequest = operations['pages/show']['requestBody']['content']['application/json'];
+export type PagesShowResponse = operations['pages/show']['responses']['200']['content']['application/json'];
+export type PagesUnlikeRequest = operations['pages/unlike']['requestBody']['content']['application/json'];
+export type PagesUpdateRequest = operations['pages/update']['requestBody']['content']['application/json'];
+export type FlashCreateRequest = operations['flash/create']['requestBody']['content']['application/json'];
+export type FlashDeleteRequest = operations['flash/delete']['requestBody']['content']['application/json'];
+export type FlashFeaturedResponse = operations['flash/featured']['responses']['200']['content']['application/json'];
+export type FlashLikeRequest = operations['flash/like']['requestBody']['content']['application/json'];
+export type FlashShowRequest = operations['flash/show']['requestBody']['content']['application/json'];
+export type FlashShowResponse = operations['flash/show']['responses']['200']['content']['application/json'];
+export type FlashUnlikeRequest = operations['flash/unlike']['requestBody']['content']['application/json'];
+export type FlashUpdateRequest = operations['flash/update']['requestBody']['content']['application/json'];
+export type FlashMyRequest = operations['flash/my']['requestBody']['content']['application/json'];
+export type FlashMyResponse = operations['flash/my']['responses']['200']['content']['application/json'];
+export type FlashMyLikesRequest = operations['flash/my-likes']['requestBody']['content']['application/json'];
+export type FlashMyLikesResponse = operations['flash/my-likes']['responses']['200']['content']['application/json'];
+export type PingResponse = operations['ping']['responses']['200']['content']['application/json'];
+export type PinnedUsersResponse = operations['pinned-users']['responses']['200']['content']['application/json'];
+export type PromoReadRequest = operations['promo/read']['requestBody']['content']['application/json'];
+export type RolesShowRequest = operations['roles/show']['requestBody']['content']['application/json'];
+export type RolesUsersRequest = operations['roles/users']['requestBody']['content']['application/json'];
+export type RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
+export type RolesNotesResponse = operations['roles/notes']['responses']['200']['content']['application/json'];
+export type RequestResetPasswordRequest = operations['request-reset-password']['requestBody']['content']['application/json'];
+export type ResetPasswordRequest = operations['reset-password']['requestBody']['content']['application/json'];
+export type StatsResponse = operations['stats']['responses']['200']['content']['application/json'];
+export type SwShowRegistrationRequest = operations['sw/show-registration']['requestBody']['content']['application/json'];
+export type SwShowRegistrationResponse = operations['sw/show-registration']['responses']['200']['content']['application/json'];
+export type SwUpdateRegistrationRequest = operations['sw/update-registration']['requestBody']['content']['application/json'];
+export type SwUpdateRegistrationResponse = operations['sw/update-registration']['responses']['200']['content']['application/json'];
+export type SwRegisterRequest = operations['sw/register']['requestBody']['content']['application/json'];
+export type SwRegisterResponse = operations['sw/register']['responses']['200']['content']['application/json'];
+export type SwUnregisterRequest = operations['sw/unregister']['requestBody']['content']['application/json'];
+export type TestRequest = operations['test']['requestBody']['content']['application/json'];
+export type UsernameAvailableRequest = operations['username/available']['requestBody']['content']['application/json'];
+export type UsernameAvailableResponse = operations['username/available']['responses']['200']['content']['application/json'];
+export type UsersRequest = operations['users']['requestBody']['content']['application/json'];
+export type UsersResponse = operations['users']['responses']['200']['content']['application/json'];
+export type UsersClipsRequest = operations['users/clips']['requestBody']['content']['application/json'];
+export type UsersClipsResponse = operations['users/clips']['responses']['200']['content']['application/json'];
+export type UsersFollowersRequest = operations['users/followers']['requestBody']['content']['application/json'];
+export type UsersFollowersResponse = operations['users/followers']['responses']['200']['content']['application/json'];
+export type UsersFollowingRequest = operations['users/following']['requestBody']['content']['application/json'];
+export type UsersFollowingResponse = operations['users/following']['responses']['200']['content']['application/json'];
+export type UsersGalleryPostsRequest = operations['users/gallery/posts']['requestBody']['content']['application/json'];
+export type UsersGalleryPostsResponse = operations['users/gallery/posts']['responses']['200']['content']['application/json'];
+export type UsersGetFrequentlyRepliedUsersRequest = operations['users/get-frequently-replied-users']['requestBody']['content']['application/json'];
+export type UsersGetFrequentlyRepliedUsersResponse = operations['users/get-frequently-replied-users']['responses']['200']['content']['application/json'];
+export type UsersFeaturedNotesRequest = operations['users/featured-notes']['requestBody']['content']['application/json'];
+export type UsersFeaturedNotesResponse = operations['users/featured-notes']['responses']['200']['content']['application/json'];
+export type UsersListsCreateRequest = operations['users/lists/create']['requestBody']['content']['application/json'];
+export type UsersListsCreateResponse = operations['users/lists/create']['responses']['200']['content']['application/json'];
+export type UsersListsDeleteRequest = operations['users/lists/delete']['requestBody']['content']['application/json'];
+export type UsersListsListRequest = operations['users/lists/list']['requestBody']['content']['application/json'];
+export type UsersListsListResponse = operations['users/lists/list']['responses']['200']['content']['application/json'];
+export type UsersListsPullRequest = operations['users/lists/pull']['requestBody']['content']['application/json'];
+export type UsersListsPushRequest = operations['users/lists/push']['requestBody']['content']['application/json'];
+export type UsersListsShowRequest = operations['users/lists/show']['requestBody']['content']['application/json'];
+export type UsersListsShowResponse = operations['users/lists/show']['responses']['200']['content']['application/json'];
+export type UsersListsFavoriteRequest = operations['users/lists/favorite']['requestBody']['content']['application/json'];
+export type UsersListsUnfavoriteRequest = operations['users/lists/unfavorite']['requestBody']['content']['application/json'];
+export type UsersListsUpdateRequest = operations['users/lists/update']['requestBody']['content']['application/json'];
+export type UsersListsUpdateResponse = operations['users/lists/update']['responses']['200']['content']['application/json'];
+export type UsersListsCreateFromPublicRequest = operations['users/lists/create-from-public']['requestBody']['content']['application/json'];
+export type UsersListsCreateFromPublicResponse = operations['users/lists/create-from-public']['responses']['200']['content']['application/json'];
+export type UsersListsUpdateMembershipRequest = operations['users/lists/update-membership']['requestBody']['content']['application/json'];
+export type UsersListsGetMembershipsRequest = operations['users/lists/get-memberships']['requestBody']['content']['application/json'];
+export type UsersNotesRequest = operations['users/notes']['requestBody']['content']['application/json'];
+export type UsersNotesResponse = operations['users/notes']['responses']['200']['content']['application/json'];
+export type UsersPagesRequest = operations['users/pages']['requestBody']['content']['application/json'];
+export type UsersPagesResponse = operations['users/pages']['responses']['200']['content']['application/json'];
+export type UsersFlashsRequest = operations['users/flashs']['requestBody']['content']['application/json'];
+export type UsersFlashsResponse = operations['users/flashs']['responses']['200']['content']['application/json'];
+export type UsersReactionsRequest = operations['users/reactions']['requestBody']['content']['application/json'];
+export type UsersReactionsResponse = operations['users/reactions']['responses']['200']['content']['application/json'];
+export type UsersRecommendationRequest = operations['users/recommendation']['requestBody']['content']['application/json'];
+export type UsersRecommendationResponse = operations['users/recommendation']['responses']['200']['content']['application/json'];
+export type UsersRelationRequest = operations['users/relation']['requestBody']['content']['application/json'];
+export type UsersRelationResponse = operations['users/relation']['responses']['200']['content']['application/json'];
+export type UsersReportAbuseRequest = operations['users/report-abuse']['requestBody']['content']['application/json'];
+export type UsersSearchByUsernameAndHostRequest = operations['users/search-by-username-and-host']['requestBody']['content']['application/json'];
+export type UsersSearchByUsernameAndHostResponse = operations['users/search-by-username-and-host']['responses']['200']['content']['application/json'];
+export type UsersSearchRequest = operations['users/search']['requestBody']['content']['application/json'];
+export type UsersSearchResponse = operations['users/search']['responses']['200']['content']['application/json'];
+export type UsersShowRequest = operations['users/show']['requestBody']['content']['application/json'];
+export type UsersShowResponse = operations['users/show']['responses']['200']['content']['application/json'];
+export type UsersAchievementsRequest = operations['users/achievements']['requestBody']['content']['application/json'];
+export type UsersUpdateMemoRequest = operations['users/update-memo']['requestBody']['content']['application/json'];
+export type FetchRssRequest = operations['fetch-rss']['requestBody']['content']['application/json'];
+export type FetchExternalResourcesRequest = operations['fetch-external-resources']['requestBody']['content']['application/json'];
+export type RetentionResponse = operations['retention']['responses']['200']['content']['application/json'];
diff --git a/packages/misskey-js/src/autogen/models.ts b/packages/misskey-js/src/autogen/models.ts
new file mode 100644
index 000000000..bc7ab1f3b
--- /dev/null
+++ b/packages/misskey-js/src/autogen/models.ts
@@ -0,0 +1,39 @@
+/*
+ * version: 2023.11.1
+ * generatedAt: 2023-11-27T02:24:45.109Z
+ */
+
+import { components } from './types.js';
+export type Error = components['schemas']['Error'];
+export type UserLite = components['schemas']['UserLite'];
+export type UserDetailedNotMeOnly = components['schemas']['UserDetailedNotMeOnly'];
+export type MeDetailedOnly = components['schemas']['MeDetailedOnly'];
+export type UserDetailedNotMe = components['schemas']['UserDetailedNotMe'];
+export type MeDetailed = components['schemas']['MeDetailed'];
+export type UserDetailed = components['schemas']['UserDetailed'];
+export type User = components['schemas']['User'];
+export type UserList = components['schemas']['UserList'];
+export type Announcement = components['schemas']['Announcement'];
+export type App = components['schemas']['App'];
+export type Note = components['schemas']['Note'];
+export type NoteReaction = components['schemas']['NoteReaction'];
+export type NoteFavorite = components['schemas']['NoteFavorite'];
+export type Notification = components['schemas']['Notification'];
+export type DriveFile = components['schemas']['DriveFile'];
+export type DriveFolder = components['schemas']['DriveFolder'];
+export type Following = components['schemas']['Following'];
+export type Muting = components['schemas']['Muting'];
+export type RenoteMuting = components['schemas']['RenoteMuting'];
+export type Blocking = components['schemas']['Blocking'];
+export type Hashtag = components['schemas']['Hashtag'];
+export type InviteCode = components['schemas']['InviteCode'];
+export type Page = components['schemas']['Page'];
+export type Channel = components['schemas']['Channel'];
+export type QueueCount = components['schemas']['QueueCount'];
+export type Antenna = components['schemas']['Antenna'];
+export type Clip = components['schemas']['Clip'];
+export type FederationInstance = components['schemas']['FederationInstance'];
+export type GalleryPost = components['schemas']['GalleryPost'];
+export type EmojiSimple = components['schemas']['EmojiSimple'];
+export type EmojiDetailed = components['schemas']['EmojiDetailed'];
+export type Flash = components['schemas']['Flash'];
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
new file mode 100644
index 000000000..c7f5c6c82
--- /dev/null
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -0,0 +1,22560 @@
+/* eslint @typescript-eslint/naming-convention: 0 */
+/* eslint @typescript-eslint/no-explicit-any: 0 */
+
+/*
+ * version: 2023.11.1
+ * generatedAt: 2023-11-27T02:24:44.994Z
+ */
+
+/**
+ * This file was auto-generated by openapi-typescript.
+ * Do not make direct changes to the file.
+ */
+
+/** OneOf type helpers */
+type Without = { [P in Exclude]?: never };
+type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U;
+type OneOf = T extends [infer Only] ? Only : T extends [infer A, infer B, ...infer Rest] ? OneOf<[XOR, ...Rest]> : never;
+
+export type paths = {
+ '/admin/meta': {
+ /**
+ * admin/meta
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/meta'];
+ };
+ '/admin/abuse-user-reports': {
+ /**
+ * admin/abuse-user-reports
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/abuse-user-reports'];
+ };
+ '/admin/accounts/create': {
+ /**
+ * admin/accounts/create
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['admin/accounts/create'];
+ };
+ '/admin/accounts/delete': {
+ /**
+ * admin/accounts/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/accounts/delete'];
+ };
+ '/admin/accounts/find-by-email': {
+ /**
+ * admin/accounts/find-by-email
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/accounts/find-by-email'];
+ };
+ '/admin/ad/create': {
+ /**
+ * admin/ad/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/ad/create'];
+ };
+ '/admin/ad/delete': {
+ /**
+ * admin/ad/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/ad/delete'];
+ };
+ '/admin/ad/list': {
+ /**
+ * admin/ad/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/ad/list'];
+ };
+ '/admin/ad/update': {
+ /**
+ * admin/ad/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/ad/update'];
+ };
+ '/admin/announcements/create': {
+ /**
+ * admin/announcements/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/announcements/create'];
+ };
+ '/admin/announcements/delete': {
+ /**
+ * admin/announcements/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/announcements/delete'];
+ };
+ '/admin/announcements/list': {
+ /**
+ * admin/announcements/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/announcements/list'];
+ };
+ '/admin/announcements/update': {
+ /**
+ * admin/announcements/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/announcements/update'];
+ };
+ '/admin/avatar-decorations/create': {
+ /**
+ * admin/avatar-decorations/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/avatar-decorations/create'];
+ };
+ '/admin/avatar-decorations/delete': {
+ /**
+ * admin/avatar-decorations/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/avatar-decorations/delete'];
+ };
+ '/admin/avatar-decorations/list': {
+ /**
+ * admin/avatar-decorations/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/avatar-decorations/list'];
+ };
+ '/admin/avatar-decorations/update': {
+ /**
+ * admin/avatar-decorations/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/avatar-decorations/update'];
+ };
+ '/admin/delete-all-files-of-a-user': {
+ /**
+ * admin/delete-all-files-of-a-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/delete-all-files-of-a-user'];
+ };
+ '/admin/unset-user-avatar': {
+ /**
+ * admin/unset-user-avatar
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/unset-user-avatar'];
+ };
+ '/admin/unset-user-banner': {
+ /**
+ * admin/unset-user-banner
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/unset-user-banner'];
+ };
+ '/admin/drive/clean-remote-files': {
+ /**
+ * admin/drive/clean-remote-files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/drive/clean-remote-files'];
+ };
+ '/admin/drive/cleanup': {
+ /**
+ * admin/drive/cleanup
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/drive/cleanup'];
+ };
+ '/admin/drive/files': {
+ /**
+ * admin/drive/files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/drive/files'];
+ };
+ '/admin/drive/show-file': {
+ /**
+ * admin/drive/show-file
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/drive/show-file'];
+ };
+ '/admin/emoji/add-aliases-bulk': {
+ /**
+ * admin/emoji/add-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/add-aliases-bulk'];
+ };
+ '/admin/emoji/add': {
+ /**
+ * admin/emoji/add
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/add'];
+ };
+ '/admin/emoji/copy': {
+ /**
+ * admin/emoji/copy
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/copy'];
+ };
+ '/admin/emoji/delete-bulk': {
+ /**
+ * admin/emoji/delete-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/delete-bulk'];
+ };
+ '/admin/emoji/delete': {
+ /**
+ * admin/emoji/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/delete'];
+ };
+ '/admin/emoji/list-remote': {
+ /**
+ * admin/emoji/list-remote
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/list-remote'];
+ };
+ '/admin/emoji/list': {
+ /**
+ * admin/emoji/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/list'];
+ };
+ '/admin/emoji/remove-aliases-bulk': {
+ /**
+ * admin/emoji/remove-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/remove-aliases-bulk'];
+ };
+ '/admin/emoji/set-aliases-bulk': {
+ /**
+ * admin/emoji/set-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/set-aliases-bulk'];
+ };
+ '/admin/emoji/set-category-bulk': {
+ /**
+ * admin/emoji/set-category-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/set-category-bulk'];
+ };
+ '/admin/emoji/set-license-bulk': {
+ /**
+ * admin/emoji/set-license-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/set-license-bulk'];
+ };
+ '/admin/emoji/update': {
+ /**
+ * admin/emoji/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/emoji/update'];
+ };
+ '/admin/federation/delete-all-files': {
+ /**
+ * admin/federation/delete-all-files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/federation/delete-all-files'];
+ };
+ '/admin/federation/refresh-remote-instance-metadata': {
+ /**
+ * admin/federation/refresh-remote-instance-metadata
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/federation/refresh-remote-instance-metadata'];
+ };
+ '/admin/federation/remove-all-following': {
+ /**
+ * admin/federation/remove-all-following
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/federation/remove-all-following'];
+ };
+ '/admin/federation/update-instance': {
+ /**
+ * admin/federation/update-instance
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/federation/update-instance'];
+ };
+ '/admin/get-index-stats': {
+ /**
+ * admin/get-index-stats
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/get-index-stats'];
+ };
+ '/admin/get-table-stats': {
+ /**
+ * admin/get-table-stats
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/get-table-stats'];
+ };
+ '/admin/get-user-ips': {
+ /**
+ * admin/get-user-ips
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/get-user-ips'];
+ };
+ '/admin/invite/create': {
+ /**
+ * admin/invite/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/invite/create'];
+ };
+ '/admin/invite/list': {
+ /**
+ * admin/invite/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/invite/list'];
+ };
+ '/admin/promo/create': {
+ /**
+ * admin/promo/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/promo/create'];
+ };
+ '/admin/queue/clear': {
+ /**
+ * admin/queue/clear
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/queue/clear'];
+ };
+ '/admin/queue/deliver-delayed': {
+ /**
+ * admin/queue/deliver-delayed
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/queue/deliver-delayed'];
+ };
+ '/admin/queue/inbox-delayed': {
+ /**
+ * admin/queue/inbox-delayed
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/queue/inbox-delayed'];
+ };
+ '/admin/queue/promote': {
+ /**
+ * admin/queue/promote
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/queue/promote'];
+ };
+ '/admin/queue/stats': {
+ /**
+ * admin/queue/stats
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/queue/stats'];
+ };
+ '/admin/relays/add': {
+ /**
+ * admin/relays/add
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/relays/add'];
+ };
+ '/admin/relays/list': {
+ /**
+ * admin/relays/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/relays/list'];
+ };
+ '/admin/relays/remove': {
+ /**
+ * admin/relays/remove
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/relays/remove'];
+ };
+ '/admin/reset-password': {
+ /**
+ * admin/reset-password
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/reset-password'];
+ };
+ '/admin/resolve-abuse-user-report': {
+ /**
+ * admin/resolve-abuse-user-report
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/resolve-abuse-user-report'];
+ };
+ '/admin/send-email': {
+ /**
+ * admin/send-email
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/send-email'];
+ };
+ '/admin/server-info': {
+ /**
+ * admin/server-info
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/server-info'];
+ };
+ '/admin/show-moderation-logs': {
+ /**
+ * admin/show-moderation-logs
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/show-moderation-logs'];
+ };
+ '/admin/show-user': {
+ /**
+ * admin/show-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/show-user'];
+ };
+ '/admin/show-users': {
+ /**
+ * admin/show-users
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/show-users'];
+ };
+ '/admin/suspend-user': {
+ /**
+ * admin/suspend-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/suspend-user'];
+ };
+ '/admin/unsuspend-user': {
+ /**
+ * admin/unsuspend-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/unsuspend-user'];
+ };
+ '/admin/update-meta': {
+ /**
+ * admin/update-meta
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/update-meta'];
+ };
+ '/admin/delete-account': {
+ /**
+ * admin/delete-account
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/delete-account'];
+ };
+ '/admin/update-user-note': {
+ /**
+ * admin/update-user-note
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/update-user-note'];
+ };
+ '/admin/roles/create': {
+ /**
+ * admin/roles/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/create'];
+ };
+ '/admin/roles/delete': {
+ /**
+ * admin/roles/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/delete'];
+ };
+ '/admin/roles/list': {
+ /**
+ * admin/roles/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/list'];
+ };
+ '/admin/roles/show': {
+ /**
+ * admin/roles/show
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/show'];
+ };
+ '/admin/roles/update': {
+ /**
+ * admin/roles/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/update'];
+ };
+ '/admin/roles/assign': {
+ /**
+ * admin/roles/assign
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/assign'];
+ };
+ '/admin/roles/unassign': {
+ /**
+ * admin/roles/unassign
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/unassign'];
+ };
+ '/admin/roles/update-default-policies': {
+ /**
+ * admin/roles/update-default-policies
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['admin/roles/update-default-policies'];
+ };
+ '/admin/roles/users': {
+ /**
+ * admin/roles/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['admin/roles/users'];
+ };
+ '/announcements': {
+ /**
+ * announcements
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['announcements'];
+ };
+ '/antennas/create': {
+ /**
+ * antennas/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['antennas/create'];
+ };
+ '/antennas/delete': {
+ /**
+ * antennas/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['antennas/delete'];
+ };
+ '/antennas/list': {
+ /**
+ * antennas/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['antennas/list'];
+ };
+ '/antennas/notes': {
+ /**
+ * antennas/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['antennas/notes'];
+ };
+ '/antennas/show': {
+ /**
+ * antennas/show
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['antennas/show'];
+ };
+ '/antennas/update': {
+ /**
+ * antennas/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['antennas/update'];
+ };
+ '/ap/get': {
+ /**
+ * ap/get
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['ap/get'];
+ };
+ '/ap/show': {
+ /**
+ * ap/show
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['ap/show'];
+ };
+ '/app/create': {
+ /**
+ * app/create
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['app/create'];
+ };
+ '/app/show': {
+ /**
+ * app/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['app/show'];
+ };
+ '/auth/session/generate': {
+ /**
+ * auth/session/generate
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['auth/session/generate'];
+ };
+ '/auth/session/show': {
+ /**
+ * auth/session/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['auth/session/show'];
+ };
+ '/auth/session/userkey': {
+ /**
+ * auth/session/userkey
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['auth/session/userkey'];
+ };
+ '/blocking/create': {
+ /**
+ * blocking/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:blocks*
+ */
+ post: operations['blocking/create'];
+ };
+ '/blocking/delete': {
+ /**
+ * blocking/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:blocks*
+ */
+ post: operations['blocking/delete'];
+ };
+ '/blocking/list': {
+ /**
+ * blocking/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:blocks*
+ */
+ post: operations['blocking/list'];
+ };
+ '/channels/create': {
+ /**
+ * channels/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/create'];
+ };
+ '/channels/featured': {
+ /**
+ * channels/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['channels/featured'];
+ };
+ '/channels/follow': {
+ /**
+ * channels/follow
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/follow'];
+ };
+ '/channels/followed': {
+ /**
+ * channels/followed
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:channels*
+ */
+ post: operations['channels/followed'];
+ };
+ '/channels/owned': {
+ /**
+ * channels/owned
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:channels*
+ */
+ post: operations['channels/owned'];
+ };
+ '/channels/show': {
+ /**
+ * channels/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['channels/show'];
+ };
+ '/channels/timeline': {
+ /**
+ * channels/timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['channels/timeline'];
+ };
+ '/channels/unfollow': {
+ /**
+ * channels/unfollow
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/unfollow'];
+ };
+ '/channels/update': {
+ /**
+ * channels/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/update'];
+ };
+ '/channels/favorite': {
+ /**
+ * channels/favorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/favorite'];
+ };
+ '/channels/unfavorite': {
+ /**
+ * channels/unfavorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:channels*
+ */
+ post: operations['channels/unfavorite'];
+ };
+ '/channels/my-favorites': {
+ /**
+ * channels/my-favorites
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:channels*
+ */
+ post: operations['channels/my-favorites'];
+ };
+ '/channels/search': {
+ /**
+ * channels/search
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['channels/search'];
+ };
+ '/charts/active-users': {
+ /**
+ * charts/active-users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/active-users'];
+ /**
+ * charts/active-users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/active-users'];
+ };
+ '/charts/ap-request': {
+ /**
+ * charts/ap-request
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/ap-request'];
+ /**
+ * charts/ap-request
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/ap-request'];
+ };
+ '/charts/drive': {
+ /**
+ * charts/drive
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/drive'];
+ /**
+ * charts/drive
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/drive'];
+ };
+ '/charts/federation': {
+ /**
+ * charts/federation
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/federation'];
+ /**
+ * charts/federation
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/federation'];
+ };
+ '/charts/instance': {
+ /**
+ * charts/instance
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/instance'];
+ /**
+ * charts/instance
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/instance'];
+ };
+ '/charts/notes': {
+ /**
+ * charts/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/notes'];
+ /**
+ * charts/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/notes'];
+ };
+ '/charts/user/drive': {
+ /**
+ * charts/user/drive
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/user/drive'];
+ /**
+ * charts/user/drive
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/user/drive'];
+ };
+ '/charts/user/following': {
+ /**
+ * charts/user/following
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/user/following'];
+ /**
+ * charts/user/following
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/user/following'];
+ };
+ '/charts/user/notes': {
+ /**
+ * charts/user/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/user/notes'];
+ /**
+ * charts/user/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/user/notes'];
+ };
+ '/charts/user/pv': {
+ /**
+ * charts/user/pv
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/user/pv'];
+ /**
+ * charts/user/pv
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/user/pv'];
+ };
+ '/charts/user/reactions': {
+ /**
+ * charts/user/reactions
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/user/reactions'];
+ /**
+ * charts/user/reactions
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/user/reactions'];
+ };
+ '/charts/users': {
+ /**
+ * charts/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['charts/users'];
+ /**
+ * charts/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['charts/users'];
+ };
+ '/clips/add-note': {
+ /**
+ * clips/add-note
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['clips/add-note'];
+ };
+ '/clips/remove-note': {
+ /**
+ * clips/remove-note
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['clips/remove-note'];
+ };
+ '/clips/create': {
+ /**
+ * clips/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['clips/create'];
+ };
+ '/clips/delete': {
+ /**
+ * clips/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['clips/delete'];
+ };
+ '/clips/list': {
+ /**
+ * clips/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['clips/list'];
+ };
+ '/clips/notes': {
+ /**
+ * clips/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No* / **Permission**: *read:account*
+ */
+ post: operations['clips/notes'];
+ };
+ '/clips/show': {
+ /**
+ * clips/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No* / **Permission**: *read:account*
+ */
+ post: operations['clips/show'];
+ };
+ '/clips/update': {
+ /**
+ * clips/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['clips/update'];
+ };
+ '/clips/favorite': {
+ /**
+ * clips/favorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:clip-favorite*
+ */
+ post: operations['clips/favorite'];
+ };
+ '/clips/unfavorite': {
+ /**
+ * clips/unfavorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:clip-favorite*
+ */
+ post: operations['clips/unfavorite'];
+ };
+ '/clips/my-favorites': {
+ /**
+ * clips/my-favorites
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:clip-favorite*
+ */
+ post: operations['clips/my-favorites'];
+ };
+ '/drive': {
+ /**
+ * drive
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive'];
+ };
+ '/drive/files': {
+ /**
+ * drive/files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files'];
+ };
+ '/drive/files/attached-notes': {
+ /**
+ * drive/files/attached-notes
+ * @description Find the notes to which the given file is attached.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files/attached-notes'];
+ };
+ '/drive/files/check-existence': {
+ /**
+ * drive/files/check-existence
+ * @description Check if a given file exists.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files/check-existence'];
+ };
+ '/drive/files/create': {
+ /**
+ * drive/files/create
+ * @description Upload a new drive file.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/files/create'];
+ };
+ '/drive/files/delete': {
+ /**
+ * drive/files/delete
+ * @description Delete an existing drive file.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/files/delete'];
+ };
+ '/drive/files/find-by-hash': {
+ /**
+ * drive/files/find-by-hash
+ * @description Search for a drive file by a hash of the contents.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files/find-by-hash'];
+ };
+ '/drive/files/find': {
+ /**
+ * drive/files/find
+ * @description Search for a drive file by the given parameters.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files/find'];
+ };
+ '/drive/files/show': {
+ /**
+ * drive/files/show
+ * @description Show the properties of a drive file.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/files/show'];
+ };
+ '/drive/files/update': {
+ /**
+ * drive/files/update
+ * @description Update the properties of a drive file.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/files/update'];
+ };
+ '/drive/files/upload-from-url': {
+ /**
+ * drive/files/upload-from-url
+ * @description Request the server to download a new drive file from the specified URL.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/files/upload-from-url'];
+ };
+ '/drive/folders': {
+ /**
+ * drive/folders
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/folders'];
+ };
+ '/drive/folders/create': {
+ /**
+ * drive/folders/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/folders/create'];
+ };
+ '/drive/folders/delete': {
+ /**
+ * drive/folders/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/folders/delete'];
+ };
+ '/drive/folders/find': {
+ /**
+ * drive/folders/find
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/folders/find'];
+ };
+ '/drive/folders/show': {
+ /**
+ * drive/folders/show
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/folders/show'];
+ };
+ '/drive/folders/update': {
+ /**
+ * drive/folders/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:drive*
+ */
+ post: operations['drive/folders/update'];
+ };
+ '/drive/stream': {
+ /**
+ * drive/stream
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:drive*
+ */
+ post: operations['drive/stream'];
+ };
+ '/email-address/available': {
+ /**
+ * email-address/available
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['email-address/available'];
+ };
+ '/endpoint': {
+ /**
+ * endpoint
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['endpoint'];
+ };
+ '/endpoints': {
+ /**
+ * endpoints
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['endpoints'];
+ };
+ '/federation/followers': {
+ /**
+ * federation/followers
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/followers'];
+ };
+ '/federation/following': {
+ /**
+ * federation/following
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/following'];
+ };
+ '/federation/instances': {
+ /**
+ * federation/instances
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['federation/instances'];
+ /**
+ * federation/instances
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/instances'];
+ };
+ '/federation/show-instance': {
+ /**
+ * federation/show-instance
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/show-instance'];
+ };
+ '/federation/update-remote-user': {
+ /**
+ * federation/update-remote-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['federation/update-remote-user'];
+ };
+ '/federation/users': {
+ /**
+ * federation/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/users'];
+ };
+ '/federation/stats': {
+ /**
+ * federation/stats
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['federation/stats'];
+ /**
+ * federation/stats
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['federation/stats'];
+ };
+ '/following/create': {
+ /**
+ * following/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/create'];
+ };
+ '/following/delete': {
+ /**
+ * following/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/delete'];
+ };
+ '/following/update': {
+ /**
+ * following/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/update'];
+ };
+ '/following/update-all': {
+ /**
+ * following/update-all
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/update-all'];
+ };
+ '/following/invalidate': {
+ /**
+ * following/invalidate
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/invalidate'];
+ };
+ '/following/requests/accept': {
+ /**
+ * following/requests/accept
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/requests/accept'];
+ };
+ '/following/requests/cancel': {
+ /**
+ * following/requests/cancel
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/requests/cancel'];
+ };
+ '/following/requests/list': {
+ /**
+ * following/requests/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:following*
+ */
+ post: operations['following/requests/list'];
+ };
+ '/following/requests/reject': {
+ /**
+ * following/requests/reject
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:following*
+ */
+ post: operations['following/requests/reject'];
+ };
+ '/gallery/featured': {
+ /**
+ * gallery/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['gallery/featured'];
+ };
+ '/gallery/popular': {
+ /**
+ * gallery/popular
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['gallery/popular'];
+ };
+ '/gallery/posts': {
+ /**
+ * gallery/posts
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['gallery/posts'];
+ };
+ '/gallery/posts/create': {
+ /**
+ * gallery/posts/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:gallery*
+ */
+ post: operations['gallery/posts/create'];
+ };
+ '/gallery/posts/delete': {
+ /**
+ * gallery/posts/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:gallery*
+ */
+ post: operations['gallery/posts/delete'];
+ };
+ '/gallery/posts/like': {
+ /**
+ * gallery/posts/like
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:gallery-likes*
+ */
+ post: operations['gallery/posts/like'];
+ };
+ '/gallery/posts/show': {
+ /**
+ * gallery/posts/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['gallery/posts/show'];
+ };
+ '/gallery/posts/unlike': {
+ /**
+ * gallery/posts/unlike
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:gallery-likes*
+ */
+ post: operations['gallery/posts/unlike'];
+ };
+ '/gallery/posts/update': {
+ /**
+ * gallery/posts/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:gallery*
+ */
+ post: operations['gallery/posts/update'];
+ };
+ '/get-online-users-count': {
+ /**
+ * get-online-users-count
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['get-online-users-count'];
+ /**
+ * get-online-users-count
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['get-online-users-count'];
+ };
+ '/get-avatar-decorations': {
+ /**
+ * get-avatar-decorations
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['get-avatar-decorations'];
+ };
+ '/hashtags/list': {
+ /**
+ * hashtags/list
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['hashtags/list'];
+ };
+ '/hashtags/search': {
+ /**
+ * hashtags/search
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['hashtags/search'];
+ };
+ '/hashtags/show': {
+ /**
+ * hashtags/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['hashtags/show'];
+ };
+ '/hashtags/trend': {
+ /**
+ * hashtags/trend
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['hashtags/trend'];
+ /**
+ * hashtags/trend
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['hashtags/trend'];
+ };
+ '/hashtags/users': {
+ /**
+ * hashtags/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['hashtags/users'];
+ };
+ '/i': {
+ /**
+ * i
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i'];
+ };
+ '/i/claim-achievement': {
+ /**
+ * i/claim-achievement
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/claim-achievement'];
+ };
+ '/i/favorites': {
+ /**
+ * i/favorites
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:favorites*
+ */
+ post: operations['i/favorites'];
+ };
+ '/i/gallery/likes': {
+ /**
+ * i/gallery/likes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:gallery-likes*
+ */
+ post: operations['i/gallery/likes'];
+ };
+ '/i/gallery/posts': {
+ /**
+ * i/gallery/posts
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:gallery*
+ */
+ post: operations['i/gallery/posts'];
+ };
+ '/i/notifications': {
+ /**
+ * i/notifications
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:notifications*
+ */
+ post: operations['i/notifications'];
+ };
+ '/i/notifications-grouped': {
+ /**
+ * i/notifications-grouped
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:notifications*
+ */
+ post: operations['i/notifications-grouped'];
+ };
+ '/i/page-likes': {
+ /**
+ * i/page-likes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:page-likes*
+ */
+ post: operations['i/page-likes'];
+ };
+ '/i/pages': {
+ /**
+ * i/pages
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:pages*
+ */
+ post: operations['i/pages'];
+ };
+ '/i/pin': {
+ /**
+ * i/pin
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/pin'];
+ };
+ '/i/read-all-unread-notes': {
+ /**
+ * i/read-all-unread-notes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/read-all-unread-notes'];
+ };
+ '/i/read-announcement': {
+ /**
+ * i/read-announcement
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/read-announcement'];
+ };
+ '/i/registry/get-all': {
+ /**
+ * i/registry/get-all
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/get-all'];
+ };
+ '/i/registry/get-detail': {
+ /**
+ * i/registry/get-detail
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/get-detail'];
+ };
+ '/i/registry/get': {
+ /**
+ * i/registry/get
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/get'];
+ };
+ '/i/registry/keys-with-type': {
+ /**
+ * i/registry/keys-with-type
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/keys-with-type'];
+ };
+ '/i/registry/keys': {
+ /**
+ * i/registry/keys
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/keys'];
+ };
+ '/i/registry/remove': {
+ /**
+ * i/registry/remove
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/remove'];
+ };
+ '/i/registry/set': {
+ /**
+ * i/registry/set
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['i/registry/set'];
+ };
+ '/i/unpin': {
+ /**
+ * i/unpin
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/unpin'];
+ };
+ '/i/update': {
+ /**
+ * i/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/update'];
+ };
+ '/i/webhooks/create': {
+ /**
+ * i/webhooks/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/webhooks/create'];
+ };
+ '/i/webhooks/list': {
+ /**
+ * i/webhooks/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['i/webhooks/list'];
+ };
+ '/i/webhooks/show': {
+ /**
+ * i/webhooks/show
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['i/webhooks/show'];
+ };
+ '/i/webhooks/update': {
+ /**
+ * i/webhooks/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/webhooks/update'];
+ };
+ '/i/webhooks/delete': {
+ /**
+ * i/webhooks/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['i/webhooks/delete'];
+ };
+ '/invite/create': {
+ /**
+ * invite/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['invite/create'];
+ };
+ '/invite/delete': {
+ /**
+ * invite/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['invite/delete'];
+ };
+ '/invite/list': {
+ /**
+ * invite/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['invite/list'];
+ };
+ '/invite/limit': {
+ /**
+ * invite/limit
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['invite/limit'];
+ };
+ '/meta': {
+ /**
+ * meta
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['meta'];
+ };
+ '/emojis': {
+ /**
+ * emojis
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['emojis'];
+ /**
+ * emojis
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['emojis'];
+ };
+ '/emoji': {
+ /**
+ * emoji
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['emoji'];
+ /**
+ * emoji
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['emoji'];
+ };
+ '/mute/create': {
+ /**
+ * mute/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:mutes*
+ */
+ post: operations['mute/create'];
+ };
+ '/mute/delete': {
+ /**
+ * mute/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:mutes*
+ */
+ post: operations['mute/delete'];
+ };
+ '/mute/list': {
+ /**
+ * mute/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:mutes*
+ */
+ post: operations['mute/list'];
+ };
+ '/renote-mute/create': {
+ /**
+ * renote-mute/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:mutes*
+ */
+ post: operations['renote-mute/create'];
+ };
+ '/renote-mute/delete': {
+ /**
+ * renote-mute/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:mutes*
+ */
+ post: operations['renote-mute/delete'];
+ };
+ '/renote-mute/list': {
+ /**
+ * renote-mute/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:mutes*
+ */
+ post: operations['renote-mute/list'];
+ };
+ '/my/apps': {
+ /**
+ * my/apps
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['my/apps'];
+ };
+ '/notes': {
+ /**
+ * notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes'];
+ };
+ '/notes/children': {
+ /**
+ * notes/children
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/children'];
+ };
+ '/notes/clips': {
+ /**
+ * notes/clips
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/clips'];
+ };
+ '/notes/conversation': {
+ /**
+ * notes/conversation
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/conversation'];
+ };
+ '/notes/create': {
+ /**
+ * notes/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notes*
+ */
+ post: operations['notes/create'];
+ };
+ '/notes/delete': {
+ /**
+ * notes/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notes*
+ */
+ post: operations['notes/delete'];
+ };
+ '/notes/favorites/create': {
+ /**
+ * notes/favorites/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:favorites*
+ */
+ post: operations['notes/favorites/create'];
+ };
+ '/notes/favorites/delete': {
+ /**
+ * notes/favorites/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:favorites*
+ */
+ post: operations['notes/favorites/delete'];
+ };
+ '/notes/featured': {
+ /**
+ * notes/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['notes/featured'];
+ /**
+ * notes/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/featured'];
+ };
+ '/notes/global-timeline': {
+ /**
+ * notes/global-timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/global-timeline'];
+ };
+ '/notes/hybrid-timeline': {
+ /**
+ * notes/hybrid-timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/hybrid-timeline'];
+ };
+ '/notes/local-timeline': {
+ /**
+ * notes/local-timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/local-timeline'];
+ };
+ '/notes/mentions': {
+ /**
+ * notes/mentions
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/mentions'];
+ };
+ '/notes/polls/recommendation': {
+ /**
+ * notes/polls/recommendation
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/polls/recommendation'];
+ };
+ '/notes/polls/vote': {
+ /**
+ * notes/polls/vote
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:votes*
+ */
+ post: operations['notes/polls/vote'];
+ };
+ '/notes/reactions': {
+ /**
+ * notes/reactions
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['notes/reactions'];
+ /**
+ * notes/reactions
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/reactions'];
+ };
+ '/notes/reactions/create': {
+ /**
+ * notes/reactions/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:reactions*
+ */
+ post: operations['notes/reactions/create'];
+ };
+ '/notes/reactions/delete': {
+ /**
+ * notes/reactions/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:reactions*
+ */
+ post: operations['notes/reactions/delete'];
+ };
+ '/notes/renotes': {
+ /**
+ * notes/renotes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/renotes'];
+ };
+ '/notes/replies': {
+ /**
+ * notes/replies
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/replies'];
+ };
+ '/notes/search-by-tag': {
+ /**
+ * notes/search-by-tag
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/search-by-tag'];
+ };
+ '/notes/search': {
+ /**
+ * notes/search
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/search'];
+ };
+ '/notes/show': {
+ /**
+ * notes/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['notes/show'];
+ };
+ '/notes/state': {
+ /**
+ * notes/state
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/state'];
+ };
+ '/notes/thread-muting/create': {
+ /**
+ * notes/thread-muting/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['notes/thread-muting/create'];
+ };
+ '/notes/thread-muting/delete': {
+ /**
+ * notes/thread-muting/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['notes/thread-muting/delete'];
+ };
+ '/notes/timeline': {
+ /**
+ * notes/timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/timeline'];
+ };
+ '/notes/translate': {
+ /**
+ * notes/translate
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/translate'];
+ };
+ '/notes/unrenote': {
+ /**
+ * notes/unrenote
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notes*
+ */
+ post: operations['notes/unrenote'];
+ };
+ '/notes/user-list-timeline': {
+ /**
+ * notes/user-list-timeline
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['notes/user-list-timeline'];
+ };
+ '/notifications/create': {
+ /**
+ * notifications/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notifications*
+ */
+ post: operations['notifications/create'];
+ };
+ '/notifications/mark-all-as-read': {
+ /**
+ * notifications/mark-all-as-read
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notifications*
+ */
+ post: operations['notifications/mark-all-as-read'];
+ };
+ '/notifications/test-notification': {
+ /**
+ * notifications/test-notification
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:notifications*
+ */
+ post: operations['notifications/test-notification'];
+ };
+ '/pages/create': {
+ /**
+ * pages/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:pages*
+ */
+ post: operations['pages/create'];
+ };
+ '/pages/delete': {
+ /**
+ * pages/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:pages*
+ */
+ post: operations['pages/delete'];
+ };
+ '/pages/featured': {
+ /**
+ * pages/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['pages/featured'];
+ };
+ '/pages/like': {
+ /**
+ * pages/like
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:page-likes*
+ */
+ post: operations['pages/like'];
+ };
+ '/pages/show': {
+ /**
+ * pages/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['pages/show'];
+ };
+ '/pages/unlike': {
+ /**
+ * pages/unlike
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:page-likes*
+ */
+ post: operations['pages/unlike'];
+ };
+ '/pages/update': {
+ /**
+ * pages/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:pages*
+ */
+ post: operations['pages/update'];
+ };
+ '/flash/create': {
+ /**
+ * flash/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:flash*
+ */
+ post: operations['flash/create'];
+ };
+ '/flash/delete': {
+ /**
+ * flash/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:flash*
+ */
+ post: operations['flash/delete'];
+ };
+ '/flash/featured': {
+ /**
+ * flash/featured
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['flash/featured'];
+ };
+ '/flash/like': {
+ /**
+ * flash/like
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:flash-likes*
+ */
+ post: operations['flash/like'];
+ };
+ '/flash/show': {
+ /**
+ * flash/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['flash/show'];
+ };
+ '/flash/unlike': {
+ /**
+ * flash/unlike
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:flash-likes*
+ */
+ post: operations['flash/unlike'];
+ };
+ '/flash/update': {
+ /**
+ * flash/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:flash*
+ */
+ post: operations['flash/update'];
+ };
+ '/flash/my': {
+ /**
+ * flash/my
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:flash*
+ */
+ post: operations['flash/my'];
+ };
+ '/flash/my-likes': {
+ /**
+ * flash/my-likes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:flash-likes*
+ */
+ post: operations['flash/my-likes'];
+ };
+ '/ping': {
+ /**
+ * ping
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['ping'];
+ };
+ '/pinned-users': {
+ /**
+ * pinned-users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['pinned-users'];
+ };
+ '/promo/read': {
+ /**
+ * promo/read
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['promo/read'];
+ };
+ '/roles/list': {
+ /**
+ * roles/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['roles/list'];
+ };
+ '/roles/show': {
+ /**
+ * roles/show
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['roles/show'];
+ };
+ '/roles/users': {
+ /**
+ * roles/users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['roles/users'];
+ };
+ '/roles/notes': {
+ /**
+ * roles/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['roles/notes'];
+ };
+ '/request-reset-password': {
+ /**
+ * request-reset-password
+ * @description Request a users password to be reset.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['request-reset-password'];
+ };
+ '/reset-db': {
+ /**
+ * reset-db
+ * @description Only available when running with NODE_ENV=testing
. Reset the database and flush Redis.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['reset-db'];
+ };
+ '/reset-password': {
+ /**
+ * reset-password
+ * @description Complete the password reset that was previously requested.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['reset-password'];
+ };
+ '/server-info': {
+ /**
+ * server-info
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['server-info'];
+ /**
+ * server-info
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['server-info'];
+ };
+ '/stats': {
+ /**
+ * stats
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['stats'];
+ };
+ '/sw/show-registration': {
+ /**
+ * sw/show-registration
+ * @description Check push notification registration exists.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['sw/show-registration'];
+ };
+ '/sw/update-registration': {
+ /**
+ * sw/update-registration
+ * @description Update push notification registration.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['sw/update-registration'];
+ };
+ '/sw/register': {
+ /**
+ * sw/register
+ * @description Register to receive push notifications.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['sw/register'];
+ };
+ '/sw/unregister': {
+ /**
+ * sw/unregister
+ * @description Unregister from receiving push notifications.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['sw/unregister'];
+ };
+ '/test': {
+ /**
+ * test
+ * @description Endpoint for testing input validation.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['test'];
+ };
+ '/username/available': {
+ /**
+ * username/available
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['username/available'];
+ };
+ '/users': {
+ /**
+ * users
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users'];
+ };
+ '/users/clips': {
+ /**
+ * users/clips
+ * @description Show all clips this user owns.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/clips'];
+ };
+ '/users/followers': {
+ /**
+ * users/followers
+ * @description Show everyone that follows this user.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/followers'];
+ };
+ '/users/following': {
+ /**
+ * users/following
+ * @description Show everyone that this user is following.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/following'];
+ };
+ '/users/gallery/posts': {
+ /**
+ * users/gallery/posts
+ * @description Show all gallery posts by the given user.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/gallery/posts'];
+ };
+ '/users/get-frequently-replied-users': {
+ /**
+ * users/get-frequently-replied-users
+ * @description Get a list of other users that the specified user frequently replies to.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/get-frequently-replied-users'];
+ };
+ '/users/featured-notes': {
+ /**
+ * users/featured-notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['users/featured-notes'];
+ /**
+ * users/featured-notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/featured-notes'];
+ };
+ '/users/lists/create': {
+ /**
+ * users/lists/create
+ * @description Create a new list of users.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/create'];
+ };
+ '/users/lists/delete': {
+ /**
+ * users/lists/delete
+ * @description Delete an existing list of users.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/delete'];
+ };
+ '/users/lists/list': {
+ /**
+ * users/lists/list
+ * @description Show all lists that the authenticated user has created.
+ *
+ * **Credential required**: *No* / **Permission**: *read:account*
+ */
+ post: operations['users/lists/list'];
+ };
+ '/users/lists/pull': {
+ /**
+ * users/lists/pull
+ * @description Remove a user from a list.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/pull'];
+ };
+ '/users/lists/push': {
+ /**
+ * users/lists/push
+ * @description Add a user to an existing list.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/push'];
+ };
+ '/users/lists/show': {
+ /**
+ * users/lists/show
+ * @description Show the properties of a list.
+ *
+ * **Credential required**: *No* / **Permission**: *read:account*
+ */
+ post: operations['users/lists/show'];
+ };
+ '/users/lists/favorite': {
+ /**
+ * users/lists/favorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/lists/favorite'];
+ };
+ '/users/lists/unfavorite': {
+ /**
+ * users/lists/unfavorite
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/lists/unfavorite'];
+ };
+ '/users/lists/update': {
+ /**
+ * users/lists/update
+ * @description Update the properties of a list.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/update'];
+ };
+ '/users/lists/create-from-public': {
+ /**
+ * users/lists/create-from-public
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/lists/create-from-public'];
+ };
+ '/users/lists/update-membership': {
+ /**
+ * users/lists/update-membership
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/lists/update-membership'];
+ };
+ '/users/lists/get-memberships': {
+ /**
+ * users/lists/get-memberships
+ * @description No description provided.
+ *
+ * **Credential required**: *No* / **Permission**: *read:account*
+ */
+ post: operations['users/lists/get-memberships'];
+ };
+ '/users/notes': {
+ /**
+ * users/notes
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/notes'];
+ };
+ '/users/pages': {
+ /**
+ * users/pages
+ * @description Show all pages this user created.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/pages'];
+ };
+ '/users/flashs': {
+ /**
+ * users/flashs
+ * @description Show all flashs this user created.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/flashs'];
+ };
+ '/users/reactions': {
+ /**
+ * users/reactions
+ * @description Show all reactions this user made.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/reactions'];
+ };
+ '/users/recommendation': {
+ /**
+ * users/recommendation
+ * @description Show users that the authenticated user might be interested to follow.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:account*
+ */
+ post: operations['users/recommendation'];
+ };
+ '/users/relation': {
+ /**
+ * users/relation
+ * @description Show the different kinds of relations between the authenticated user and the specified user(s).
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/relation'];
+ };
+ '/users/report-abuse': {
+ /**
+ * users/report-abuse
+ * @description File a report.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/report-abuse'];
+ };
+ '/users/search-by-username-and-host': {
+ /**
+ * users/search-by-username-and-host
+ * @description Search for a user by username and/or host.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/search-by-username-and-host'];
+ };
+ '/users/search': {
+ /**
+ * users/search
+ * @description Search for users.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/search'];
+ };
+ '/users/show': {
+ /**
+ * users/show
+ * @description Show the properties of a user.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['users/show'];
+ };
+ '/users/achievements': {
+ /**
+ * users/achievements
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['users/achievements'];
+ };
+ '/users/update-memo': {
+ /**
+ * users/update-memo
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *write:account*
+ */
+ post: operations['users/update-memo'];
+ };
+ '/fetch-rss': {
+ /**
+ * fetch-rss
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['fetch-rss'];
+ /**
+ * fetch-rss
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['fetch-rss'];
+ };
+ '/fetch-external-resources': {
+ /**
+ * fetch-external-resources
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ post: operations['fetch-external-resources'];
+ };
+ '/retention': {
+ /**
+ * retention
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ get: operations['retention'];
+ /**
+ * retention
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ post: operations['retention'];
+ };
+};
+
+export type webhooks = Record;
+
+export type components = {
+ schemas: {
+ Error: {
+ /** @description An error object. */
+ error: {
+ /** @description An error code. Unique within the endpoint. */
+ code: string;
+ /** @description An error message. */
+ message: string;
+ /**
+ * Format: uuid
+ * @description An error ID. This ID is static.
+ */
+ id: string;
+ };
+ };
+ UserLite: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** @example 藍 */
+ name: string | null;
+ /** @example ai */
+ username: string;
+ /**
+ * @description The local host is represented with `null`.
+ * @example misskey.example.com
+ */
+ host: string | null;
+ /** Format: url */
+ avatarUrl: string | null;
+ avatarBlurhash: string | null;
+ avatarDecorations: {
+ /** Format: id */
+ id: string;
+ angle?: number;
+ flipH?: boolean;
+ /** Format: url */
+ url: string;
+ }[];
+ isBot?: boolean;
+ isCat?: boolean;
+ instance?: {
+ name: string | null;
+ softwareName: string | null;
+ softwareVersion: string | null;
+ iconUrl: string | null;
+ faviconUrl: string | null;
+ themeColor: string | null;
+ };
+ emojis: Record;
+ /** @enum {string} */
+ onlineStatus: 'unknown' | 'online' | 'active' | 'offline';
+ badgeRoles?: ({
+ name: string;
+ iconUrl: string | null;
+ displayOrder: number;
+ })[];
+ };
+ UserDetailedNotMeOnly: {
+ /** Format: url */
+ url: string | null;
+ /** Format: uri */
+ uri: string | null;
+ /** Format: uri */
+ movedTo: string | null;
+ alsoKnownAs: string[] | null;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ /** Format: date-time */
+ lastFetchedAt: string | null;
+ /** Format: url */
+ bannerUrl: string | null;
+ bannerBlurhash: string | null;
+ isLocked: boolean;
+ isSilenced: boolean;
+ /** @example false */
+ isSuspended: boolean;
+ /** @example Hi masters, I am Ai! */
+ description: string | null;
+ location: string | null;
+ /** @example 2018-03-12 */
+ birthday: string | null;
+ /** @example ja-JP */
+ lang: string | null;
+ fields: {
+ name: string;
+ value: string;
+ }[];
+ verifiedLinks: string[];
+ followersCount: number;
+ followingCount: number;
+ notesCount: number;
+ pinnedNoteIds: string[];
+ pinnedNotes: components['schemas']['Note'][];
+ pinnedPageId: string | null;
+ pinnedPage: components['schemas']['Page'] | null;
+ publicReactions: boolean;
+ /** @enum {string} */
+ ffVisibility: 'public' | 'followers' | 'private';
+ /** @default false */
+ twoFactorEnabled: boolean;
+ /** @default false */
+ usePasswordLessLogin: boolean;
+ /** @default false */
+ securityKeys: boolean;
+ roles: ({
+ /** Format: id */
+ id: string;
+ name: string;
+ color: string | null;
+ iconUrl: string | null;
+ description: string;
+ isModerator: boolean;
+ isAdministrator: boolean;
+ displayOrder: number;
+ })[];
+ memo: string | null;
+ moderationNote?: string;
+ isFollowing?: boolean;
+ isFollowed?: boolean;
+ hasPendingFollowRequestFromYou?: boolean;
+ hasPendingFollowRequestToYou?: boolean;
+ isBlocking?: boolean;
+ isBlocked?: boolean;
+ isMuted?: boolean;
+ isRenoteMuted?: boolean;
+ notify?: string;
+ withReplies?: boolean;
+ };
+ MeDetailedOnly: {
+ /** Format: id */
+ avatarId: string | null;
+ /** Format: id */
+ bannerId: string | null;
+ isModerator: boolean | null;
+ isAdmin: boolean | null;
+ injectFeaturedNote: boolean;
+ receiveAnnouncementEmail: boolean;
+ alwaysMarkNsfw: boolean;
+ autoSensitive: boolean;
+ carefulBot: boolean;
+ autoAcceptFollowed: boolean;
+ noCrawle: boolean;
+ preventAiLearning: boolean;
+ isExplorable: boolean;
+ isDeleted: boolean;
+ /** @enum {string} */
+ twoFactorBackupCodesStock: 'full' | 'partial' | 'none';
+ hideOnlineStatus: boolean;
+ hasUnreadSpecifiedNotes: boolean;
+ hasUnreadMentions: boolean;
+ hasUnreadAnnouncement: boolean;
+ unreadAnnouncements: components['schemas']['Announcement'][];
+ hasUnreadAntenna: boolean;
+ hasUnreadChannel: boolean;
+ hasUnreadNotification: boolean;
+ hasPendingReceivedFollowRequest: boolean;
+ unreadNotificationsCount: number;
+ mutedWords: string[][];
+ hardMutedWords: string[][];
+ mutedInstances: string[] | null;
+ notificationRecieveConfig: Record;
+ emailNotificationTypes: string[];
+ achievements: {
+ name: string;
+ unlockedAt: number;
+ }[];
+ loggedInDays: number;
+ policies: {
+ gtlAvailable: boolean;
+ ltlAvailable: boolean;
+ canPublicNote: boolean;
+ canInvite: boolean;
+ inviteLimit: number;
+ inviteLimitCycle: number;
+ inviteExpirationTime: number;
+ canManageCustomEmojis: boolean;
+ canManageAvatarDecorations: boolean;
+ canSearchNotes: boolean;
+ canUseTranslator: boolean;
+ canHideAds: boolean;
+ driveCapacityMb: number;
+ alwaysMarkNsfw: boolean;
+ pinLimit: number;
+ antennaLimit: number;
+ wordMuteLimit: number;
+ webhookLimit: number;
+ clipLimit: number;
+ noteEachClipsLimit: number;
+ userListLimit: number;
+ userEachUserListsLimit: number;
+ rateLimitFactor: number;
+ };
+ email?: string | null;
+ emailVerified?: boolean | null;
+ securityKeysList?: Record[];
+ };
+ UserDetailedNotMe: components['schemas']['UserLite'] & components['schemas']['UserDetailedNotMeOnly'];
+ MeDetailed: components['schemas']['UserLite'] & components['schemas']['UserDetailedNotMeOnly'] & components['schemas']['MeDetailedOnly'];
+ UserDetailed: components['schemas']['UserDetailedNotMe'] | components['schemas']['MeDetailed'];
+ User: components['schemas']['UserLite'] | components['schemas']['UserDetailed'] | components['schemas']['UserDetailedNotMe'] | components['schemas']['MeDetailed'];
+ UserList: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ name: string;
+ userIds?: string[];
+ isPublic: boolean;
+ };
+ Announcement: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ text: string;
+ title: string;
+ imageUrl: string | null;
+ icon: string;
+ display: string;
+ needConfirmationToRead: boolean;
+ silence: boolean;
+ forYou: boolean;
+ isRead?: boolean;
+ };
+ App: {
+ id: string;
+ name: string;
+ callbackUrl: string | null;
+ permission: string[];
+ secret?: string;
+ isAuthorized?: boolean;
+ };
+ Note: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ deletedAt?: string | null;
+ text: string | null;
+ cw?: string | null;
+ /** Format: id */
+ userId: string;
+ user: components['schemas']['UserLite'];
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ replyId?: string | null;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ renoteId?: string | null;
+ reply?: components['schemas']['Note'] | null;
+ renote?: components['schemas']['Note'] | null;
+ isHidden?: boolean;
+ visibility: string;
+ mentions?: string[];
+ visibleUserIds?: string[];
+ fileIds?: string[];
+ files?: components['schemas']['DriveFile'][];
+ tags?: string[];
+ poll?: Record | null;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ channelId?: string | null;
+ channel?: {
+ id: string;
+ name: string;
+ color: string;
+ isSensitive: boolean;
+ allowRenoteToExternal: boolean;
+ } | null;
+ localOnly?: boolean;
+ reactionAcceptance: string | null;
+ reactions: Record;
+ renoteCount: number;
+ repliesCount: number;
+ uri?: string;
+ url?: string;
+ reactionAndUserPairCache?: string[];
+ myReaction?: Record | null;
+ };
+ NoteReaction: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ user: components['schemas']['UserLite'];
+ type: string;
+ };
+ NoteFavorite: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ note: components['schemas']['Note'];
+ /** Format: id */
+ noteId: string;
+ };
+ Notification: {
+ /** Format: id */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** @enum {string} */
+ type: 'note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'achievementEarned' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped';
+ user?: components['schemas']['UserLite'] | null;
+ /** Format: id */
+ userId?: string | null;
+ note?: components['schemas']['Note'] | null;
+ reaction?: string | null;
+ achievement?: string;
+ body?: string | null;
+ header?: string | null;
+ icon?: string | null;
+ reactions?: {
+ user: components['schemas']['UserLite'];
+ reaction: string;
+ }[] | null;
+ users?: components['schemas']['UserLite'][] | null;
+ };
+ DriveFile: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** @example lenna.jpg */
+ name: string;
+ /** @example image/jpeg */
+ type: string;
+ /**
+ * Format: md5
+ * @example 15eca7fba0480996e2245f5185bf39f2
+ */
+ md5: string;
+ /** @example 51469 */
+ size: number;
+ isSensitive: boolean;
+ blurhash: string | null;
+ properties: {
+ /** @example 1280 */
+ width?: number;
+ /** @example 720 */
+ height?: number;
+ /** @example 8 */
+ orientation?: number;
+ /** @example rgb(40,65,87) */
+ avgColor?: string;
+ };
+ /** Format: url */
+ url: string;
+ /** Format: url */
+ thumbnailUrl: string | null;
+ comment: string | null;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ folderId: string | null;
+ folder?: components['schemas']['DriveFolder'] | null;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ userId: string | null;
+ user?: components['schemas']['UserLite'] | null;
+ };
+ DriveFolder: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ name: string;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ parentId: string | null;
+ foldersCount?: number;
+ filesCount?: number;
+ parent?: components['schemas']['DriveFolder'] | null;
+ };
+ Following: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: id */
+ followeeId: string;
+ /** Format: id */
+ followerId: string;
+ followee?: components['schemas']['UserDetailed'];
+ follower?: components['schemas']['UserDetailed'];
+ };
+ Muting: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ expiresAt: string | null;
+ /** Format: id */
+ muteeId: string;
+ mutee: components['schemas']['UserDetailed'];
+ };
+ RenoteMuting: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: id */
+ muteeId: string;
+ mutee: components['schemas']['UserDetailed'];
+ };
+ Blocking: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: id */
+ blockeeId: string;
+ blockee: components['schemas']['UserDetailed'];
+ };
+ Hashtag: {
+ /** @example misskey */
+ tag: string;
+ mentionedUsersCount: number;
+ mentionedLocalUsersCount: number;
+ mentionedRemoteUsersCount: number;
+ attachedUsersCount: number;
+ attachedLocalUsersCount: number;
+ attachedRemoteUsersCount: number;
+ };
+ InviteCode: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** @example GR6S02ERUA5VR */
+ code: string;
+ /** Format: date-time */
+ expiresAt: string | null;
+ /** Format: date-time */
+ createdAt: string;
+ createdBy: components['schemas']['UserLite'] | null;
+ usedBy: components['schemas']['UserLite'] | null;
+ /** Format: date-time */
+ usedAt: string | null;
+ used: boolean;
+ };
+ Page: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string;
+ /** Format: id */
+ userId: string;
+ user: components['schemas']['UserLite'];
+ content: Record[];
+ variables: Record[];
+ title: string;
+ name: string;
+ summary: string | null;
+ hideTitleWhenPinned: boolean;
+ alignCenter: boolean;
+ font: string;
+ script: string;
+ eyeCatchingImageId: string | null;
+ eyeCatchingImage: components['schemas']['DriveFile'] | null;
+ attachedFiles: components['schemas']['DriveFile'][];
+ likedCount: number;
+ isLiked?: boolean;
+ };
+ Channel: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ lastNotedAt: string | null;
+ name: string;
+ description: string | null;
+ /** Format: id */
+ userId: string | null;
+ /** Format: url */
+ bannerUrl: string | null;
+ pinnedNoteIds: string[];
+ color: string;
+ isArchived: boolean;
+ usersCount: number;
+ notesCount: number;
+ isSensitive: boolean;
+ allowRenoteToExternal: boolean;
+ isFollowing?: boolean;
+ isFavorited?: boolean;
+ pinnedNotes?: components['schemas']['Note'][];
+ };
+ QueueCount: {
+ waiting: number;
+ active: number;
+ completed: number;
+ failed: number;
+ delayed: number;
+ };
+ Antenna: {
+ /** Format: id */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ name: string;
+ keywords: string[][];
+ excludeKeywords: string[][];
+ /** @enum {string} */
+ src: 'home' | 'all' | 'users' | 'list' | 'users_blacklist';
+ /** Format: id */
+ userListId: string | null;
+ users: string[];
+ /** @default false */
+ caseSensitive: boolean;
+ /** @default false */
+ localOnly: boolean;
+ notify: boolean;
+ /** @default false */
+ withReplies: boolean;
+ withFile: boolean;
+ isActive: boolean;
+ /** @default false */
+ hasUnreadNote: boolean;
+ };
+ Clip: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ lastClippedAt: string | null;
+ /** Format: id */
+ userId: string;
+ user: components['schemas']['UserLite'];
+ name: string;
+ description: string | null;
+ isPublic: boolean;
+ favoritedCount: number;
+ isFavorited?: boolean;
+ };
+ FederationInstance: {
+ /** Format: id */
+ id: string;
+ /** Format: date-time */
+ firstRetrievedAt: string;
+ /** @example misskey.example.com */
+ host: string;
+ usersCount: number;
+ notesCount: number;
+ followingCount: number;
+ followersCount: number;
+ isNotResponding: boolean;
+ isSuspended: boolean;
+ isBlocked: boolean;
+ /** @example misskey */
+ softwareName: string | null;
+ softwareVersion: string | null;
+ /** @example true */
+ openRegistrations: boolean | null;
+ name: string | null;
+ description: string | null;
+ maintainerName: string | null;
+ maintainerEmail: string | null;
+ isSilenced: boolean;
+ /** Format: url */
+ iconUrl: string | null;
+ /** Format: url */
+ faviconUrl: string | null;
+ themeColor: string | null;
+ /** Format: date-time */
+ infoUpdatedAt: string | null;
+ /** Format: date-time */
+ latestRequestReceivedAt: string | null;
+ };
+ GalleryPost: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string;
+ /** Format: id */
+ userId: string;
+ user: components['schemas']['UserLite'];
+ title: string;
+ description: string | null;
+ fileIds?: string[];
+ files?: components['schemas']['DriveFile'][];
+ tags?: string[];
+ isSensitive: boolean;
+ likedCount: number;
+ isLiked?: boolean;
+ };
+ EmojiSimple: {
+ aliases: string[];
+ name: string;
+ category: string | null;
+ url: string;
+ isSensitive?: boolean;
+ roleIdsThatCanBeUsedThisEmojiAsReaction?: string[];
+ };
+ EmojiDetailed: {
+ /** Format: id */
+ id: string;
+ aliases: string[];
+ name: string;
+ category: string | null;
+ /** @description The local host is represented with `null`. */
+ host: string | null;
+ url: string;
+ license: string | null;
+ isSensitive: boolean;
+ localOnly: boolean;
+ roleIdsThatCanBeUsedThisEmojiAsReaction: string[];
+ };
+ Flash: {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string;
+ /** Format: id */
+ userId: string;
+ user: components['schemas']['UserLite'];
+ title: string;
+ summary: string;
+ script: string;
+ likedCount: number | null;
+ isLiked?: boolean;
+ };
+ };
+ responses: never;
+ parameters: never;
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
+};
+
+export type $defs = Record;
+
+export type external = Record;
+
+export type operations = {
+
+ /**
+ * admin/meta
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/meta': {
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': {
+ cacheRemoteFiles: boolean;
+ cacheRemoteSensitiveFiles: boolean;
+ emailRequiredForSignup: boolean;
+ enableHcaptcha: boolean;
+ hcaptchaSiteKey: string | null;
+ enableRecaptcha: boolean;
+ recaptchaSiteKey: string | null;
+ enableTurnstile: boolean;
+ turnstileSiteKey: string | null;
+ swPublickey: string | null;
+ /** @default /assets/ai.png */
+ mascotImageUrl: string | null;
+ bannerUrl: string | null;
+ serverErrorImageUrl: string | null;
+ infoImageUrl: string | null;
+ notFoundImageUrl: string | null;
+ iconUrl: string | null;
+ app192IconUrl: string | null;
+ app512IconUrl: string | null;
+ enableEmail: boolean;
+ enableServiceWorker: boolean;
+ translatorAvailable: boolean;
+ silencedHosts?: string[];
+ pinnedUsers: string[];
+ hiddenTags: string[];
+ blockedHosts: string[];
+ sensitiveWords: string[];
+ preservedUsernames: string[];
+ hcaptchaSecretKey: string | null;
+ recaptchaSecretKey: string | null;
+ turnstileSecretKey: string | null;
+ sensitiveMediaDetection: string;
+ sensitiveMediaDetectionSensitivity: string;
+ setSensitiveFlagAutomatically: boolean;
+ enableSensitiveMediaDetectionForVideos: boolean;
+ /** Format: id */
+ proxyAccountId: string | null;
+ email: string | null;
+ smtpSecure: boolean;
+ smtpHost: string | null;
+ smtpPort: number | null;
+ smtpUser: string | null;
+ smtpPass: string | null;
+ swPrivateKey: string | null;
+ useObjectStorage: boolean;
+ objectStorageBaseUrl: string | null;
+ objectStorageBucket: string | null;
+ objectStoragePrefix: string | null;
+ objectStorageEndpoint: string | null;
+ objectStorageRegion: string | null;
+ objectStoragePort: number | null;
+ objectStorageAccessKey: string | null;
+ objectStorageSecretKey: string | null;
+ objectStorageUseSSL: boolean;
+ objectStorageUseProxy: boolean;
+ objectStorageSetPublicRead: boolean;
+ enableIpLogging: boolean;
+ enableActiveEmailValidation: boolean;
+ enableVerifymailApi: boolean;
+ verifymailAuthKey: string | null;
+ enableChartsForRemoteUser: boolean;
+ enableChartsForFederatedInstances: boolean;
+ enableServerMachineStats: boolean;
+ enableIdenticonGeneration: boolean;
+ manifestJsonOverride: string;
+ policies: Record;
+ enableFanoutTimeline: boolean;
+ enableFanoutTimelineDbFallback: boolean;
+ perLocalUserUserTimelineCacheMax: number;
+ perRemoteUserUserTimelineCacheMax: number;
+ perUserHomeTimelineCacheMax: number;
+ perUserListTimelineCacheMax: number;
+ notesPerOneAd: number;
+ backgroundImageUrl: string | null;
+ deeplAuthKey: string | null;
+ deeplIsPro: boolean;
+ defaultDarkTheme: string | null;
+ defaultLightTheme: string | null;
+ description: string | null;
+ disableRegistration: boolean;
+ impressumUrl: string | null;
+ maintainerEmail: string | null;
+ maintainerName: string | null;
+ name: string | null;
+ objectStorageS3ForcePathStyle: boolean;
+ privacyPolicyUrl: string | null;
+ repositoryUrl: string;
+ summalyProxy: string | null;
+ themeColor: string | null;
+ tosUrl: string | null;
+ uri: string;
+ version: string;
+ };
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/abuse-user-reports
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/abuse-user-reports': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ /** @default null */
+ state?: string | null;
+ /**
+ * @default combined
+ * @enum {string}
+ */
+ reporterOrigin?: 'combined' | 'local' | 'remote';
+ /**
+ * @default combined
+ * @enum {string}
+ */
+ targetUserOrigin?: 'combined' | 'local' | 'remote';
+ /** @default false */
+ forwarded?: boolean;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': ({
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ comment: string;
+ /** @example false */
+ resolved: boolean;
+ /** Format: id */
+ reporterId: string;
+ /** Format: id */
+ targetUserId: string;
+ /** Format: id */
+ assigneeId: string | null;
+ reporter: components['schemas']['User'];
+ targetUser: components['schemas']['User'];
+ assignee?: components['schemas']['User'] | null;
+ })[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/accounts/create
+ * @description No description provided.
+ *
+ * **Credential required**: *No*
+ */
+ 'admin/accounts/create': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ username: string;
+ password: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': components['schemas']['User'];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/accounts/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/accounts/delete': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ userId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/accounts/find-by-email
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/accounts/find-by-email': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ email: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/ad/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/ad/create': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ url: string;
+ memo: string;
+ place: string;
+ priority: string;
+ ratio: number;
+ expiresAt: number;
+ startsAt: number;
+ imageUrl: string;
+ dayOfWeek: number;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/ad/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/ad/delete': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/ad/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/ad/list': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ /** @default null */
+ publishing?: boolean | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/ad/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/ad/update': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ memo: string;
+ url: string;
+ imageUrl: string;
+ place: string;
+ priority: string;
+ ratio: number;
+ expiresAt: number;
+ startsAt: number;
+ dayOfWeek: number;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/announcements/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/announcements/create': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ title: string;
+ text: string;
+ imageUrl: string | null;
+ /**
+ * @default info
+ * @enum {string}
+ */
+ icon?: 'info' | 'warning' | 'error' | 'success';
+ /**
+ * @default normal
+ * @enum {string}
+ */
+ display?: 'normal' | 'banner' | 'dialog';
+ /** @default false */
+ forExistingUsers?: boolean;
+ /** @default false */
+ silence?: boolean;
+ /** @default false */
+ needConfirmationToRead?: boolean;
+ /**
+ * Format: misskey:id
+ * @default null
+ */
+ userId?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ title: string;
+ text: string;
+ imageUrl: string | null;
+ };
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/announcements/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/announcements/delete': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/announcements/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/announcements/list': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ /** Format: misskey:id */
+ userId?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': ({
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ text: string;
+ title: string;
+ imageUrl: string | null;
+ reads: number;
+ })[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/announcements/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/announcements/update': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ title?: string;
+ text?: string;
+ imageUrl?: string | null;
+ /** @enum {string} */
+ icon?: 'info' | 'warning' | 'error' | 'success';
+ /** @enum {string} */
+ display?: 'normal' | 'banner' | 'dialog';
+ forExistingUsers?: boolean;
+ silence?: boolean;
+ needConfirmationToRead?: boolean;
+ isActive?: boolean;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/avatar-decorations/create
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/avatar-decorations/create': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ name: string;
+ description: string;
+ url: string;
+ roleIdsThatCanBeUsedThisDecoration?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/avatar-decorations/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/avatar-decorations/delete': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/avatar-decorations/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/avatar-decorations/list': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ /** Format: misskey:id */
+ userId?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': ({
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ updatedAt: string | null;
+ name: string;
+ description: string;
+ url: string;
+ roleIdsThatCanBeUsedThisDecoration: string[];
+ })[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/avatar-decorations/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/avatar-decorations/update': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ name?: string;
+ description?: string;
+ url?: string;
+ roleIdsThatCanBeUsedThisDecoration?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/delete-all-files-of-a-user
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/delete-all-files-of-a-user': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ userId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/unset-user-avatar
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/unset-user-avatar': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ userId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/unset-user-banner
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/unset-user-banner': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ userId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/drive/clean-remote-files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/drive/clean-remote-files': {
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/drive/cleanup
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/drive/cleanup': {
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/drive/files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/drive/files': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ /** Format: misskey:id */
+ userId?: string | null;
+ type?: string | null;
+ /**
+ * @default local
+ * @enum {string}
+ */
+ origin?: 'combined' | 'local' | 'remote';
+ /**
+ * @description The local host is represented with `null`.
+ * @default null
+ */
+ hostname?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': components['schemas']['DriveFile'][];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/drive/show-file
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/drive/show-file': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ fileId?: string;
+ url?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': {
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ id: string;
+ /** Format: date-time */
+ createdAt: string;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ userId: string | null;
+ /** @description The local host is represented with `null`. */
+ userHost: string | null;
+ /**
+ * Format: md5
+ * @example 15eca7fba0480996e2245f5185bf39f2
+ */
+ md5: string;
+ /** @example lenna.jpg */
+ name: string;
+ /** @example image/jpeg */
+ type: string;
+ /** @example 51469 */
+ size: number;
+ comment: string | null;
+ blurhash: string | null;
+ properties: Record;
+ /** @example true */
+ storedInternal: boolean | null;
+ /** Format: url */
+ url: string | null;
+ /** Format: url */
+ thumbnailUrl: string | null;
+ /** Format: url */
+ webpublicUrl: string | null;
+ accessKey: string | null;
+ thumbnailAccessKey: string | null;
+ webpublicAccessKey: string | null;
+ uri: string | null;
+ src: string | null;
+ /**
+ * Format: id
+ * @example xxxxxxxxxx
+ */
+ folderId: string | null;
+ isSensitive: boolean;
+ isLink: boolean;
+ };
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/add-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/add-aliases-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ aliases: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/add
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/add': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ name: string;
+ /** Format: misskey:id */
+ fileId: string;
+ /** @description Use `null` to reset the category. */
+ category?: string | null;
+ aliases?: string[];
+ license?: string | null;
+ isSensitive?: boolean;
+ localOnly?: boolean;
+ roleIdsThatCanBeUsedThisEmojiAsReaction?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/copy
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/copy': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ emojiId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': {
+ /** Format: id */
+ id: string;
+ };
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/delete-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/delete-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/delete
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/delete': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/list-remote
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/list-remote': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default null */
+ query?: string | null;
+ /**
+ * @description Use `null` to represent the local host.
+ * @default null
+ */
+ host?: string | null;
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': ({
+ /** Format: id */
+ id: string;
+ aliases: string[];
+ name: string;
+ category: string | null;
+ /** @description The local host is represented with `null`. */
+ host: string | null;
+ url: string;
+ })[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/list
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/list': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @default null */
+ query?: string | null;
+ /** @default 10 */
+ limit?: number;
+ /** Format: misskey:id */
+ sinceId?: string;
+ /** Format: misskey:id */
+ untilId?: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': ({
+ /** Format: id */
+ id: string;
+ aliases: string[];
+ name: string;
+ category: string | null;
+ /** @description The local host is represented with `null`. The field exists for compatibility with other API endpoints that return files. */
+ host: string | null;
+ url: string;
+ })[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/remove-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/remove-aliases-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ aliases: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/set-aliases-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/set-aliases-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ aliases: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/set-category-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/set-category-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ /** @description Use `null` to reset the category. */
+ category?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/set-license-bulk
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/set-license-bulk': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ ids: string[];
+ /** @description Use `null` to reset the license. */
+ license?: string | null;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/emoji/update
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/emoji/update': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** Format: misskey:id */
+ id: string;
+ name: string;
+ /** Format: misskey:id */
+ fileId?: string;
+ /** @description Use `null` to reset the category. */
+ category?: string | null;
+ aliases: string[];
+ license?: string | null;
+ isSensitive?: boolean;
+ localOnly?: boolean;
+ roleIdsThatCanBeUsedThisEmojiAsReaction?: string[];
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/federation/delete-all-files
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/federation/delete-all-files': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ host: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/federation/refresh-remote-instance-metadata
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/federation/refresh-remote-instance-metadata': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ host: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/federation/remove-all-following
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/federation/remove-all-following': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ host: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/federation/update-instance
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/federation/update-instance': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ host: string;
+ isSuspended: boolean;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/get-index-stats
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/get-index-stats': {
+ responses: {
+ /** @description OK (without any results) */
+ 204: {
+ content: never;
+ };
+ /** @description Client error */
+ 400: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
+ /**
+ * admin/get-table-stats
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes*
+ */
+ 'admin/get-table-stats': {
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ content: {
+ 'application/json': Record