diff --git a/.config/example.yml b/.config/example.yml
index 49922d65ae..46efda9142 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -192,6 +192,9 @@ reservedUsernames: [
 # Proxy remote files (default: false)
 #proxyRemoteFiles: true
 
+# Use authorized fetch for outgoing requests
+signToActivityPubGet: true
+
 #allowedPrivateNetworks: [
 #  '127.0.0.1/32'
 #]
diff --git a/.gitignore b/.gitignore
index 0a1a09c90d..3c55ec0d78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,6 +57,9 @@ packages/backend/assets/LICENSE
 !/packages/backend/src/db
 !/packages/backend/src/server/api/endpoints/drive/files
 
+packages/megalodon/lib
+packages/megalodon/.idea
+
 # blender backups
 *.blend1
 *.blend2
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b9529ea737..743eaef005 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -94,9 +94,9 @@ An actual domain will be assigned so you can test the federation.
 	- The tag name must be the version
 
 ## Development
-During development, it is useful to use the `yarn dev` command.
+During development, it is useful to use the `pnpm run dev` command.
 This command monitors the server-side and client-side source files and automatically builds them if they are modified.
-In addition, it will also automatically start the Misskey server process.
+In addition, it will also automatically start the Firefish server process.
 
 ## Testing
 - Test codes are located in [`/test`](/test).
@@ -119,20 +119,13 @@ yarn test
 
 #### Run specify test
 ```
-TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" yarn dlx mocha test/foo.ts --require ts-node/register
+TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" pnpx mocha test/foo.ts --require ts-node/register
 ```
 
-### e2e tests
-TODO
-
-## Continuous integration
-Misskey uses GitHub Actions for executing automated tests.
-Configuration files are located in [`/.github/workflows`](/.github/workflows).
-
 ## Vue
-Misskey uses Vue(v3) as its front-end framework.
+Firefish uses Vue(v3) as its front-end framework.
 - Use TypeScript.
-- **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
+- **When creating a new component, please use the Composition API (with [setup syntax](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref syntax](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
 	- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
 
 ## nirax
diff --git a/Dockerfile b/Dockerfile
index 7ba32ba832..1b94fc9b43 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 ## Install dev and compilation dependencies, build files
-FROM node:latest as build
+FROM node:20 as build
 WORKDIR /firefish
 
 # Install compilation dependencies
@@ -26,6 +26,7 @@ COPY packages/backend/package.json packages/backend/package.json
 COPY packages/client/package.json packages/client/package.json
 COPY packages/sw/package.json packages/sw/package.json
 COPY packages/firefish-js/package.json packages/firefish-js/package.json
+COPY packages/megalodon/package.json packages/megalodon/package.json
 COPY packages/backend/native-utils/package.json packages/backend/native-utils/package.json
 COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/backend/native-utils/npm/linux-x64-musl/package.json
 COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json
@@ -47,7 +48,7 @@ RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pn
 RUN pnpm i --prod --frozen-lockfile
 
 ## Runtime container
-FROM node:latest
+FROM node:20
 WORKDIR /firefish
 
 # Install runtime dependencies
@@ -55,6 +56,8 @@ RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg
 
 COPY . ./
 
+COPY --from=build /firefish/packages/megalodon /firefish/packages/megalodon
+
 # Copy node modules
 COPY --from=build /firefish/node_modules /firefish/node_modules
 COPY --from=build /firefish/packages/backend/node_modules /firefish/packages/backend/node_modules
diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl
index 1b23250a84..215d209eef 100644
--- a/chart/templates/_helpers.tpl
+++ b/chart/templates/_helpers.tpl
@@ -98,11 +98,11 @@ url: "https://{{ .Values.firefish.domain }}/"
 #───┘ Port and TLS settings └───────────────────────────────────
 
 #
-# Misskey requires a reverse proxy to support HTTPS connections.
+# Firefish requires a reverse proxy to support HTTPS connections.
 #
 #                 +----- https://example.tld/ ------------+
 #   +------+      |+-------------+      +----------------+|
-#   | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
+#   | User | ---> || Proxy (443) | ---> | Firefish (3000) ||
 #   +------+      |+-------------+      +----------------+|
 #                 +---------------------------------------+
 #
@@ -110,7 +110,7 @@ url: "https://{{ .Values.firefish.domain }}/"
 #   An encrypted connection with HTTPS is highly recommended
 #   because tokens may be transferred in GET requests.
 
-# The port that your Misskey server should listen on.
+# The port that your Firefish server should listen on.
 port: 3000
 
 #   ┌──────────────────────────┐
diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js
index f73a25efbc..295f419993 100644
--- a/cypress/e2e/basic.cy.js
+++ b/cypress/e2e/basic.cy.js
@@ -139,10 +139,10 @@ describe("After user singed in", () => {
 
 	it("note", () => {
 		cy.get("[data-cy-open-post-form]").click();
-		cy.get("[data-cy-post-form-text]").type("Hello, Misskey!");
+		cy.get("[data-cy-post-form-text]").type("Hello, Firefish!");
 		cy.get("[data-cy-open-post-form-submit]").click();
 
-		cy.contains("Hello, Misskey!");
+		cy.contains("Hello, Firefish!");
 	});
 });
 
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml
index 341b66cb34..ce6a70199b 100644
--- a/locales/ca-ES.yml
+++ b/locales/ca-ES.yml
@@ -1550,7 +1550,7 @@ troubleshooting: Resolució de problemes
 learnMore: Més informació
 misskeyUpdated: Firefish s'ha actualitzat!
 translate: Tradueix
-translatedFrom: Traduït desde {x}
+translatedFrom: Traduït del {x}
 aiChanMode: Ai-chan a la interfície d'usuari clàssica
 keepCw: Mantenir els avisos de contingut
 pubSub: Comptes Pub/Sub
diff --git a/locales/de-DE.yml b/locales/de-DE.yml
index 9521870fd8..693b521c43 100644
--- a/locales/de-DE.yml
+++ b/locales/de-DE.yml
@@ -402,6 +402,8 @@ withReplies: "Antworten beinhalten"
 connectedTo: "Mit folgenden Nutzerkonten verknüpft"
 notesAndReplies: "Beiträge und Antworten"
 withFiles: "Beiträge mit Dateien"
+attachedToNotes: "Beiträge mit dieser Datei"
+showAttachedNotes: "Zeige Beiträge mit dieser Datei"
 silence: "stummschalten"
 silenceConfirm: "Sind Sie sicher, dass Sie diesen Benutzer Stummschalten möchten?"
 unsilence: "Stummschaltung aufheben"
diff --git a/locales/en-US.yml b/locales/en-US.yml
index af4e5a2824..9e9c36deb1 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -168,11 +168,11 @@ cacheRemoteFiles: "Cache remote files"
 cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded
   directly from the remote server. Disabling this will decrease storage usage, but
   increase traffic, as thumbnails will not be generated."
-flagAsBot: "Mark this account as a bot"
+flagAsBot: "Mark this account as automated"
 flagAsBotDescription: "Enable this option if this account is controlled by a program.
   If enabled, it will act as a flag for other developers to prevent endless interaction
-  chains with other bots and adjust Firefish's internal systems to treat this account
-  as a bot."
+  chains with other automated accounts and adjust Firefish's internal systems to treat this
+  account as an automated account."
 flagAsCat: "Are you a cat? 😺"
 flagAsCatDescription: "You'll get cat ears and speak like a cat!"
 flagSpeakAsCat: "Speak as a cat"
@@ -429,6 +429,8 @@ withReplies: "Include replies"
 connectedTo: "Following account(s) are connected"
 notesAndReplies: "Posts and replies"
 withFiles: "Including files"
+attachedToNotes: "Posts with this file"
+showAttachedNotes: "Show posts with this file"
 silence: "Silence"
 silenceConfirm: "Are you sure that you want to silence this user?"
 unsilence: "Undo silencing"
@@ -1116,7 +1118,7 @@ noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it int
   with Firefish."
 silencedWarning: "This page is showing because these users are from servers your admin
   silenced, so they may potentially be spam."
-isBot: "This account is a bot"
+isBot: "This account is automated"
 isLocked: "This account has follow approvals"
 isModerator: "Moderator"
 isAdmin: "Administrator"
diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml
index 9cd2d1e3c2..f6c2eb55f1 100644
--- a/locales/fr-FR.yml
+++ b/locales/fr-FR.yml
@@ -114,7 +114,7 @@ you: "Vous"
 clickToShow: "Cliquer pour afficher"
 sensitive: "Contenu sensible"
 add: "Ajouter"
-reaction: "Réactions"
+reaction: "Réaction"
 reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
 reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser
   « + » pour ajouter."
@@ -1148,7 +1148,7 @@ _wordMute:
   langDescription: Cacher du fil de publication les publications qui correspondent
     à ces langues.
   muteLangs: Langages filtrés
-  muteLangsDescription: Séparer avec des espaces or des retours à la ligne pour une
+  muteLangsDescription: Séparer avec des espaces ou des retours à la ligne pour une
     condition OU (OR).
 _instanceMute:
   instanceMuteDescription2: "Séparer avec des sauts de lignes"
@@ -2225,3 +2225,14 @@ indexable: Indexable
 languageForTranslation: Langage post-traduction
 vibrate: Jouer les vibrations
 clickToShowPatterns: Cliquer pour montrer les patrons de modules
+iconSet: Jeu d'icônes
+_iconSets:
+  fill: Rempli
+  regular: Normal
+  bold: Gras
+  duotone: Deux tons
+  light: Fin
+reactions: Réactions
+replies: Réponses
+quotes: Citations
+renotes: Boosts
diff --git a/locales/gl.yml b/locales/gl.yml
index 3b8d60181a..eada0c213b 100644
--- a/locales/gl.yml
+++ b/locales/gl.yml
@@ -1,4 +1,4 @@
-_lang_: Inglés
+_lang_: Galego
 introFirefish: Benvida! Firefish é unha plataforma de medios sociais de código aberto,
   descentralizada e gratuíta para sempre!🚀
 monthAndDay: '{day}/{month}'
diff --git a/locales/id-ID.yml b/locales/id-ID.yml
index 9bd99d40cc..22e0040ce8 100644
--- a/locales/id-ID.yml
+++ b/locales/id-ID.yml
@@ -148,11 +148,11 @@ cacheRemoteFiles: "Tembolokkan berkas remote"
 cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas luar akan
   dimuat langsung dari server luar. Menonaktifkan ini akan mengurangi penggunaan penyimpanan,
   tapi dapat menyebabkan meningkatkan lalu lintas, mengingat keluku tidak akan dihasilkan."
-flagAsBot: "Atur akun ini sebagai Bot"
-flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini.
+flagAsBot: "Tandai akun ini sebagai akun otomatis"
+flagAsBotDescription: "Jika akun ini dikendalikan oleh program, aktifkan opsi ini.
   Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah
-  interaksi berantai dengan bot lain dan menyesuaikan sistem internal Firefish untuk
-  memperlakukan akun ini sebagai bot."
+  interaksi berantai dengan akun otomatis lain dan menyesuaikan sistem internal Firefish
+  untuk memperlakukan akun ini sebagai akun otomatis."
 flagAsCat: "Atur akun ini sebagai kucing"
 flagAsCatDescription: "Kamu akan mendapatkan telinga kucing dan berbicara seperti
   seekor kucing!"
@@ -2005,7 +2005,7 @@ signupsDisabled: Pendaftaran ke server ini nonaktif, tapi kamu dapat selalu mend
   ke server lain! Jika kamu memiliki kode undangan server ini, harap masukkan di bawah
   ini.
 enableCustomKaTeXMacro: Aktifkan makro KaTeX khusus
-isBot: Akun ini bot
+isBot: Akun ini akun otomatis
 customMOTD: MOTD khusus (pesan layar percik)
 recommendedInstancesDescription: Server yang direkomendasikan dipisahkan dengan garis
   baru untuk tampil di linimasa rekomendasi.
@@ -2181,3 +2181,14 @@ openServerInfo: Tampilkan informasi server dengan mengeklik ticker server di seb
   kiriman
 vibrate: Putar getaran
 clickToShowPatterns: Klik untuk menampilkan pola modul
+iconSet: Set ikon
+_iconSets:
+  fill: Penuh
+  regular: Reguler
+  bold: Tebal
+  duotone: Duotone
+  light: Tipis
+reactions: Reaksi
+replies: Balasan
+quotes: Kutipan
+renotes: Postingan ulang
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index dc9da6dc7f..01e529673b 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -147,11 +147,11 @@ cacheRemoteFiles: "Mantieni i file remoti nella cache"
 cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno
   scaricati direttamente dal loro server. L'opzione permette di risparmiare spazio
   ma aumenta il traffico di rete e non verranno generate anteprime."
-flagAsBot: "Questo account è un bot"
+flagAsBot: "Questo account è automatizzato"
 flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche,
-  attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori
-  allo scopo di prevenire catene d’interazione senza fine con altri bot, e di adeguare
-  i sistemi interni di Firefish perché trattino questo account come un bot."
+  attiva quest'opzione. Quando attivata, permette agli sviluppatori di prevenire catene
+  d’interazione senza fine con altri account automatizzati. Inoltre imposta Firefish
+  perché tratti questo account come automatizzato."
 flagAsCat: "Sei un gatto? 😺"
 flagAsCatDescription: "Ti compariranno le orecchie e parlerai come un gatto!"
 autoAcceptFollowed: "Accetta in automatico i follow dagli account che segui"
@@ -2079,7 +2079,7 @@ noGraze: Per favore disattiva l'estenzione del browser "Graze for Mastodon", per
   interferisce con Firefish.
 silencedWarning: Vedi questa pagina perché gli utenti sono su un server che il tuo
   admin ha silenziato, quindi potrebbero essere spam.
-isBot: Questo account è un bot
+isBot: Questo account è automatizzato
 isLocked: Serve una approvazione per seguire questo account
 moveFromDescription: Questa operazione crea un alias del vecchio account in modo che
   tu possa migrare su questo nuovo account. Fallo PRIMA di migrare il tuo vecchio
@@ -2169,3 +2169,14 @@ openServerInfo: Mostra informazioni sul server cliccando sul riquadro del server
   un post
 vibrate: Abilita la vibrazione
 clickToShowPatterns: Clicca per vedere i pattern del modulo
+iconSet: Set di icone
+_iconSets:
+  fill: Con riempimento
+  regular: Regolare
+  bold: Grassetto
+  duotone: Con due toni
+  light: Sottile
+reactions: Reazioni
+replies: Risposte
+quotes: Citazioni
+renotes: Boost
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 31d817b7b0..53d2ca692b 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -149,8 +149,8 @@ addEmoji: "絵文字を追加"
 settingGuide: "おすすめ設定"
 cacheRemoteFiles: "リモートのファイルをキャッシュする"
 cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
-flagAsBot: "Botとして設定"
-flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いがBotに合ったものになります。"
+flagAsBot: "自動化されたアカウントとして設定"
+flagAsBotDescription: "このアカウントが自動で投稿する場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いが自動で投稿するアカウントに合ったものになります。"
 flagAsCat: "あなたは…猫?😺"
 flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。"
 flagSpeakAsCat: "猫語で話す"
@@ -384,6 +384,8 @@ withReplies: "返信を含む"
 connectedTo: "次のアカウントに接続されています"
 notesAndReplies: "投稿と返信"
 withFiles: "ファイル付き"
+attachedToNotes: "このファイルが添付された投稿"
+showAttachedNotes: "このファイルが添付された投稿を見る"
 silence: "サイレンス"
 silenceConfirm: "サイレンスしますか?"
 unsilence: "サイレンス解除"
@@ -1954,7 +1956,7 @@ isModerator: モデレーター
 audio: 音声
 image: 画像
 video: 動画
-isBot: このアカウントはBotです
+isBot: このアカウントは自動で投稿します
 isLocked: このアカウントのフォローは承認制です
 isAdmin: 管理者
 isPatron: Firefish 後援者
diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml
index c768084362..4f77592dcd 100644
--- a/locales/ja-KS.yml
+++ b/locales/ja-KS.yml
@@ -1444,7 +1444,12 @@ _tutorial:
   step4_1: 投稿しとーみ
   step5_1: タイムライン! 文字と写真の宝石箱や~
   step5_2: うちのサーバーでは{timelines}種類のタイムラインをご用意しとります。
-  step4_2: 最初は{introduction}に投稿したり、シンプルに「ここは賑やかどすなぁ。うちはそこまで喋れまへんが、どうぞよろしゅうに」などと投稿しはる方もいてます。
+  step4_2: 最初は{introduction}に投稿したり、シンプルに「ここは賑やかどすなぁ。ウチはそんなに喋れまへんが、どうぞよろしゅうに」などと投稿しはる方もいてます。
+  step5_7: グローバル{icon}タイムラインでは、接続しとるそこいらのサーバーからアレがガーッ流れてきてえらいこっちゃで。
+  step5_6: おすすめ{icon}タイムラインでは、うちの管理人がばりおすすめしとるサーバーの投稿を表示させとうよ。
+  step5_5: ソーシャル{icon}タイムラインでは、ホームタイムラインとローカルタイムラインの投稿が両方見られてホンマお得やわぁ。
+  step5_3: ホーム{icon}タイムラインでは、あんたはんがフォローしてはる兄ちゃんらの投稿が見られまんねん。
+  step5_4: ローカル{icon}タイムラインでは、このサーバーにおる人らの投稿を見られますわ。
 _postForm:
   _placeholders:
     b: なんかおましたか?
diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml
index 5b83762cd5..1369babee2 100644
--- a/locales/pl-PL.yml
+++ b/locales/pl-PL.yml
@@ -1,6 +1,6 @@
 _lang_: "Polski"
-headlineFirefish: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która zawsze
-  będzie darmowa! 🚀"
+headlineFirefish: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która
+  zawsze będzie darmowa! 🚀"
 introFirefish: "Hej! Firefish to otwartoźródłowa oraz zdecentralizowana sieć społecznościowa,
   która zawsze będzie darmowa! 🚀"
 monthAndDay: "{month}-{day}"
@@ -94,7 +94,7 @@ privacy: "Prywatność"
 makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia"
 defaultNoteVisibility: "Domyślna widoczność"
 follow: "Obserwuj"
-followRequest: "Poproś o możliwość obserwacji"
+followRequest: "Poproś o możliwość obserwowania"
 followRequests: "Prośby o możliwość obserwacji"
 unfollow: "Przestań obserwować"
 followRequestPending: "Oczekująca prośba o możliwość obserwacji"
@@ -147,9 +147,9 @@ cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ł
   bezpośrednio ze zdalnego serwera. Wyłączenie tej opcji zmniejszy użycie powierzchni
   dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
 flagAsBot: "To konto jest botem"
-flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw
-  tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów,
-  aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne
+flagAsBotDescription: "Ustaw tę opcję ten jeśli kanał kontrolowany jest przez jakiś
+  program. Po włączeniu, będzie działać jako flaga informująca innych programistów,
+  aby zapobiegać nieskończonej interakcji pomiędzy innymi botami i dostosowywać wewnętrzne
   systemy Firefish, traktując konto jako bota."
 flagAsCat: "Czy jesteś kotem? 😺"
 flagAsCatDescription: "Dostaniesz kocie uszka, oraz będziesz mówić jak kot!"
@@ -158,7 +158,7 @@ autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od
   których obserwujesz"
 addAccount: "Dodaj konto"
 loginFailed: "Nie udało się zalogować"
-showOnRemote: "Zobacz na zdalnym serwerze"
+showOnRemote: "Zobacz oryginalną treść"
 general: "Ogólne"
 wallpaper: "Tapeta"
 setWallpaper: "Ustaw tapetę"
@@ -211,7 +211,7 @@ noUsers: "Brak użytkowników"
 editProfile: "Edytuj profil"
 noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?"
 pinLimitExceeded: "Nie możesz przypiąć więcej wpisów"
-intro: "Zakończono instalację Firefish! Utwórz konto administratora."
+intro: "Zakończono instalację Firefish! Utwórz teraz konto administratora."
 done: "Gotowe"
 processing: "Przetwarzanie"
 preview: "Podgląd"
@@ -299,11 +299,11 @@ emptyDrive: "Dysk jest pusty"
 emptyFolder: "Ten katalog jest pusty"
 unableToDelete: "Nie można usunąć"
 inputNewFileName: "Wprowadź nową nazwę pliku"
-inputNewDescription: "Proszę wpisać nowy napis"
+inputNewDescription: "Podaj nowy napis"
 inputNewFolderName: "Wprowadź nową nazwę katalogu"
 circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz
   przenieść."
-hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty."
+hasChildFilesOrFolders: "Katalog nie może być usunięty ponieważ nie jest pusty."
 copyUrl: "Skopiuj adres URL"
 rename: "Zmień nazwę"
 avatar: "Awatar"
@@ -578,8 +578,8 @@ disablePlayer: "Zamknij odtwarzacz wideo"
 expandTweet: "Rozwiń tweet"
 themeEditor: "Edytor motywu"
 description: "Opis"
-describeFile: "Dodaj podpis"
-enterFileDescription: "Wprowadź napis"
+describeFile: "Dodaj opis"
+enterFileDescription: "Wprowadź opis"
 author: "Autor"
 leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
 manage: "Zarządzanie"
@@ -616,7 +616,7 @@ emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć w
   SMTP"
 smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
 testEmail: "Przetestuj dostarczanie wiadomości e-mail"
-wordMute: "Wyciszenie słowa"
+wordMute: "Wyciszenie słów i języków"
 instanceMute: "Wyciszenie serwera"
 userSaysSomething: "{name} powiedział* coś"
 makeActive: "Aktywuj"
@@ -691,8 +691,7 @@ no: "Nie"
 driveFilesCount: "Liczba plików na dysku"
 driveUsage: "Użycie przestrzeni dyskowej"
 noCrawle: "Odrzuć indeksowanie przez crawlery"
-noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu,
-  wpisów, stron itd."
+noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twoich treści."
 lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje
   wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie obserwujących."
 alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
@@ -759,7 +758,7 @@ useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
 typingUsers: "{users} pisze/ą"
 jumpToSpecifiedDate: "Przejdź do określonej daty"
 showingPastTimeline: "Obecnie wyświetla starą oś czasu"
-clear: "Wróć"
+clear: "Wyczyść"
 markAllAsRead: "Oznacz wszystkie jako przeczytane"
 goBack: "Wróć"
 unlikeConfirm: "Na pewno chcesz usunąć polubienie?"
@@ -800,7 +799,7 @@ gallery: "Galeria"
 recentPosts: "Ostatnie wpisy"
 popularPosts: "Popularne wpisy"
 shareWithNote: "Udostępnij z wpisem"
-ads: "Reklamy"
+ads: "Banery"
 expiration: "Ankieta kończy się"
 memo: "Notatki"
 priority: "Priorytet"
@@ -852,7 +851,7 @@ ffVisibility: "Widoczność obserwowanych/obserwujących"
 ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz
   i kto Cię obserwuje."
 continueThread: "Kontynuuj wątek"
-deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
+deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie tego konta. Kontynuować?"
 incorrectPassword: "Nieprawidłowe hasło."
 voteConfirm: "Potwierdzić swój głos na \"{choice}\"?"
 hide: "Ukryj"
@@ -1001,8 +1000,8 @@ _nsfw:
   force: "Ukrywaj wszystkie media"
 _mfm:
   cheatSheet: "Ściąga MFM"
-  intro: "MFM jest językiem składniowym używanym przez m.in. Firefish, forki *key (w
-    tym Firefish), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz
+  intro: "MFM jest językiem składniowym używanym przez m.in. Firefish, forki *key
+    (w tym Firefish), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz
     listę wszystkich możliwych elementów składni MFM."
   dummy: "Firefish rozszerza świat Fediwersum"
   mention: "Wspomnij"
@@ -1250,7 +1249,7 @@ _tutorial:
     innej połączonej instancji."
   step6_1: "Więc, czym to jest to miejsce?"
   step6_2: "Cóż, nie dołączył*ś po prostu do Firefish. Dołączył*ś do portalu do Fediverse,
-    połączonej sieci tysięcy serwerów, zwanych instancjami."
+    sieci tysięcy połączonych ze sobą serwerów, zwanych instancjami."
   step6_3: "Każdy serwer działa w inny sposób, i nie wszystkie serwery używają Firefish.
     Ten jednak używa! Jest to trochę skomplikowane, ale w krótkim czasie załapiesz
     o co chodzi."
@@ -1816,8 +1815,8 @@ instanceSecurity: Bezpieczeństwo serwera
 privateMode: Tryb prywatny
 allowedInstances: Dopuszczone serwery
 recommended: Polecane
-allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji,
-  każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego).
+allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji.
+  Każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego).
 seperateRenoteQuote: Oddziel przyciski podbicia i cytowania
 refreshInterval: 'Częstotliwość aktualizacji '
 slow: Wolna
@@ -1916,14 +1915,14 @@ sendErrorReportsDescription: "Gdy ta opcja jest włączona, szczegółowe inform
   błędach będą udostępnianie z Firefish gdy wystąpi problem, pomagając w ulepszaniu
   Firefish.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego, przeglądarki,
   Twoja aktywność na Firefish itd."
-privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z białej listy mogą federować
-  się z twoim serwerem. Wszystkie posty będą ukryte publicznie.
+privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z listy serwerów dozwolonych
+  mogą federować się z twoim serwerem. Żadne posty nie będą publicznie dostępne.
 oneHour: Godzina
 oneDay: Dzień
 oneWeek: Tydzień
 recommendedInstances: Polecane serwery
 recommendedInstancesDescription: Polecane serwery, mające pojawić się w odpowiedniej
-  osi czasu, oddzielane nowymi liniami. NIE dodawaj “https://”, TYLKO samą domenę.
+  osi czasu, oddzielane nowymi liniami.
 rateLimitExceeded: Przekroczono ratelimit
 cropImage: Kadruj zdjęcie
 cropImageAsk: Czy chcesz skadrować to zdjęcie?
@@ -1948,7 +1947,7 @@ activeEmailValidationDescription: Włącza ściślejszą walidację adresów e-m
   obejmuje sprawdzanie adresów jednorazowych oraz tego, czy rzeczywiście można się
   z nim komunikować. Jeśli wyłączone, walidowany jest tylko format wiadomości e-mail.
 shuffle: Losuj
-showAds: Pokazuj reklamy
+showAds: Pokazuj banery
 enterSendsMessage: Wciśnij Enter w komunikatorze, by wysłać wiadomość (domyślnie –
   Ctrl + Enter)
 adminCustomCssWarn: To ustawienie powinno być używane tylko pod warunkiem, że wiesz
@@ -2012,7 +2011,7 @@ silencedInstancesDescription: Wypisz nazwy hostów serwerów, które chcesz wyci
 cannotUploadBecauseExceedsFileSizeLimit: Ten plik nie mógł być przesłany, ponieważ
   jego wielkość przekracza dozwolony limit.
 sendModMail: Wyślij Powiadomienie Moderacyjne
-searchPlaceholder: Szukaj Firefish
+searchPlaceholder: Szukaj w Firefish
 jumpToPrevious: Przejdź do poprzedniej sekcji
 listsDesc: Listy umożliwiają tworzenie osi czasu z określonymi użytkownikami. Dostęp
   do nich można uzyskać na stronie osi czasu.
@@ -2028,3 +2027,15 @@ newer: nowsze
 older: starsze
 cw: Ostrzeżenie zawartości
 removeReaction: Usuń reakcję
+reactions: Reakcje
+clipsDesc: Spinki to skategoryzowane zakładki, które można udostępniać. Możesz utworzyć
+  spinkę dla każdego wpisu w menu wpisu.
+swipeOnMobile: Pozwalaj na przeciąganie pomiędzy stronami
+image: Obrazek
+xl: XL
+replies: Odpowiedzi
+video: Film
+quotes: Cytaty
+clickToShowPatterns: Kliknij aby pokazać wzory modułów
+renotes: Boosty
+audio: Dźwięk
diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml
index cb5ebabdc0..092b0ac751 100644
--- a/locales/pt-PT.yml
+++ b/locales/pt-PT.yml
@@ -1,4 +1,4 @@
-_lang_: "Português"
+_lang_: "Português (Portugal)"
 headlineFirefish: "Uma rede ligada por notas"
 introFirefish: "Bem-vindo! Firefish é um serviço de microblogue descentralizado de
   código aberto, gratuito para sempre! 🚀"
diff --git a/locales/pt_BR.yml b/locales/pt_BR.yml
index f8fb651182..deaa2f32d9 100644
--- a/locales/pt_BR.yml
+++ b/locales/pt_BR.yml
@@ -1,6 +1,6 @@
+_lang_: Português (Brasil)
 username: Nome de usuário
 ok: OK
-_lang_: Inglês
 headlineFirefish: Uma plataforma de mídia social descentralizada e de código aberto
   que é gratuita para sempre! 🚀
 search: Pesquisar
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index 7b9a24e2c8..cd6bf75cf2 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -2151,3 +2151,14 @@ deletePasskeysConfirm: Это действие безвозвратно удал
   на этом аккаунте. Продолжить?
 inputNotMatch: Введённые данные не совпадают
 addRe: Добавить "re:" в начале комментария в ответ на запись с предупреждением о содержимом
+detectPostLanguage: Автоматическое определение языка и отображение кнопки перевода
+  для сообщений на иностранных языках
+indexableDescription: Разрешить встроенной поисковой системе искать ваши публичные
+  записи
+reactions: Реакции
+indexable: Индексируемый(-ая)
+languageForTranslation: Язык перевода поста
+replies: Ответы
+quotes: Цитаты
+clickToShowPatterns: Нажмите, чтобы показать модуль шаблонов
+renotes: Репосты
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index 34cf9acf12..82b3276b62 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -1994,3 +1994,10 @@ indexable: 登錄至貼文搜尋引擎
 origin: 來源
 objectStorageS3ForcePathStyle: 使用基於路徑的端點(Endpoint)URL
 clickToShowPatterns: 點擊顯示模組模式(Module Pattern)
+iconSet: 圖示的樣式
+_iconSets:
+  fill: 填滿
+  regular: 標準
+  bold: 粗線
+  duotone: 雙色
+  light: 細線
diff --git a/package.json b/package.json
index 9d4519c727..adca980853 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
 {
 	"name": "firefish",
-	"version": "1.0.5-dev18",
+	"version": "1.0.5-dev21",
 	"codename": "aqua",
 	"repository": {
 		"type": "git",
 		"url": "https://git.joinfirefish.org/firefish/firefish.git"
 	},
-	"packageManager": "pnpm@8.8.0",
+	"packageManager": "pnpm@8.10.5",
 	"private": true,
 	"scripts": {
 		"rebuild": "pnpm run clean && pnpm run build",
@@ -19,7 +19,7 @@
 		"migrateandstart": "pnpm run migrate && pnpm run start",
 		"gulp": "gulp build",
 		"watch": "pnpm run dev",
-		"dev": "pnpm node ./scripts/dev.js",
+		"dev": "pnpm node ./scripts/dev.mjs",
 		"dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development pnpm run build && pnpm run start",
 		"lint": "pnpm -r --parallel run lint",
 		"debug": "pnpm run build:debug && pnpm run start",
@@ -30,42 +30,42 @@
 		"mocha": "pnpm --filter backend run mocha",
 		"test": "pnpm run mocha",
 		"format": "pnpm -r --parallel run format",
-		"clean": "pnpm node ./scripts/clean.js",
-		"clean-all": "pnpm node ./scripts/clean-all.js",
+		"clean": "pnpm node ./scripts/clean.mjs",
+		"clean-all": "pnpm node ./scripts/clean-all.mjs",
 		"cleanall": "pnpm run clean-all"
 	},
 	"resolutions": {
 		"chokidar": "^3.3.1"
 	},
 	"dependencies": {
-		"@bull-board/api": "5.8.0",
-		"@bull-board/ui": "5.8.0",
-		"@napi-rs/cli": "^2.16.2",
-		"@tensorflow/tfjs": "^4.10.0",
+		"@bull-board/api": "5.9.1",
+		"@bull-board/ui": "5.9.1",
+		"@napi-rs/cli": "^2.16.5",
+		"@tensorflow/tfjs": "^4.13.0",
 		"js-yaml": "4.1.0",
 		"seedrandom": "^3.0.5"
 	},
 	"devDependencies": {
-		"@biomejs/biome": "1.0.0",
-		"@biomejs/cli-darwin-arm64": "^1.0.0",
-		"@biomejs/cli-darwin-x64": "^1.0.0",
-		"@biomejs/cli-linux-arm64": "^1.0.0",
-		"@biomejs/cli-linux-x64": "^1.0.0",
-		"@types/gulp": "4.0.13",
-		"@types/gulp-rename": "2.0.2",
-		"@types/node": "20.5.8",
+		"@biomejs/biome": "1.3.3",
+		"@biomejs/cli-darwin-arm64": "^1.3.3",
+		"@biomejs/cli-darwin-x64": "^1.3.3",
+		"@biomejs/cli-linux-arm64": "^1.3.3",
+		"@biomejs/cli-linux-x64": "^1.3.3",
+		"@types/gulp": "4.0.17",
+		"@types/gulp-rename": "2.0.5",
+		"@types/node": "20.9.0",
 		"add": "2.0.6",
 		"cross-env": "7.0.3",
-		"cypress": "10.11.0",
-		"execa": "5.1.1",
+		"cypress": "13.5.1",
+		"execa": "8.0.1",
 		"gulp": "4.0.2",
 		"gulp-cssnano": "2.1.3",
 		"gulp-rename": "2.0.0",
 		"gulp-replace": "1.1.4",
 		"gulp-terser": "2.1.0",
 		"install-peers": "^1.0.4",
-		"pnpm": "8.8.0",
-		"start-server-and-test": "1.15.2",
+		"pnpm": "8.10.5",
+		"start-server-and-test": "2.0.3",
 		"typescript": "5.2.2"
 	}
 }
diff --git a/packages/README.md b/packages/README.md
index 75e38a4940..ea04817f06 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -7,3 +7,4 @@ This directory contains all of the packages Firefish uses.
 - `client`: Web interface written in Vue3 and TypeScript
 - `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript
 - `firefish-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/firefish-js) for public use
+- `megalodon`: TypeScript library used for partial Mastodon API compatibility
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 2a84da576f..1b880121a0 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -23,36 +23,37 @@
 	},
 	"optionalDependencies": {
 		"@swc/core-android-arm64": "1.3.11",
-		"@tensorflow/tfjs-node": "3.21.1"
+		"@tensorflow/tfjs-node": "4.13.0"
 	},
 	"dependencies": {
-		"@bull-board/api": "5.8.0",
-		"@bull-board/koa": "5.8.0",
-		"@bull-board/ui": "5.8.0",
+		"@bull-board/api": "5.9.1",
+		"@bull-board/koa": "5.9.1",
+		"@bull-board/ui": "5.9.1",
 		"@discordapp/twemoji": "14.1.2",
-		"@elastic/elasticsearch": "7.17.0",
-		"@koa/cors": "3.4.3",
+		"@elastic/elasticsearch": "8.10.0",
+		"@koa/cors": "4.0.0",
 		"@koa/multer": "3.0.2",
-		"@koa/router": "9.0.1",
+		"@koa/router": "12.0.1",
+		"@ladjs/koa-views": "9.0.0",
 		"@peertube/http-signature": "1.7.0",
-		"@redocly/openapi-core": "1.0.2",
-		"@sinonjs/fake-timers": "9.1.2",
-		"@syuilo/aiscript": "0.11.1",
-		"@tensorflow/tfjs": "^4.2.0",
+		"@redocly/openapi-core": "1.4.1",
+		"@sinonjs/fake-timers": "11.2.2",
+		"@tensorflow/tfjs": "^4.13.0",
 		"adm-zip": "^0.5.10",
 		"ajv": "8.12.0",
-		"archiver": "6.0.0",
-		"argon2": "^0.31.1",
+		"archiver": "6.0.1",
+		"argon2": "^0.31.2",
 		"autolinker": "4.0.0",
 		"autwh": "0.1.0",
-		"aws-sdk": "2.1413.0",
-		"axios": "^1.4.0",
+		"aws-sdk": "2.1498.0",
+		"axios": "^1.6.2",
 		"bcryptjs": "2.4.3",
 		"blurhash": "2.0.5",
-		"bull": "4.11.3",
+		"bull": "4.11.5",
 		"cacheable-lookup": "TheEssem/cacheable-lookup",
+		"cbor-x": "^1.5.4",
 		"chalk": "5.3.0",
-		"chalk-template": "0.4.0",
+		"chalk-template": "1.1.0",
 		"chokidar": "^3.5.3",
 		"cli-highlight": "2.1.11",
 		"color-convert": "2.0.1",
@@ -62,19 +63,19 @@
 		"deep-email-validator": "0.1.21",
 		"escape-regexp": "0.0.1",
 		"feed": "4.2.2",
-		"file-type": "18.5.0",
+		"file-type": "18.7.0",
 		"firefish-js": "workspace:*",
 		"fluent-ffmpeg": "2.1.2",
 		"got": "13.0.0",
 		"gunzip-maybe": "^1.4.2",
-		"happy-dom": "^11.0.2",
+		"happy-dom": "^12.10.3",
 		"hpagent": "1.2.0",
 		"ioredis": "5.3.2",
 		"ip-cidr": "3.1.0",
 		"is-svg": "5.0.0",
 		"js-yaml": "4.1.0",
 		"json5": "2.2.3",
-		"jsonld": "8.2.1",
+		"jsonld": "8.3.1",
 		"jsrsasign": "10.8.6",
 		"koa": "2.14.2",
 		"koa-body": "^6.0.1",
@@ -86,33 +87,32 @@
 		"koa-remove-trailing-slashes": "2.0.3",
 		"koa-send": "5.0.1",
 		"koa-slow": "2.1.0",
-		"koa-views": "7.0.2",
-		"megalodon": "8.1.1",
-		"meilisearch": "0.34.1",
+		"megalodon": "workspace:*",
+		"meilisearch": "0.35.0",
 		"mfm-js": "0.23.3",
 		"mime-types": "2.1.35",
-		"msgpackr": "1.9.7",
-		"multer": "1.4.4-lts.1",
+		"msgpackr": "^1.9.9",
+		"multer": "1.4.5-lts.1",
 		"native-utils": "link:native-utils",
 		"nested-property": "4.0.0",
 		"node-fetch": "3.3.2",
-		"nodemailer": "6.9.4",
+		"nodemailer": "6.9.7",
 		"nsfwjs": "2.4.2",
 		"opencc-js": "^1.0.5",
 		"os-utils": "0.0.14",
-		"otpauth": "^9.1.4",
+		"otpauth": "^9.2.0",
 		"parse5": "7.1.2",
 		"pg": "8.11.3",
 		"private-ip": "3.0.1",
 		"probe-image-size": "7.2.3",
 		"promise-limit": "2.7.0",
-		"punycode": "2.3.0",
-		"pureimage": "0.4.8",
+		"punycode": "2.3.1",
+		"pureimage": "0.4.13",
 		"qrcode": "1.5.3",
 		"qs": "6.11.2",
 		"random-seed": "0.3.0",
 		"ratelimiter": "3.4.1",
-		"re2": "1.20.3",
+		"re2": "1.20.8",
 		"redis-semaphore": "5.5.0",
 		"reflect-metadata": "0.1.13",
 		"rename": "1.0.4",
@@ -121,82 +121,85 @@
 		"sanitize-html": "2.11.0",
 		"seedrandom": "^3.0.5",
 		"semver": "7.5.4",
-		"sharp": "0.32.5",
+		"sharp": "0.32.6",
 		"sonic-channel": "^1.3.1",
 		"stringz": "2.1.0",
 		"summaly": "2.7.0",
 		"syslog-pro": "1.0.0",
-		"systeminformation": "5.21.3",
+		"systeminformation": "5.21.17",
 		"tar-stream": "^3.1.6",
-		"tesseract.js": "^4.1.1",
+		"tesseract.js": "^5.0.3",
 		"tinycolor2": "1.6.0",
 		"tinyld": "^1.3.4",
 		"tmp": "0.2.1",
 		"twemoji-parser": "14.0.0",
 		"typeorm": "0.3.17",
 		"ulid": "2.3.0",
-		"uuid": "9.0.0",
-		"web-push": "3.6.5",
+		"uuid": "9.0.1",
+		"web-push": "3.6.6",
 		"websocket": "1.0.34",
 		"xev": "3.0.2"
 	},
 	"devDependencies": {
-		"@swc/cli": "^0.1.62",
+		"@swc/cli": "^0.1.63",
 		"@swc/core": "1.3.78",
-		"@types/adm-zip": "^0.5.0",
-		"@types/bcryptjs": "2.4.2",
-		"@types/escape-regexp": "0.0.1",
-		"@types/fluent-ffmpeg": "2.1.21",
-		"@types/js-yaml": "4.0.5",
-		"@types/jsonld": "1.5.9",
-		"@types/jsrsasign": "10.5.8",
-		"@types/koa": "2.13.8",
-		"@types/koa-bodyparser": "4.3.10",
-		"@types/koa-cors": "0.0.2",
-		"@types/koa-favicon": "2.0.21",
-		"@types/koa-logger": "3.1.2",
-		"@types/koa-mount": "4.0.2",
-		"@types/koa-send": "4.1.3",
-		"@types/koa-views": "7.0.0",
-		"@types/koa__cors": "3.3.0",
-		"@types/koa__multer": "2.0.4",
-		"@types/koa__router": "8.0.11",
-		"@types/mocha": "9.1.1",
-		"@types/node": "18.11.18",
-		"@types/node-fetch": "3.0.3",
-		"@types/nodemailer": "6.4.9",
-		"@types/oauth": "0.9.1",
-		"@types/probe-image-size": "^7.2.0",
-		"@types/pug": "2.0.6",
-		"@types/punycode": "2.1.0",
-		"@types/qrcode": "1.5.1",
-		"@types/qs": "6.9.7",
-		"@types/random-seed": "0.3.3",
-		"@types/ratelimiter": "3.4.4",
-		"@types/redis": "4.0.11",
-		"@types/rename": "1.0.4",
-		"@types/sanitize-html": "2.9.0",
-		"@types/semver": "7.5.0",
-		"@types/sinonjs__fake-timers": "8.1.2",
-		"@types/tinycolor2": "1.4.3",
-		"@types/tmp": "0.2.3",
-		"@types/uuid": "9.0.2",
-		"@types/web-push": "3.3.2",
-		"@types/websocket": "1.0.5",
-		"@types/ws": "8.5.5",
+		"@types/adm-zip": "^0.5.4",
+		"@types/bcryptjs": "2.4.6",
+		"@types/color-convert": "^2.0.3",
+		"@types/content-disposition": "^0.5.8",
+		"@types/escape-regexp": "0.0.3",
+		"@types/fluent-ffmpeg": "2.1.24",
+		"@types/js-yaml": "4.0.9",
+		"@types/jsonld": "1.5.12",
+		"@types/jsrsasign": "10.5.12",
+		"@types/koa": "2.13.11",
+		"@types/koa-bodyparser": "4.3.12",
+		"@types/koa-cors": "0.0.5",
+		"@types/koa-favicon": "2.1.3",
+		"@types/koa-logger": "3.1.5",
+		"@types/koa-mount": "4.0.5",
+		"@types/koa-send": "4.1.6",
+		"@types/koa__cors": "4.0.3",
+		"@types/koa__multer": "2.0.7",
+		"@types/koa__router": "12.0.4",
+		"@types/mocha": "10.0.4",
+		"@types/node": "20.9.0",
+		"@types/node-fetch": "2.6.9",
+		"@types/nodemailer": "6.4.14",
+		"@types/oauth": "0.9.4",
+		"@types/opencc-js": "^1.0.3",
+		"@types/pg": "^8.10.9",
+		"@types/probe-image-size": "^7.2.3",
+		"@types/pug": "2.0.9",
+		"@types/punycode": "2.1.2",
+		"@types/qrcode": "1.5.5",
+		"@types/qs": "6.9.10",
+		"@types/random-seed": "0.3.5",
+		"@types/ratelimiter": "3.4.6",
+		"@types/rename": "1.0.7",
+		"@types/sanitize-html": "2.9.4",
+		"@types/semver": "7.5.5",
+		"@types/sinonjs__fake-timers": "8.1.5",
+		"@types/syslog-pro": "^1.0.3",
+		"@types/tinycolor2": "1.4.6",
+		"@types/tmp": "0.2.6",
+		"@types/uuid": "9.0.7",
+		"@types/web-push": "3.6.3",
+		"@types/websocket": "1.0.9",
+		"@types/ws": "8.5.9",
 		"cross-env": "7.0.3",
-		"eslint": "^8.46.0",
-		"execa": "6.1.0",
+		"eslint": "^8.53.0",
+		"execa": "8.0.1",
 		"json5-loader": "4.0.1",
 		"mocha": "10.2.0",
 		"pug": "3.0.2",
 		"strict-event-emitter-types": "2.0.0",
 		"swc-loader": "^0.2.3",
-		"ts-loader": "9.4.4",
+		"ts-loader": "9.5.1",
 		"ts-node": "10.9.1",
 		"tsconfig-paths": "4.2.0",
-		"typescript": "5.1.6",
-		"webpack": "^5.88.2",
-		"ws": "8.13.0"
+		"typescript": "5.2.2",
+		"webpack": "^5.89.0",
+		"ws": "8.14.2"
 	}
 }
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index 4470cea9cb..89f72227a1 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -10,10 +10,9 @@ import semver from "semver";
 import Logger from "@/services/logger.js";
 import loadConfig from "@/config/load.js";
 import type { Config } from "@/config/types.js";
-import { lessThan } from "@/prelude/array.js";
-import { envOption } from "../env.js";
+import { envOption } from "@/env.js";
 import { showMachineInfo } from "@/misc/show-machine-info.js";
-import { db, initDb } from "../db/postgre.js";
+import { db, initDb } from "@/db/postgre.js";
 
 const _filename = fileURLToPath(import.meta.url);
 const _dirname = dirname(_filename);
diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts
index 236621b010..0acdcd97c6 100644
--- a/packages/backend/src/boot/worker.ts
+++ b/packages/backend/src/boot/worker.ts
@@ -1,6 +1,5 @@
 import cluster from "node:cluster";
-import { initDb } from "../db/postgre.js";
-import config from "@/config/index.js";
+import { initDb } from "@/db/postgre.js";
 import os from "node:os";
 
 /**
diff --git a/packages/backend/src/const.ts b/packages/backend/src/const.ts
index 6dddf1fff5..8fc4bd25e0 100644
--- a/packages/backend/src/const.ts
+++ b/packages/backend/src/const.ts
@@ -1,7 +1,7 @@
 import config from "@/config/index.js";
 import {
-	DB_MAX_NOTE_TEXT_LENGTH,
 	DB_MAX_IMAGE_COMMENT_LENGTH,
+	DB_MAX_NOTE_TEXT_LENGTH,
 } from "@/misc/hard-limits.js";
 
 export const MAX_NOTE_TEXT_LENGTH = Math.min(
diff --git a/packages/backend/src/daemons/queue-stats.ts b/packages/backend/src/daemons/queue-stats.ts
index 381b52a916..c358518fa4 100644
--- a/packages/backend/src/daemons/queue-stats.ts
+++ b/packages/backend/src/daemons/queue-stats.ts
@@ -1,5 +1,5 @@
 import Xev from "xev";
-import { deliverQueue, inboxQueue } from "../queue/queues.js";
+import { deliverQueue, inboxQueue } from "@/queue/queues.js";
 
 const ev = new Xev();
 
diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts
index 39d81ec914..dc7493381c 100644
--- a/packages/backend/src/daemons/server-stats.ts
+++ b/packages/backend/src/daemons/server-stats.ts
@@ -2,7 +2,7 @@ import si from "systeminformation";
 import Xev from "xev";
 import * as osUtils from "os-utils";
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import meilisearch from "../db/meilisearch.js";
+import meilisearch from "@/db/meilisearch.js";
 
 const ev = new Xev();
 
diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts
index 10ea5b15f6..d68f919a75 100644
--- a/packages/backend/src/db/postgre.ts
+++ b/packages/backend/src/db/postgre.ts
@@ -74,9 +74,10 @@ import { UserIp } from "@/models/entities/user-ip.js";
 import { NoteEdit } from "@/models/entities/note-edit.js";
 
 import { entities as charts } from "@/services/chart/entities.js";
-import { envOption } from "../env.js";
 import { dbLogger } from "./logger.js";
 import { redisClient } from "./redis.js";
+
+// TODO?: should we avoid importing things from built directory?
 import { nativeInitDatabase } from "native-utils/built/index.js";
 
 const sqlLogger = dbLogger.createSubLogger("sql", "gray", false);
diff --git a/packages/backend/src/global.d.ts b/packages/backend/src/global.d.ts
index 503e26eb60..6c5a22e4b4 100644
--- a/packages/backend/src/global.d.ts
+++ b/packages/backend/src/global.d.ts
@@ -1,2 +1,2 @@
-// rome-ignore lint/suspicious/noExplicitAny: i have no idea
+// biome-ignore lint/suspicious/noExplicitAny: i have no idea
 type FIXME = any;
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index 278f630f70..33b5826a7e 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -1,5 +1,5 @@
 /**
- * Misskey Entry Point!
+ * Firefish Entry Point
  */
 
 import { EventEmitter } from "node:events";
diff --git a/packages/backend/src/misc/app-lock.ts b/packages/backend/src/misc/app-lock.ts
index 198310c884..91d408ac5d 100644
--- a/packages/backend/src/misc/app-lock.ts
+++ b/packages/backend/src/misc/app-lock.ts
@@ -1,4 +1,4 @@
-import { redisClient } from "../db/redis.js";
+import { redisClient } from "@/db/redis.js";
 import { Mutex } from "redis-semaphore";
 
 /**
diff --git a/packages/backend/src/misc/captcha.ts b/packages/backend/src/misc/captcha.ts
index 8ea4abedb6..b3b3dca39d 100644
--- a/packages/backend/src/misc/captcha.ts
+++ b/packages/backend/src/misc/captcha.ts
@@ -1,6 +1,6 @@
 import fetch from "node-fetch";
 import { URLSearchParams } from "node:url";
-import { getAgentByUrl } from "./fetch.js";
+import { getAgentByUrl } from "@/misc/fetch.js";
 import config from "@/config/index.js";
 
 export async function verifyRecaptcha(secret: string, response: string) {
diff --git a/packages/backend/src/misc/check-hit-antenna.ts b/packages/backend/src/misc/check-hit-antenna.ts
index 199b2d9647..1f4f2f2fae 100644
--- a/packages/backend/src/misc/check-hit-antenna.ts
+++ b/packages/backend/src/misc/check-hit-antenna.ts
@@ -2,11 +2,11 @@ import type { Antenna } from "@/models/entities/antenna.js";
 import type { Note } from "@/models/entities/note.js";
 import type { User } from "@/models/entities/user.js";
 import { Blockings, UserProfiles } from "@/models/index.js";
-import { getFullApAccount } from "./convert-host.js";
+import { getFullApAccount } from "@/misc/convert-host.js";
 import * as Acct from "@/misc/acct.js";
-import type { Packed } from "./schema.js";
-import { Cache } from "./cache.js";
-import { getWordHardMute } from "./check-word-mute.js";
+import type { Packed } from "@/misc/schema.js";
+import { Cache } from "@/misc/cache.js";
+import { getWordHardMute } from "@/misc/check-word-mute.js";
 
 const blockingCache = new Cache<User["id"][]>("blocking", 60 * 5);
 const mutedWordsCache = new Cache<string[][] | undefined>("mutedWords", 60 * 5);
diff --git a/packages/backend/src/models/entities/note-thread-muting.ts b/packages/backend/src/models/entities/note-thread-muting.ts
index 704b328503..7e5fad59a4 100644
--- a/packages/backend/src/models/entities/note-thread-muting.ts
+++ b/packages/backend/src/models/entities/note-thread-muting.ts
@@ -7,7 +7,6 @@ import {
 	ManyToOne,
 } from "typeorm";
 import { User } from "./user.js";
-import { Note } from "./note.js";
 import { id } from "../id.js";
 
 @Entity()
diff --git a/packages/backend/src/models/entities/user-ip.ts b/packages/backend/src/models/entities/user-ip.ts
index c30e56b66b..adef48e4c4 100644
--- a/packages/backend/src/models/entities/user-ip.ts
+++ b/packages/backend/src/models/entities/user-ip.ts
@@ -1,14 +1,5 @@
-import {
-	PrimaryColumn,
-	Entity,
-	Index,
-	JoinColumn,
-	Column,
-	ManyToOne,
-	PrimaryGeneratedColumn,
-} from "typeorm";
+import { Entity, Index, Column, PrimaryGeneratedColumn } from "typeorm";
 import { id } from "../id.js";
-import { Note } from "./note.js";
 import type { User } from "./user.js";
 
 @Entity()
diff --git a/packages/backend/src/models/index.ts b/packages/backend/src/models/index.ts
index 8782d57408..c1f37cf6d4 100644
--- a/packages/backend/src/models/index.ts
+++ b/packages/backend/src/models/index.ts
@@ -1,9 +1,7 @@
-import {} from "typeorm";
 import { db } from "@/db/postgre.js";
 
 import { Announcement } from "./entities/announcement.js";
 import { AnnouncementRead } from "./entities/announcement-read.js";
-import { Instance } from "./entities/instance.js";
 import { Poll } from "./entities/poll.js";
 import { PollVote } from "./entities/poll-vote.js";
 import { Meta } from "./entities/meta.js";
diff --git a/packages/backend/src/models/repositories/drive-file.ts b/packages/backend/src/models/repositories/drive-file.ts
index 3918f7947b..1b4f477d33 100644
--- a/packages/backend/src/models/repositories/drive-file.ts
+++ b/packages/backend/src/models/repositories/drive-file.ts
@@ -2,12 +2,10 @@ import { db } from "@/db/postgre.js";
 import { DriveFile } from "@/models/entities/drive-file.js";
 import type { User } from "@/models/entities/user.js";
 import { toPuny } from "@/misc/convert-host.js";
-import { awaitAll, Promiseable } from "@/prelude/await-all.js";
+import { awaitAll } from "@/prelude/await-all.js";
 import type { Packed } from "@/misc/schema.js";
 import config from "@/config/index.js";
 import { query, appendQuery } from "@/prelude/url.js";
-import { Meta } from "@/models/entities/meta.js";
-import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Users, DriveFolders } from "../index.js";
 import { deepClone } from "@/misc/clone.js";
 
diff --git a/packages/backend/src/models/repositories/notification.ts b/packages/backend/src/models/repositories/notification.ts
index 1538e67d86..90dfbd7397 100644
--- a/packages/backend/src/models/repositories/notification.ts
+++ b/packages/backend/src/models/repositories/notification.ts
@@ -1,4 +1,4 @@
-import { In, Repository } from "typeorm";
+import { In } from "typeorm";
 import { Notification } from "@/models/entities/notification.js";
 import { awaitAll } from "@/prelude/await-all.js";
 import type { Packed } from "@/misc/schema.js";
@@ -6,7 +6,6 @@ import type { Note } from "@/models/entities/note.js";
 import type { NoteReaction } from "@/models/entities/note-reaction.js";
 import type { User } from "@/models/entities/user.js";
 import { aggregateNoteEmojis, prefetchEmojis } from "@/misc/populate-emojis.js";
-import { notificationTypes } from "@/types.js";
 import { db } from "@/db/postgre.js";
 import {
 	Users,
diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts
index e4284f935f..be1dbc4531 100644
--- a/packages/backend/src/models/repositories/user.ts
+++ b/packages/backend/src/models/repositories/user.ts
@@ -7,7 +7,6 @@ import type { Packed } from "@/misc/schema.js";
 import type { Promiseable } from "@/prelude/await-all.js";
 import { awaitAll } from "@/prelude/await-all.js";
 import { populateEmojis } from "@/misc/populate-emojis.js";
-import { getAntennas } from "@/misc/antenna-cache.js";
 import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from "@/const.js";
 import { Cache } from "@/misc/cache.js";
 import { db } from "@/db/postgre.js";
diff --git a/packages/backend/src/queue/processors/background/index-all-notes.ts b/packages/backend/src/queue/processors/background/index-all-notes.ts
index c0275b420a..262724cbd6 100644
--- a/packages/backend/src/queue/processors/background/index-all-notes.ts
+++ b/packages/backend/src/queue/processors/background/index-all-notes.ts
@@ -6,7 +6,7 @@ import { Notes } from "@/models/index.js";
 import { MoreThan } from "typeorm";
 import { index } from "@/services/note/create.js";
 import { Note } from "@/models/entities/note.js";
-import meilisearch from "../../../db/meilisearch.js";
+import meilisearch from "@/db/meilisearch.js";
 
 const logger = queueLogger.createSubLogger("index-all-notes");
 
diff --git a/packages/backend/src/queue/processors/db/export-custom-emojis.ts b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
index 7a19d0b60b..86de43af42 100644
--- a/packages/backend/src/queue/processors/db/export-custom-emojis.ts
+++ b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
@@ -1,14 +1,12 @@
 import type Bull from "bull";
 import * as fs from "node:fs";
 
-import { ulid } from "ulid";
 import mime from "mime-types";
 import archiver from "archiver";
 import { queueLogger } from "../../logger.js";
 import { addFile } from "@/services/drive/add-file.js";
 import { format as dateFormat } from "date-fns";
 import { Users, Emojis } from "@/models/index.js";
-import {} from "@/queue/types.js";
 import { createTemp, createTempDir } from "@/misc/create-temp.js";
 import { downloadUrl } from "@/misc/download-url.js";
 import config from "@/config/index.js";
diff --git a/packages/backend/src/queue/processors/db/import-blocking.ts b/packages/backend/src/queue/processors/db/import-blocking.ts
index 2fdf80a6eb..290c9dbceb 100644
--- a/packages/backend/src/queue/processors/db/import-blocking.ts
+++ b/packages/backend/src/queue/processors/db/import-blocking.ts
@@ -5,7 +5,7 @@ import * as Acct from "@/misc/acct.js";
 import { resolveUser } from "@/remote/resolve-user.js";
 import { downloadTextFile } from "@/misc/download-text-file.js";
 import { isSelfHost, toPuny } from "@/misc/convert-host.js";
-import { Users, DriveFiles, Blockings } from "@/models/index.js";
+import { Users, DriveFiles } from "@/models/index.js";
 import type { DbUserImportJobData } from "@/queue/types.js";
 import block from "@/services/blocking/create.js";
 import { IsNull } from "typeorm";
diff --git a/packages/backend/src/queue/processors/db/import-masto-post.ts b/packages/backend/src/queue/processors/db/import-masto-post.ts
index 9b86a5903f..c484ac0e17 100644
--- a/packages/backend/src/queue/processors/db/import-masto-post.ts
+++ b/packages/backend/src/queue/processors/db/import-masto-post.ts
@@ -5,7 +5,6 @@ import { queueLogger } from "../../logger.js";
 import type Bull from "bull";
 import { htmlToMfm } from "@/remote/activitypub/misc/html-to-mfm.js";
 import { resolveNote } from "@/remote/activitypub/models/note.js";
-import { Note } from "@/models/entities/note.js";
 import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { Notes, NoteEdits } from "@/models/index.js";
diff --git a/packages/backend/src/queue/processors/ended-poll-notification.ts b/packages/backend/src/queue/processors/ended-poll-notification.ts
index 3bf010a1b9..f93b067b8a 100644
--- a/packages/backend/src/queue/processors/ended-poll-notification.ts
+++ b/packages/backend/src/queue/processors/ended-poll-notification.ts
@@ -1,11 +1,12 @@
 import type Bull from "bull";
 import { Notes, PollVotes } from "@/models/index.js";
-import { queueLogger } from "../logger.js";
+// import { queueLogger } from "../logger.js";
 import type { EndedPollNotificationJobData } from "@/queue/types.js";
 import { createNotification } from "@/services/create-notification.js";
 import { deliverQuestionUpdate } from "@/services/note/polls/update.js";
 
-const logger = queueLogger.createSubLogger("ended-poll-notification");
+// unused
+// const logger = queueLogger.createSubLogger("ended-poll-notification");
 
 export async function endedPollNotification(
 	job: Bull.Job<EndedPollNotificationJobData>,
diff --git a/packages/backend/src/queue/processors/system/verify-links.ts b/packages/backend/src/queue/processors/system/verify-links.ts
index 3ddda9baf4..4ee88c6310 100644
--- a/packages/backend/src/queue/processors/system/verify-links.ts
+++ b/packages/backend/src/queue/processors/system/verify-links.ts
@@ -4,7 +4,6 @@ import { UserProfiles } from "@/models/index.js";
 import { Not } from "typeorm";
 import { queueLogger } from "../../logger.js";
 import { verifyLink } from "@/services/fetch-rel-me.js";
-import config from "@/config/index.js";
 
 const logger = queueLogger.createSubLogger("verify-links");
 
diff --git a/packages/backend/src/queue/processors/webhook-deliver.ts b/packages/backend/src/queue/processors/webhook-deliver.ts
index 286b401ba7..12c9a05498 100644
--- a/packages/backend/src/queue/processors/webhook-deliver.ts
+++ b/packages/backend/src/queue/processors/webhook-deliver.ts
@@ -1,4 +1,3 @@
-import { URL } from "node:url";
 import type Bull from "bull";
 import Logger from "@/services/logger.js";
 import type { WebhookDeliverJobData } from "../types.js";
diff --git a/packages/backend/src/remote/activitypub/audience.ts b/packages/backend/src/remote/activitypub/audience.ts
index 21b1b2e6ac..9d840bc574 100644
--- a/packages/backend/src/remote/activitypub/audience.ts
+++ b/packages/backend/src/remote/activitypub/audience.ts
@@ -8,7 +8,6 @@ import type {
 	CacheableRemoteUser,
 	CacheableUser,
 } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 
 type Visibility = "public" | "home" | "followers" | "specified";
 
diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts
index 39f3c6e430..a753606a14 100644
--- a/packages/backend/src/remote/activitypub/db-resolver.ts
+++ b/packages/backend/src/remote/activitypub/db-resolver.ts
@@ -70,7 +70,7 @@ export function parseUri(value: string | IObject): UriParseResult {
 
 export default class DbResolver {
 	/**
-	 * AP Note => Misskey Note in DB
+	 * AP Note => Firefish Note in DB
 	 */
 	public async getNoteFromApId(value: string | IObject): Promise<Note | null> {
 		const parsed = parseUri(value);
@@ -114,7 +114,7 @@ export default class DbResolver {
 	}
 
 	/**
-	 * AP Person => Misskey User in DB
+	 * AP Person => Firefish User in DB
 	 */
 	public async getUserFromApId(
 		value: string | IObject,
@@ -147,7 +147,7 @@ export default class DbResolver {
 	}
 
 	/**
-	 * AP KeyId => Misskey User and Key
+	 * AP KeyId => Firefish User and Key
 	 */
 	public async getAuthUserFromKeyId(keyId: string): Promise<{
 		user: CacheableRemoteUser;
@@ -181,7 +181,7 @@ export default class DbResolver {
 	}
 
 	/**
-	 * AP Actor id => Misskey User and Key
+	 * AP Actor id => Firefish User and Key
 	 */
 	public async getAuthUserFromApId(uri: string): Promise<{
 		user: CacheableRemoteUser;
diff --git a/packages/backend/src/remote/activitypub/kernel/read.ts b/packages/backend/src/remote/activitypub/kernel/read.ts
index 7cc70976c3..53fa7fe63b 100644
--- a/packages/backend/src/remote/activitypub/kernel/read.ts
+++ b/packages/backend/src/remote/activitypub/kernel/read.ts
@@ -3,7 +3,7 @@ import type { IRead } from "../type.js";
 import { getApId } from "../type.js";
 import { isSelfHost, extractDbHost } from "@/misc/convert-host.js";
 import { MessagingMessages } from "@/models/index.js";
-import { readUserMessagingMessage } from "../../../server/api/common/read-messaging-message.js";
+import { readUserMessagingMessage } from "@/server/api/common/read-messaging-message.js";
 
 export const performReadActivity = async (
 	actor: CacheableRemoteUser,
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/accept.ts b/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
index 2cd05a77d2..7cf457046a 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
@@ -1,5 +1,4 @@
 import unfollow from "@/services/following/delete.js";
-import cancelRequest from "@/services/following/requests/cancel.js";
 import type { IAccept } from "../../type.js";
 import type { CacheableRemoteUser } from "@/models/entities/user.js";
 import { Followings } from "@/models/index.js";
diff --git a/packages/backend/src/remote/activitypub/misc/get-note-html.ts b/packages/backend/src/remote/activitypub/misc/get-note-html.ts
index cb5294f731..7521d12131 100644
--- a/packages/backend/src/remote/activitypub/misc/get-note-html.ts
+++ b/packages/backend/src/remote/activitypub/misc/get-note-html.ts
@@ -1,6 +1,6 @@
 import * as mfm from "mfm-js";
 import type { Note } from "@/models/entities/note.js";
-import { toHtml } from "../../../mfm/to-html.js";
+import { toHtml } from "@/mfm/to-html.js";
 
 export default function (note: Note) {
 	if (!note.text) return "";
diff --git a/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts b/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
index 9d71a46a36..f18958f70d 100644
--- a/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
+++ b/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
@@ -1,6 +1,6 @@
 import type { IObject } from "../type.js";
 import { extractApHashtagObjects } from "../models/tag.js";
-import { fromHtml } from "../../../mfm/from-html.js";
+import { fromHtml } from "@/mfm/from-html.js";
 
 export function htmlToMfm(html: string, tag?: IObject | IObject[]) {
 	const hashtagNames = extractApHashtagObjects(tag)
diff --git a/packages/backend/src/remote/activitypub/models/image.ts b/packages/backend/src/remote/activitypub/models/image.ts
index 67652d57de..2cf0c6c152 100644
--- a/packages/backend/src/remote/activitypub/models/image.ts
+++ b/packages/backend/src/remote/activitypub/models/image.ts
@@ -1,11 +1,10 @@
 import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
 import type { CacheableRemoteUser } from "@/models/entities/user.js";
-import { IRemoteUser } from "@/models/entities/user.js";
 import Resolver from "../resolver.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { apLogger } from "../logger.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
-import { DriveFiles, Users } from "@/models/index.js";
+import { DriveFiles } from "@/models/index.js";
 import { truncate } from "@/misc/truncate.js";
 import { DB_MAX_IMAGE_COMMENT_LENGTH } from "@/misc/hard-limits.js";
 
diff --git a/packages/backend/src/remote/activitypub/models/mention.ts b/packages/backend/src/remote/activitypub/models/mention.ts
index b888fa21a4..e9f80bc43f 100644
--- a/packages/backend/src/remote/activitypub/models/mention.ts
+++ b/packages/backend/src/remote/activitypub/models/mention.ts
@@ -1,7 +1,6 @@
 import promiseLimit from "promise-limit";
 import { toArray, unique } from "@/prelude/array.js";
 import type { CacheableUser } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 import type { IObject, IApMention } from "../type.js";
 import { isMention } from "../type.js";
 import Resolver from "../resolver.js";
diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts
index 552a19a951..c50853f235 100644
--- a/packages/backend/src/remote/activitypub/models/note.ts
+++ b/packages/backend/src/remote/activitypub/models/note.ts
@@ -6,10 +6,7 @@ import post from "@/services/note/create.js";
 import { extractMentionedUsers } from "@/services/note/create.js";
 import { resolvePerson } from "./person.js";
 import { resolveImage } from "./image.js";
-import type {
-	ILocalUser,
-	CacheableRemoteUser,
-} from "@/models/entities/user.js";
+import type { CacheableRemoteUser } from "@/models/entities/user.js";
 import { htmlToMfm } from "../misc/html-to-mfm.js";
 import { extractApHashtags } from "./tag.js";
 import { unique, toArray, toSingle } from "@/prelude/array.js";
@@ -52,7 +49,6 @@ import { In } from "typeorm";
 import { DB_MAX_IMAGE_COMMENT_LENGTH } from "@/misc/hard-limits.js";
 import { truncate } from "@/misc/truncate.js";
 import { type Size, getEmojiSize } from "@/misc/emoji-meta.js";
-import { fetchMeta } from "@/misc/fetch-meta.js";
 import { langmap } from "@/misc/langmap.js";
 
 const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts
index 1db90ad7f1..15083fa877 100644
--- a/packages/backend/src/remote/activitypub/models/person.ts
+++ b/packages/backend/src/remote/activitypub/models/person.ts
@@ -8,7 +8,6 @@ import { updateUsertags } from "@/services/update-hashtag.js";
 import {
 	Users,
 	Instances,
-	DriveFiles,
 	Followings,
 	UserProfiles,
 	UserPublickeys,
@@ -33,8 +32,8 @@ import { publishInternalEvent } from "@/services/stream.js";
 import { db } from "@/db/postgre.js";
 import { apLogger } from "../logger.js";
 import { htmlToMfm } from "../misc/html-to-mfm.js";
-import { fromHtml } from "../../../mfm/from-html.js";
-import type { IActor, IObject, IApPropertyValue } from "../type.js";
+import { fromHtml } from "@/mfm/from-html.js";
+import type { IActor, IObject } from "../type.js";
 import {
 	isCollectionOrOrderedCollection,
 	isCollection,
@@ -313,7 +312,9 @@ export async function createPerson(
 			await transactionalEntityManager.save(
 				new UserProfile({
 					userId: user.id,
-					description: person.summary
+					description: person._misskey_summary
+						? truncate(person._misskey_summary, summaryLength)
+						: person.summary
 						? htmlToMfm(truncate(person.summary, summaryLength), person.tag)
 						: null,
 					url: url,
@@ -456,7 +457,7 @@ export async function updatePerson(
 
 	const emojiNames = emojis.map((emoji) => emoji.name);
 
-	const { fields } = analyzeAttachments(person.attachment || []);
+	const fields = analyzeAttachments(person.attachment || []);
 
 	const tags = extractApHashtags(person.tag)
 		.map((tag) => normalizeForSearch(tag))
diff --git a/packages/backend/src/remote/activitypub/renderer/flag.ts b/packages/backend/src/remote/activitypub/renderer/flag.ts
index f94d508e1d..44da33f5c2 100644
--- a/packages/backend/src/remote/activitypub/renderer/flag.ts
+++ b/packages/backend/src/remote/activitypub/renderer/flag.ts
@@ -1,8 +1,5 @@
 import config from "@/config/index.js";
-import { IObject, IActivity } from "@/remote/activitypub/type.js";
 import type { ILocalUser } from "@/models/entities/user.js";
-import { IRemoteUser } from "@/models/entities/user.js";
-import { getInstanceActor } from "@/services/instance-actor.js";
 
 // to anonymise reporters, the reporting actor must be a system user
 // object has to be a uri or array of uris
diff --git a/packages/backend/src/remote/activitypub/renderer/index.ts b/packages/backend/src/remote/activitypub/renderer/index.ts
index 7d2eb95288..c60a1f4cdb 100644
--- a/packages/backend/src/remote/activitypub/renderer/index.ts
+++ b/packages/backend/src/remote/activitypub/renderer/index.ts
@@ -43,6 +43,7 @@ export const renderActivity = (x: any): IActivity | null => {
 					_misskey_talk: "misskey:_misskey_talk",
 					_misskey_reaction: "misskey:_misskey_reaction",
 					_misskey_votes: "misskey:_misskey_votes",
+					_misskey_summary: "misskey:_misskey_summary",
 					isCat: "misskey:isCat",
 					// Fedibird
 					fedibird: "http://fedibird.com/ns#",
diff --git a/packages/backend/src/remote/activitypub/renderer/person.ts b/packages/backend/src/remote/activitypub/renderer/person.ts
index 9f642bb9e5..db176a0dde 100644
--- a/packages/backend/src/remote/activitypub/renderer/person.ts
+++ b/packages/backend/src/remote/activitypub/renderer/person.ts
@@ -74,6 +74,7 @@ export async function renderPerson(user: ILocalUser) {
 		summary: profile.description
 			? toHtml(mfm.parse(profile.description))
 			: null,
+		_misskey_summary: profile.description,
 		icon: avatar ? renderImage(avatar) : null,
 		image: banner ? renderImage(banner) : null,
 		tag,
diff --git a/packages/backend/src/remote/activitypub/renderer/undo.ts b/packages/backend/src/remote/activitypub/renderer/undo.ts
index 249d643b25..4394c4bf2f 100644
--- a/packages/backend/src/remote/activitypub/renderer/undo.ts
+++ b/packages/backend/src/remote/activitypub/renderer/undo.ts
@@ -1,6 +1,5 @@
 import config from "@/config/index.js";
 import type { User } from "@/models/entities/user.js";
-import { ILocalUser } from "@/models/entities/user.js";
 
 export default (object: any, user: { id: User["id"] }) => {
 	if (object == null) return null;
diff --git a/packages/backend/src/remote/activitypub/resolver.ts b/packages/backend/src/remote/activitypub/resolver.ts
index 608ca3e935..c4bee109d2 100644
--- a/packages/backend/src/remote/activitypub/resolver.ts
+++ b/packages/backend/src/remote/activitypub/resolver.ts
@@ -7,13 +7,7 @@ import { extractDbHost, isSelfHost } from "@/misc/convert-host.js";
 import { signedGet } from "./request.js";
 import type { IObject, ICollection, IOrderedCollection } from "./type.js";
 import { isCollectionOrOrderedCollection, getApId } from "./type.js";
-import {
-	FollowRequests,
-	Notes,
-	NoteReactions,
-	Polls,
-	Users,
-} from "@/models/index.js";
+import { Notes, NoteReactions, Polls, Users } from "@/models/index.js";
 import { parseUri } from "./db-resolver.js";
 import renderNote from "@/remote/activitypub/renderer/note.js";
 import { renderLike } from "@/remote/activitypub/renderer/like.js";
diff --git a/packages/backend/src/remote/activitypub/type.ts b/packages/backend/src/remote/activitypub/type.ts
index 0e63f3ed55..cf0410767b 100644
--- a/packages/backend/src/remote/activitypub/type.ts
+++ b/packages/backend/src/remote/activitypub/type.ts
@@ -205,6 +205,7 @@ export interface IActor extends IObject {
 	};
 	"vcard:bday"?: string;
 	"vcard:Address"?: string;
+	_misskey_summary?: string;
 }
 
 export const isCollection = (object: IObject): object is ICollection =>
diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts
index f9d5eb99c3..337db59933 100644
--- a/packages/backend/src/server/activitypub.ts
+++ b/packages/backend/src/server/activitypub.ts
@@ -9,7 +9,7 @@ import renderKey from "@/remote/activitypub/renderer/key.js";
 import { renderPerson } from "@/remote/activitypub/renderer/person.js";
 import renderEmoji from "@/remote/activitypub/renderer/emoji.js";
 import { inbox as processInbox } from "@/queue/index.js";
-import { isSelfHost, toPuny } from "@/misc/convert-host.js";
+import { isSelfHost } from "@/misc/convert-host.js";
 import {
 	Notes,
 	Users,
@@ -22,7 +22,6 @@ import { renderLike } from "@/remote/activitypub/renderer/like.js";
 import { getUserKeypair } from "@/misc/keypair-store.js";
 import {
 	checkFetch,
-	hasSignature,
 	getSignatureUser,
 } from "@/remote/activitypub/check-fetch.js";
 import { getInstanceActor } from "@/services/instance-actor.js";
diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts
index 0a1027b835..2132edd0f5 100644
--- a/packages/backend/src/server/api/call.ts
+++ b/packages/backend/src/server/api/call.ts
@@ -1,7 +1,6 @@
 import { performance } from "perf_hooks";
 import type Koa from "koa";
 import type { CacheableLocalUser } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 import type { AccessToken } from "@/models/entities/access-token.js";
 import { getIpHash } from "@/misc/get-ip-hash.js";
 import { limiter } from "./limiter.js";
@@ -10,7 +9,6 @@ import endpoints from "./endpoints.js";
 import compatibility from "./compatibility.js";
 import { ApiError } from "./error.js";
 import { apiLogger } from "./logger.js";
-import type { AccessToken } from "@/models/entities/access-token.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 
 const accessDenied = {
diff --git a/packages/backend/src/server/api/define.ts b/packages/backend/src/server/api/define.ts
index ee0844185f..946f86a63f 100644
--- a/packages/backend/src/server/api/define.ts
+++ b/packages/backend/src/server/api/define.ts
@@ -1,7 +1,6 @@
 import * as fs from "node:fs";
 import Ajv from "ajv";
 import type { CacheableLocalUser } from "@/models/entities/user.js";
-import { ILocalUser } from "@/models/entities/user.js";
 import type { Schema, SchemaType } from "@/misc/schema.js";
 import type { AccessToken } from "@/models/entities/access-token.js";
 import type { IEndpointMeta } from "./endpoints.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
index 4861431403..78034917f0 100644
--- a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AbuseUserReports } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
index 2e035d1695..e5972173c9 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
-import { signup } from "../../../common/signup.js";
+import { signup } from "@/server/api/common/signup.js";
 import { IsNull } from "typeorm";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
index 3f7243ab50..4235180838 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { doPostSuspend } from "@/services/suspend-user.js";
 import { publishUserEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts b/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
index a7b6e95c28..601cd95003 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
@@ -2,7 +2,7 @@ import config from "@/config/index.js";
 import { Meta } from "@/models/entities/meta.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { db } from "@/db/postgre.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/create.ts b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
index db39f3eb27..bfe4d54461 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Ads } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
index ee6d314de7..802eb5ef6b 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Ads } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/list.ts b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
index 65944d31e9..1f39e73e5e 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Ads } from "@/models/index.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/update.ts b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
index 2c70387310..52f31a3ce0 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Ads } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
index 754cc6c893..8af778486c 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Announcements } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
index 5665b94a7b..8b2326cdaf 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Announcements } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
index e96517c68e..a13fabd602 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
@@ -1,7 +1,7 @@
 import { Announcements, AnnouncementReads } from "@/models/index.js";
 import type { Announcement } from "@/models/entities/announcement.js";
-import define from "../../../define.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
index 616b94d699..03af414737 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Announcements } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-2fa.ts b/packages/backend/src/server/api/endpoints/admin/delete-2fa.ts
index 04f6abb82c..1cf60d9c52 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-2fa.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-2fa.ts
@@ -1,6 +1,6 @@
 import { Users, UserProfiles } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-account.ts b/packages/backend/src/server/api/endpoints/admin/delete-account.ts
index 9fd196888d..1b6dc31a2c 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-account.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-account.ts
@@ -1,6 +1,6 @@
 import { Users } from "@/models/index.js";
 import { deleteAccount } from "@/services/delete-account.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
index 7969008113..b52f609804 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { deleteFile } from "@/services/drive/delete-file.js";
 import { DriveFiles } from "@/models/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-passkeys.ts b/packages/backend/src/server/api/endpoints/admin/delete-passkeys.ts
index 3b5c595281..7a54f5d99f 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-passkeys.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-passkeys.ts
@@ -1,6 +1,6 @@
 import { Users, UserProfiles, UserSecurityKeys } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts b/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
index c8be344696..d4bb3045c6 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { publishInternalEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
index 1b0c1260bd..84c04793e3 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { createCleanRemoteFilesJob } from "@/queue/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
index 04208f6004..e56c027ff2 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
@@ -1,5 +1,5 @@
 import { IsNull } from "typeorm";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { deleteFile } from "@/services/drive/delete-file.js";
 import { DriveFiles } from "@/models/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/files.ts b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
index 5cb0aecd81..e068f1dc9b 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
@@ -1,6 +1,6 @@
 import { DriveFiles } from "@/models/index.js";
-import define from "../../../define.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
index d65ec09fc2..a080615e74 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,6 +1,6 @@
 import { DriveFiles } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
index 1ea457adf2..02b3877b87 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
@@ -1,7 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
index 4366406ec3..8d156e6f71 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
@@ -1,8 +1,8 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis, DriveFiles } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import rndstr from "rndstr";
 import { publishBroadcastStream } from "@/services/stream.js";
 import { db } from "@/db/postgre.js";
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 c90e606335..29b1d82125 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
@@ -1,7 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
 import { publishBroadcastStream } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
index 585af231f6..a5c4c8bcc5 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
@@ -1,8 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
index 761c7c3776..726f90396b 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
@@ -1,7 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
index 9eba9dfd54..4b49e45dd9 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { createImportCustomEmojisJob } from "@/queue/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
index 6252e7e929..c6246c48c7 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
@@ -1,7 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { toPuny } from "@/misc/convert-host.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
index f8269588ca..12de0b1817 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { makePaginationQuery } from "../../../common/make-pagination-query.js";
 import type { Emoji } from "@/models/entities/emoji.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
index 4e57fa3dda..49d31805f0 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
@@ -1,7 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
index 1197f60779..72d7fab804 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
@@ -1,7 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
index 17881a4454..89e68aa4c1 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
@@ -1,7 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-license-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-license-bulk.ts
index c98ca03fae..e4500e02a2 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-license-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-license-bulk.ts
@@ -1,7 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
 import { In } from "typeorm";
-import { ApiError } from "../../../error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
index 9e2e854760..6fedf86204 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Emojis } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
index 534f226c28..d1a7fb6957 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { deleteFile } from "@/services/drive/delete-file.js";
 import { DriveFiles } from "@/models/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
index 9c7165593c..bf71cd2503 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Instances } from "@/models/index.js";
 import { toPuny } from "@/misc/convert-host.js";
 import { fetchInstanceMetadata } from "@/services/fetch-instance-metadata.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
index a1ccf11af0..a2ce44bd5d 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import deleteFollowing from "@/services/following/delete.js";
 import { Followings, Users } from "@/models/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
index 016989b541..653d187c2d 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Instances } from "@/models/index.js";
 import { toPuny } from "@/misc/convert-host.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
index f39a369ecb..98f1f024bc 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
index 25d07f327a..13c893f4b9 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
@@ -1,5 +1,5 @@
 import { db } from "@/db/postgre.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts b/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts
index da76ae624e..1b394ebb85 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts
@@ -1,5 +1,5 @@
 import { UserIps } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/invite.ts b/packages/backend/src/server/api/endpoints/admin/invite.ts
index b8bdb38b46..ebc523d418 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite.ts
@@ -1,5 +1,5 @@
 import rndstr from "rndstr";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { RegistrationTickets } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 2a0a7cfbb8..37625a0c6f 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -1,8 +1,7 @@
 import config from "@/config/index.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { MAX_NOTE_TEXT_LENGTH, MAX_CAPTION_TEXT_LENGTH } from "@/const.js";
-import define from "../../define.js";
-import { Exp } from "@tensorflow/tfjs";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
index 478f2661b6..c8b53088cd 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
index a43cc0cbe1..e2af1ca374 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/promo/create.ts b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
index 00244a777a..55038fc89b 100644
--- a/packages/backend/src/server/api/endpoints/admin/promo/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getNote } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 import { PromoNotes } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
index 9b828bb241..9895f34b40 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { destroy } from "@/queue/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
index 15fdfb0250..ea8c505695 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
@@ -1,6 +1,6 @@
 import { deliverQueue } from "@/queue/queues.js";
 import { URL } from "node:url";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
index 1890bd4345..d4f44e3072 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
@@ -1,5 +1,5 @@
 import { URL } from "node:url";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { inboxQueue } from "@/queue/queues.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
index 4a437c3d12..f51c1e6d46 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
@@ -5,7 +5,7 @@ import {
 	objectStorageQueue,
 	backgroundQueue,
 } from "@/queue/queues.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/add.ts b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
index bb56216a74..ac0084860c 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
@@ -1,7 +1,7 @@
 import { URL } from "node:url";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { addRelay } from "@/services/relay.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/list.ts b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
index 4c294ba9b2..5c3b7a9225 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { listRelay } from "@/services/relay.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
index 1b3d90628b..19a9dfa393 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { removeRelay } from "@/services/relay.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/reset-password.ts b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
index cbe6735ce5..5fbed130e6 100644
--- a/packages/backend/src/server/api/endpoints/admin/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 // import bcrypt from "bcryptjs";
 import rndstr from "rndstr";
 import { Users, UserProfiles } from "@/models/index.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
index c876a21984..a94687cf40 100644
--- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
+++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AbuseUserReports, Users } from "@/models/index.js";
 import { getInstanceActor } from "@/services/instance-actor.js";
 import { deliver } from "@/queue/index.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/search/index-all.ts b/packages/backend/src/server/api/endpoints/admin/search/index-all.ts
index 135b48eccd..531428849b 100644
--- a/packages/backend/src/server/api/endpoints/admin/search/index-all.ts
+++ b/packages/backend/src/server/api/endpoints/admin/search/index-all.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { createIndexAllNotesJob } from "@/queue/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/send-email.ts b/packages/backend/src/server/api/endpoints/admin/send-email.ts
index 1676f68907..1b43d90c8b 100644
--- a/packages/backend/src/server/api/endpoints/admin/send-email.ts
+++ b/packages/backend/src/server/api/endpoints/admin/send-email.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { sendEmail } from "@/services/send-email.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts
index a36dca2f73..5dcbaf2e8d 100644
--- a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts
+++ b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts
@@ -1,7 +1,7 @@
 import sanitizeHtml from "sanitize-html";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users, UserProfiles } from "@/models/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { sendEmail } from "@/services/send-email.js";
 import { createNotification } from "@/services/create-notification.js";
 
diff --git a/packages/backend/src/server/api/endpoints/admin/server-info.ts b/packages/backend/src/server/api/endpoints/admin/server-info.ts
index 8998032cc9..ff46919694 100644
--- a/packages/backend/src/server/api/endpoints/admin/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/admin/server-info.ts
@@ -1,7 +1,7 @@
 import * as os from "node:os";
 import si from "systeminformation";
-import define from "../../define.js";
-import { redisClient } from "../../../../db/redis.js";
+import define from "@/server/api/define.js";
+import { redisClient } from "@/db/redis.js";
 import { db } from "@/db/postgre.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
index df7e8979ca..adceda4162 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { ModerationLogs } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index cbc86a5c17..f3a74c313b 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -1,5 +1,5 @@
 import { Signins, UserProfiles, Users } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/show-users.ts b/packages/backend/src/server/api/endpoints/admin/show-users.ts
index b777bd26d9..1e6ebeda93 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-users.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-users.ts
@@ -1,5 +1,5 @@
 import { Users } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/admin/silence-user.ts b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
index a61823297b..8d9dcac681 100644
--- a/packages/backend/src/server/api/endpoints/admin/silence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { publishInternalEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
index 984bc0789e..c6d6f47bc6 100644
--- a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import deleteFollowing from "@/services/following/delete.js";
 import { Users, Followings, Notifications } from "@/models/index.js";
 import type { User } from "@/models/entities/user.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
index 6a01b8e8d3..6592bf443c 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { publishInternalEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
index e51d5851c2..3289fb570c 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { doPostUnsuspend } from "@/services/unsuspend-user.js";
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 00a472ed3f..70b3d2709e 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -1,7 +1,7 @@
 import { Meta } from "@/models/entities/meta.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { db } from "@/db/postgre.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/update-user-note.ts b/packages/backend/src/server/api/endpoints/admin/update-user-note.ts
index 04870d1c1c..d1a4a60439 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-user-note.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-user-note.ts
@@ -1,5 +1,5 @@
 import { UserProfiles, Users } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["admin"],
diff --git a/packages/backend/src/server/api/endpoints/admin/vacuum.ts b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
index 559b310e46..d5b086bb4b 100644
--- a/packages/backend/src/server/api/endpoints/admin/vacuum.ts
+++ b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { insertModerationLog } from "@/services/insert-moderation-log.js";
 import { db } from "@/db/postgre.js";
 
diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts
index 1bab61ba2c..504eb30e23 100644
--- a/packages/backend/src/server/api/endpoints/announcements.ts
+++ b/packages/backend/src/server/api/endpoints/announcements.ts
@@ -1,6 +1,6 @@
 import { Announcements, AnnouncementReads } from "@/models/index.js";
-import define from "../define.js";
-import { makePaginationQuery } from "../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index ed16450120..46df3aa813 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -1,7 +1,7 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { genId } from "@/misc/gen-id.js";
 import { Antennas, UserLists, UserGroupJoinings } from "@/models/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/antennas/delete.ts b/packages/backend/src/server/api/endpoints/antennas/delete.ts
index a6cf79011a..e5a372f193 100644
--- a/packages/backend/src/server/api/endpoints/antennas/delete.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/delete.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Antennas } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/antennas/list.ts b/packages/backend/src/server/api/endpoints/antennas/list.ts
index 929b761d4f..2726ecc8f7 100644
--- a/packages/backend/src/server/api/endpoints/antennas/list.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/list.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Antennas } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/antennas/markread.ts b/packages/backend/src/server/api/endpoints/antennas/markread.ts
index db8e683e49..bb5b5b77fe 100644
--- a/packages/backend/src/server/api/endpoints/antennas/markread.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/markread.ts
@@ -1,6 +1,5 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Antennas } from "@/models/index.js";
-import { FindOptionsWhere } from "typeorm";
 
 export const meta = {
 	tags: ["antennas", "account"],
diff --git a/packages/backend/src/server/api/endpoints/antennas/notes.ts b/packages/backend/src/server/api/endpoints/antennas/notes.ts
index 149f98ea9b..1512cb9281 100644
--- a/packages/backend/src/server/api/endpoints/antennas/notes.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/notes.ts
@@ -1,13 +1,13 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import readNote from "@/services/note/read.js";
 import { Antennas, Notes } from "@/models/index.js";
 import { redisClient } from "@/db/redis.js";
-import { genId, getTimestamp } from "@/misc/gen-id.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { ApiError } from "../../error.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import { getTimestamp } from "@/misc/gen-id.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { ApiError } from "@/server/api/error.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["antennas", "account", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/antennas/show.ts b/packages/backend/src/server/api/endpoints/antennas/show.ts
index 350d739216..3700052f5a 100644
--- a/packages/backend/src/server/api/endpoints/antennas/show.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/show.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Antennas } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/antennas/update.ts b/packages/backend/src/server/api/endpoints/antennas/update.ts
index f491c0b638..9a71a8f9ff 100644
--- a/packages/backend/src/server/api/endpoints/antennas/update.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/update.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Antennas, UserLists, UserGroupJoinings } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/ap/get.ts b/packages/backend/src/server/api/endpoints/ap/get.ts
index f0db67a343..5159ce3b4a 100644
--- a/packages/backend/src/server/api/endpoints/ap/get.ts
+++ b/packages/backend/src/server/api/endpoints/ap/get.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import Resolver from "@/remote/activitypub/resolver.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts
index c25f0a8018..50eb7e9c6c 100644
--- a/packages/backend/src/server/api/endpoints/ap/show.ts
+++ b/packages/backend/src/server/api/endpoints/ap/show.ts
@@ -1,9 +1,9 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createPerson } from "@/remote/activitypub/models/person.js";
 import { createNote } from "@/remote/activitypub/models/note.js";
 import DbResolver from "@/remote/activitypub/db-resolver.js";
 import Resolver from "@/remote/activitypub/resolver.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { extractDbHost } from "@/misc/convert-host.js";
 import { Users, Notes } from "@/models/index.js";
 import type { Note } from "@/models/entities/note.js";
diff --git a/packages/backend/src/server/api/endpoints/app/create.ts b/packages/backend/src/server/api/endpoints/app/create.ts
index 013c5a10b9..e32edf1293 100644
--- a/packages/backend/src/server/api/endpoints/app/create.ts
+++ b/packages/backend/src/server/api/endpoints/app/create.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Apps } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { unique } from "@/prelude/array.js";
diff --git a/packages/backend/src/server/api/endpoints/app/show.ts b/packages/backend/src/server/api/endpoints/app/show.ts
index 60949512e0..d6f38428c1 100644
--- a/packages/backend/src/server/api/endpoints/app/show.ts
+++ b/packages/backend/src/server/api/endpoints/app/show.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Apps } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/auth/accept.ts b/packages/backend/src/server/api/endpoints/auth/accept.ts
index 8e6ad6527a..088de7863b 100644
--- a/packages/backend/src/server/api/endpoints/auth/accept.ts
+++ b/packages/backend/src/server/api/endpoints/auth/accept.ts
@@ -1,6 +1,6 @@
 import * as crypto from "node:crypto";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { AuthSessions, AccessTokens, Apps } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { secureRndstr } from "@/misc/secure-rndstr.js";
diff --git a/packages/backend/src/server/api/endpoints/auth/session/generate.ts b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
index 1defb94006..bd17211044 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/generate.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
@@ -1,7 +1,7 @@
 import { v4 as uuid } from "uuid";
 import config from "@/config/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Apps, AuthSessions } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/auth/session/show.ts b/packages/backend/src/server/api/endpoints/auth/session/show.ts
index 01a5fe5dc7..70c6d54cd2 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/show.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/show.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { AuthSessions } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
index 0e97bf414e..394681516b 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Apps, AuthSessions, AccessTokens, Users } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/blocking/create.ts b/packages/backend/src/server/api/endpoints/blocking/create.ts
index f00a2923d5..50154dd6cc 100644
--- a/packages/backend/src/server/api/endpoints/blocking/create.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/create.ts
@@ -1,7 +1,7 @@
 import create from "@/services/blocking/create.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Blockings, NoteWatchings, Users } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/blocking/delete.ts b/packages/backend/src/server/api/endpoints/blocking/delete.ts
index 037d5af22c..addf4bbd19 100644
--- a/packages/backend/src/server/api/endpoints/blocking/delete.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/delete.ts
@@ -1,7 +1,7 @@
 import deleteBlocking from "@/services/blocking/delete.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Blockings, Users } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/blocking/list.ts b/packages/backend/src/server/api/endpoints/blocking/list.ts
index 83fca7b42c..6f51a6458d 100644
--- a/packages/backend/src/server/api/endpoints/blocking/list.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/list.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Blockings } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts
index 26a3448b2b..177492ed29 100644
--- a/packages/backend/src/server/api/endpoints/channels/create.ts
+++ b/packages/backend/src/server/api/endpoints/channels/create.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Channels, DriveFiles } from "@/models/index.js";
 import type { Channel } from "@/models/entities/channel.js";
 import { genId } from "@/misc/gen-id.js";
diff --git a/packages/backend/src/server/api/endpoints/channels/featured.ts b/packages/backend/src/server/api/endpoints/channels/featured.ts
index 06e0e850fd..e0575af262 100644
--- a/packages/backend/src/server/api/endpoints/channels/featured.ts
+++ b/packages/backend/src/server/api/endpoints/channels/featured.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Channels } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/channels/follow.ts b/packages/backend/src/server/api/endpoints/channels/follow.ts
index de0554383e..878339827a 100644
--- a/packages/backend/src/server/api/endpoints/channels/follow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/follow.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Channels, ChannelFollowings } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { publishUserEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/channels/followed.ts b/packages/backend/src/server/api/endpoints/channels/followed.ts
index 993a211f7e..94374f6be0 100644
--- a/packages/backend/src/server/api/endpoints/channels/followed.ts
+++ b/packages/backend/src/server/api/endpoints/channels/followed.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Channels, ChannelFollowings } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/channels/owned.ts b/packages/backend/src/server/api/endpoints/channels/owned.ts
index 78d9e80ccf..23607b024c 100644
--- a/packages/backend/src/server/api/endpoints/channels/owned.ts
+++ b/packages/backend/src/server/api/endpoints/channels/owned.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Channels } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["channels", "account"],
diff --git a/packages/backend/src/server/api/endpoints/channels/search.ts b/packages/backend/src/server/api/endpoints/channels/search.ts
index b21fa76206..b2fab701c5 100644
--- a/packages/backend/src/server/api/endpoints/channels/search.ts
+++ b/packages/backend/src/server/api/endpoints/channels/search.ts
@@ -1,9 +1,7 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Brackets } from "typeorm";
-import { Endpoint } from "@/server/api/endpoint-base.js";
 import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { Channels } from "@/models/index.js";
-import { DI } from "@/di-symbols.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/channels/show.ts b/packages/backend/src/server/api/endpoints/channels/show.ts
index e4ca756634..c5c1b65773 100644
--- a/packages/backend/src/server/api/endpoints/channels/show.ts
+++ b/packages/backend/src/server/api/endpoints/channels/show.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Channels } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts
index b5d5325234..f061acab02 100644
--- a/packages/backend/src/server/api/endpoints/channels/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts
@@ -1,7 +1,7 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Notes, Channels } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { activeUsersChart } from "@/services/chart/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/channels/unfollow.ts b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
index 654a4fbba5..3371000394 100644
--- a/packages/backend/src/server/api/endpoints/channels/unfollow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Channels, ChannelFollowings } from "@/models/index.js";
 import { publishUserEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/channels/update.ts b/packages/backend/src/server/api/endpoints/channels/update.ts
index d9f6f7644c..0de7a837a1 100644
--- a/packages/backend/src/server/api/endpoints/channels/update.ts
+++ b/packages/backend/src/server/api/endpoints/channels/update.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Channels, DriveFiles } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts
index 3817a32ca9..d5c3c4eb83 100644
--- a/packages/backend/src/server/api/endpoints/charts/active-users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "users"],
diff --git a/packages/backend/src/server/api/endpoints/charts/ap-request.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
index 9e9013ce53..bbf72030a4 100644
--- a/packages/backend/src/server/api/endpoints/charts/ap-request.ts
+++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { apRequestChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts"],
diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts
index 03ac4c0473..0a5354743c 100644
--- a/packages/backend/src/server/api/endpoints/charts/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/drive.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { driveChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "drive"],
diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts
index 5862aad56e..f9c75d5ecb 100644
--- a/packages/backend/src/server/api/endpoints/charts/federation.ts
+++ b/packages/backend/src/server/api/endpoints/charts/federation.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { federationChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts"],
diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
index 0af1e35ea9..bbd1b70b07 100644
--- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts
+++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { hashtagChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "hashtags"],
diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts
index 11a1dbce1b..4d746ec0b5 100644
--- a/packages/backend/src/server/api/endpoints/charts/instance.ts
+++ b/packages/backend/src/server/api/endpoints/charts/instance.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { instanceChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts"],
diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts
index 27e69a4c9b..b2a1b93fd9 100644
--- a/packages/backend/src/server/api/endpoints/charts/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/notes.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { notesChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
index 178ba453c6..c2745c860c 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { perUserDriveChart } from "@/services/chart/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "drive", "users"],
diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts
index 6a0c22df11..8d8177c300 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/following.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { getJsonSchema } from "@/services/chart/core.js";
 import { perUserFollowingChart } from "@/services/chart/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
index d788076962..4a398d4dd6 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { perUserNotesChart } from "@/services/chart/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "users", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
index 5b0048c50e..fc75d40baf 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { perUserReactionsChart } from "@/services/chart/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "users", "reactions"],
diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts
index 8973f013b7..0dc5f3580a 100644
--- a/packages/backend/src/server/api/endpoints/charts/users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/users.ts
@@ -1,6 +1,6 @@
 import { getJsonSchema } from "@/services/chart/core.js";
 import { usersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["charts", "users"],
diff --git a/packages/backend/src/server/api/endpoints/clips/add-note.ts b/packages/backend/src/server/api/endpoints/clips/add-note.ts
index 416af6faa2..887c8af083 100644
--- a/packages/backend/src/server/api/endpoints/clips/add-note.ts
+++ b/packages/backend/src/server/api/endpoints/clips/add-note.ts
@@ -1,8 +1,8 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { ClipNotes, Clips } from "@/models/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { genId } from "@/misc/gen-id.js";
-import { getNote } from "../../common/getters.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["account", "notes", "clips"],
diff --git a/packages/backend/src/server/api/endpoints/clips/create.ts b/packages/backend/src/server/api/endpoints/clips/create.ts
index 918e9462a4..df03b87b04 100644
--- a/packages/backend/src/server/api/endpoints/clips/create.ts
+++ b/packages/backend/src/server/api/endpoints/clips/create.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { genId } from "@/misc/gen-id.js";
 import { Clips } from "@/models/index.js";
 
diff --git a/packages/backend/src/server/api/endpoints/clips/delete.ts b/packages/backend/src/server/api/endpoints/clips/delete.ts
index 8f2489dddd..02d95b315e 100644
--- a/packages/backend/src/server/api/endpoints/clips/delete.ts
+++ b/packages/backend/src/server/api/endpoints/clips/delete.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Clips } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/clips/list.ts b/packages/backend/src/server/api/endpoints/clips/list.ts
index d1625ee036..d276224366 100644
--- a/packages/backend/src/server/api/endpoints/clips/list.ts
+++ b/packages/backend/src/server/api/endpoints/clips/list.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Clips } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/clips/notes.ts b/packages/backend/src/server/api/endpoints/clips/notes.ts
index c641d9ba9f..13d8310e62 100644
--- a/packages/backend/src/server/api/endpoints/clips/notes.ts
+++ b/packages/backend/src/server/api/endpoints/clips/notes.ts
@@ -1,10 +1,10 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { ClipNotes, Clips, Notes } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { ApiError } from "../../error.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { ApiError } from "@/server/api/error.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["account", "notes", "clips"],
diff --git a/packages/backend/src/server/api/endpoints/clips/remove-note.ts b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
index 2cc19aca94..c081a87abd 100644
--- a/packages/backend/src/server/api/endpoints/clips/remove-note.ts
+++ b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
@@ -1,7 +1,7 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { ClipNotes, Clips } from "@/models/index.js";
-import { ApiError } from "../../error.js";
-import { getNote } from "../../common/getters.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["account", "notes", "clips"],
diff --git a/packages/backend/src/server/api/endpoints/clips/show.ts b/packages/backend/src/server/api/endpoints/clips/show.ts
index 14709b5040..8218a4fb75 100644
--- a/packages/backend/src/server/api/endpoints/clips/show.ts
+++ b/packages/backend/src/server/api/endpoints/clips/show.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Clips } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/clips/update.ts b/packages/backend/src/server/api/endpoints/clips/update.ts
index e78f36e455..fc88548b95 100644
--- a/packages/backend/src/server/api/endpoints/clips/update.ts
+++ b/packages/backend/src/server/api/endpoints/clips/update.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Clips } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/compatibility/custom-emojis.ts b/packages/backend/src/server/api/endpoints/compatibility/custom-emojis.ts
index 62e0836e85..f6c5573af7 100644
--- a/packages/backend/src/server/api/endpoints/compatibility/custom-emojis.ts
+++ b/packages/backend/src/server/api/endpoints/compatibility/custom-emojis.ts
@@ -2,7 +2,7 @@ import { Emojis } from "@/models/index.js";
 import type { Emoji } from "@/models/entities/emoji.js";
 import { IsNull, In } from "typeorm";
 import { FILE_TYPE_BROWSERSAFE } from "@/const.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	requireCredential: false,
diff --git a/packages/backend/src/server/api/endpoints/compatibility/peers.ts b/packages/backend/src/server/api/endpoints/compatibility/peers.ts
index 30f6e0e937..df81d2b0d9 100644
--- a/packages/backend/src/server/api/endpoints/compatibility/peers.ts
+++ b/packages/backend/src/server/api/endpoints/compatibility/peers.ts
@@ -1,5 +1,5 @@
 import { Instances } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/custom-motd.ts b/packages/backend/src/server/api/endpoints/custom-motd.ts
index 098a676a57..d61b31fed6 100644
--- a/packages/backend/src/server/api/endpoints/custom-motd.ts
+++ b/packages/backend/src/server/api/endpoints/custom-motd.ts
@@ -1,6 +1,6 @@
 // import { IsNull } from 'typeorm';
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/custom-splash-icons.ts b/packages/backend/src/server/api/endpoints/custom-splash-icons.ts
index c4833a4eef..f63a1b9600 100644
--- a/packages/backend/src/server/api/endpoints/custom-splash-icons.ts
+++ b/packages/backend/src/server/api/endpoints/custom-splash-icons.ts
@@ -1,6 +1,6 @@
 // import { IsNull } from 'typeorm';
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/drive.ts b/packages/backend/src/server/api/endpoints/drive.ts
index ce98b53a6b..164e7b8f93 100644
--- a/packages/backend/src/server/api/endpoints/drive.ts
+++ b/packages/backend/src/server/api/endpoints/drive.ts
@@ -1,6 +1,6 @@
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { DriveFiles } from "@/models/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["drive", "account"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files.ts b/packages/backend/src/server/api/endpoints/drive/files.ts
index c749e49038..d5dae8767e 100644
--- a/packages/backend/src/server/api/endpoints/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
index 9267da5856..5f821fa72a 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles, Notes } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/caption-image.ts b/packages/backend/src/server/api/endpoints/drive/files/caption-image.ts
index 30c8e3de86..8b23e324d1 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/caption-image.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/caption-image.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { createWorker } from "tesseract.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
index e26da30eb5..2ce9fa4700 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts
index 51b9ea4c36..54ca5f8d1b 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts
@@ -4,9 +4,9 @@ import { DB_MAX_IMAGE_COMMENT_LENGTH } from "@/misc/hard-limits.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { MINUTE } from "@/const.js";
-import define from "../../../define.js";
-import { apiLogger } from "../../../logger.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { apiLogger } from "@/server/api/logger.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/delete.ts b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
index 4e8b4156f3..062b69b9c5 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
@@ -1,8 +1,8 @@
 import { deleteFile } from "@/services/drive/delete-file.js";
 import { publishDriveStream } from "@/services/stream.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { DriveFiles, Users } from "@/models/index.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { DriveFiles } from "@/models/index.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
index ce14f4e09e..eb6881f5be 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
@@ -1,5 +1,5 @@
 import { DriveFiles } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find.ts b/packages/backend/src/server/api/endpoints/drive/files/find.ts
index c2ad95126f..5a243de89b 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles } from "@/models/index.js";
 import { IsNull } from "typeorm";
 
diff --git a/packages/backend/src/server/api/endpoints/drive/files/show.ts b/packages/backend/src/server/api/endpoints/drive/files/show.ts
index 291e3f56bb..455eb76b35 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/show.ts
@@ -1,7 +1,7 @@
 import type { DriveFile } from "@/models/entities/drive-file.js";
-import { DriveFiles, Users } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import { DriveFiles } from "@/models/index.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/update.ts b/packages/backend/src/server/api/endpoints/drive/files/update.ts
index e833fddb58..bde81e007e 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/update.ts
@@ -1,8 +1,8 @@
 import { publishDriveStream } from "@/services/stream.js";
 import { DriveFiles, DriveFolders, Users } from "@/models/index.js";
 import { DB_MAX_IMAGE_COMMENT_LENGTH } from "@/misc/hard-limits.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
index 7bb47dbef5..cdfcb03089 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
@@ -1,5 +1,5 @@
 import { uploadFromUrl } from "@/services/drive/upload-from-url.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
 import { HOUR } from "@/const.js";
diff --git a/packages/backend/src/server/api/endpoints/drive/folders.ts b/packages/backend/src/server/api/endpoints/drive/folders.ts
index ed0d38844b..d02b4fac66 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFolders } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/create.ts b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
index d50f5f2815..554e61ec97 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
@@ -1,6 +1,6 @@
 import { publishDriveStream } from "@/services/stream.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFolders } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
index 98895a7320..1954b43361 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { publishDriveStream } from "@/services/stream.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFolders, DriveFiles } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/find.ts b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
index 45451fb90b..d29015e785 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFolders } from "@/models/index.js";
 import { IsNull } from "typeorm";
 
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/show.ts b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
index 6a72a22777..611724ae44 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFolders } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/update.ts b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
index 13673e9f2e..5bd880da84 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
@@ -1,6 +1,6 @@
 import { publishDriveStream } from "@/services/stream.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFolders } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/drive/stream.ts b/packages/backend/src/server/api/endpoints/drive/stream.ts
index 0c9654ca23..cbd7860175 100644
--- a/packages/backend/src/server/api/endpoints/drive/stream.ts
+++ b/packages/backend/src/server/api/endpoints/drive/stream.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["drive"],
diff --git a/packages/backend/src/server/api/endpoints/email-address/available.ts b/packages/backend/src/server/api/endpoints/email-address/available.ts
index dc3c5e4b8e..eb1d833bd6 100644
--- a/packages/backend/src/server/api/endpoints/email-address/available.ts
+++ b/packages/backend/src/server/api/endpoints/email-address/available.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { validateEmailForAccount } from "@/services/validate-email-for-account.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/emoji.ts b/packages/backend/src/server/api/endpoints/emoji.ts
index f5a5be4ec5..2675ba7bdc 100644
--- a/packages/backend/src/server/api/endpoints/emoji.ts
+++ b/packages/backend/src/server/api/endpoints/emoji.ts
@@ -1,7 +1,7 @@
 import { IsNull } from "typeorm";
 import { Emojis } from "@/models/index.js";
-import define from "../define.js";
-import { ApiError } from "../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/endpoint.ts b/packages/backend/src/server/api/endpoints/endpoint.ts
index ad0ce45623..7dd24f7b7a 100644
--- a/packages/backend/src/server/api/endpoints/endpoint.ts
+++ b/packages/backend/src/server/api/endpoints/endpoint.ts
@@ -1,5 +1,5 @@
-import define from "../define.js";
-import endpoints from "../endpoints.js";
+import define from "@/server/api/define.js";
+import endpoints from "@/server/api/endpoints.js";
 
 export const meta = {
 	requireCredential: false,
diff --git a/packages/backend/src/server/api/endpoints/endpoints.ts b/packages/backend/src/server/api/endpoints/endpoints.ts
index c5844f8437..3064fa07ed 100644
--- a/packages/backend/src/server/api/endpoints/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints/endpoints.ts
@@ -1,5 +1,5 @@
-import define from "../define.js";
-import endpoints from "../endpoints.js";
+import define from "@/server/api/define.js";
+import endpoints from "@/server/api/endpoints.js";
 
 export const meta = {
 	requireCredential: false,
diff --git a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
index f4fc43c173..ca013314e1 100644
--- a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
+++ b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
@@ -1,5 +1,5 @@
 import { createExportCustomEmojisJob } from "@/queue/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 import { HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/federation/followers.ts b/packages/backend/src/server/api/endpoints/federation/followers.ts
index 4c6d83abdb..2a88d27ae5 100644
--- a/packages/backend/src/server/api/endpoints/federation/followers.ts
+++ b/packages/backend/src/server/api/endpoints/federation/followers.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Followings } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["federation"],
diff --git a/packages/backend/src/server/api/endpoints/federation/following.ts b/packages/backend/src/server/api/endpoints/federation/following.ts
index 88b168600b..c13ee8b199 100644
--- a/packages/backend/src/server/api/endpoints/federation/following.ts
+++ b/packages/backend/src/server/api/endpoints/federation/following.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Followings } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["federation"],
diff --git a/packages/backend/src/server/api/endpoints/federation/instances.ts b/packages/backend/src/server/api/endpoints/federation/instances.ts
index fa1a415312..27a6dabb49 100644
--- a/packages/backend/src/server/api/endpoints/federation/instances.ts
+++ b/packages/backend/src/server/api/endpoints/federation/instances.ts
@@ -1,5 +1,4 @@
-import config from "@/config/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Instances } from "@/models/index.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
diff --git a/packages/backend/src/server/api/endpoints/federation/show-instance.ts b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
index 633bb57073..c4a6304d05 100644
--- a/packages/backend/src/server/api/endpoints/federation/show-instance.ts
+++ b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Instances } from "@/models/index.js";
 import { toPuny } from "@/misc/convert-host.js";
 
diff --git a/packages/backend/src/server/api/endpoints/federation/stats.ts b/packages/backend/src/server/api/endpoints/federation/stats.ts
index ede7a56c27..6702eeff5f 100644
--- a/packages/backend/src/server/api/endpoints/federation/stats.ts
+++ b/packages/backend/src/server/api/endpoints/federation/stats.ts
@@ -1,7 +1,7 @@
 import { IsNull, MoreThan, Not } from "typeorm";
 import { Followings, Instances } from "@/models/index.js";
 import { awaitAll } from "@/prelude/await-all.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["federation"],
diff --git a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
index f4c3f6d18c..e8ada9e622 100644
--- a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
+++ b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { getRemoteUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { getRemoteUser } from "@/server/api/common/getters.js";
 import { updatePerson } from "@/remote/activitypub/models/person.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/federation/users.ts b/packages/backend/src/server/api/endpoints/federation/users.ts
index ded0a26c5f..4e925a29e2 100644
--- a/packages/backend/src/server/api/endpoints/federation/users.ts
+++ b/packages/backend/src/server/api/endpoints/federation/users.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["federation"],
diff --git a/packages/backend/src/server/api/endpoints/fetch-rss.ts b/packages/backend/src/server/api/endpoints/fetch-rss.ts
index b73d7262c9..bda3c455d1 100644
--- a/packages/backend/src/server/api/endpoints/fetch-rss.ts
+++ b/packages/backend/src/server/api/endpoints/fetch-rss.ts
@@ -1,7 +1,7 @@
 import Parser from "rss-parser";
 import { getResponse } from "@/misc/fetch.js";
 import config from "@/config/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 const rssParser = new Parser();
 
diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts
index 48ae6ae7af..f6e341ad73 100644
--- a/packages/backend/src/server/api/endpoints/following/create.ts
+++ b/packages/backend/src/server/api/endpoints/following/create.ts
@@ -1,7 +1,7 @@
 import create from "@/services/following/create.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Followings, Users } from "@/models/index.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 import { HOUR } from "@/const.js";
diff --git a/packages/backend/src/server/api/endpoints/following/delete.ts b/packages/backend/src/server/api/endpoints/following/delete.ts
index cbc6097f4d..3ef031eb20 100644
--- a/packages/backend/src/server/api/endpoints/following/delete.ts
+++ b/packages/backend/src/server/api/endpoints/following/delete.ts
@@ -1,7 +1,7 @@
 import deleteFollowing from "@/services/following/delete.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Followings, Users } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/following/invalidate.ts b/packages/backend/src/server/api/endpoints/following/invalidate.ts
index 01ccc2761b..7559062c0f 100644
--- a/packages/backend/src/server/api/endpoints/following/invalidate.ts
+++ b/packages/backend/src/server/api/endpoints/following/invalidate.ts
@@ -1,7 +1,7 @@
 import deleteFollowing from "@/services/following/delete.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Followings, Users } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/following/requests/accept.ts b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
index a4fc052367..cb6b010726 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/accept.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
@@ -1,7 +1,7 @@
 import acceptFollowRequest from "@/services/following/requests/accept.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["following", "account"],
diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
index f309e32999..7acb0f948b 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,7 +1,7 @@
 import cancelFollowRequest from "@/services/following/requests/cancel.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Users } from "@/models/index.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 
diff --git a/packages/backend/src/server/api/endpoints/following/requests/list.ts b/packages/backend/src/server/api/endpoints/following/requests/list.ts
index 6ba23de585..97f52d4ac2 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/list.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/list.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { FollowRequests } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/following/requests/reject.ts b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
index fedc0db487..37e7bc0abc 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/reject.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
@@ -1,7 +1,7 @@
 import { rejectFollowRequest } from "@/services/following/reject.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["following", "account"],
diff --git a/packages/backend/src/server/api/endpoints/gallery/featured.ts b/packages/backend/src/server/api/endpoints/gallery/featured.ts
index d478e8e3bf..e20e4ab20b 100644
--- a/packages/backend/src/server/api/endpoints/gallery/featured.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/featured.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { GalleryPosts } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/popular.ts b/packages/backend/src/server/api/endpoints/gallery/popular.ts
index 5eef68d971..805307e459 100644
--- a/packages/backend/src/server/api/endpoints/gallery/popular.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/popular.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { GalleryPosts } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts.ts b/packages/backend/src/server/api/endpoints/gallery/posts.ts
index f97c161aff..0dd02b930d 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { GalleryPosts } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
index f3b3768e28..a74f2165c2 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
@@ -1,8 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles, GalleryPosts } from "@/models/index.js";
-import { genId } from "../../../../../misc/gen-id.js";
+import { genId } from "@/server/api/../../misc/gen-id.js";
 import { GalleryPost } from "@/models/entities/gallery-post.js";
-import { ApiError } from "../../../error.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
index 9fd9a50099..360ca8c5ad 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { GalleryPosts } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
index 2506e40aaa..f5ccc5bc68 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { GalleryPosts, GalleryLikes } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
index 87e272f018..7e172da45e 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { GalleryPosts } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
index 03bc299b94..f37456a626 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { GalleryPosts, GalleryLikes } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
index 64e204172e..16c629706c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
@@ -1,7 +1,5 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { DriveFiles, GalleryPosts } from "@/models/index.js";
-import { GalleryPost } from "@/models/entities/gallery-post.js";
-import { ApiError } from "../../../error.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/get-online-users-count.ts b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
index 805674a5b7..633e75335a 100644
--- a/packages/backend/src/server/api/endpoints/get-online-users-count.ts
+++ b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
@@ -1,7 +1,7 @@
 import { MoreThan } from "typeorm";
 import { USER_ONLINE_THRESHOLD } from "@/const.js";
 import { Users } from "@/models/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/get-sounds.ts b/packages/backend/src/server/api/endpoints/get-sounds.ts
index f7edd38609..4fd1498bd8 100644
--- a/packages/backend/src/server/api/endpoints/get-sounds.ts
+++ b/packages/backend/src/server/api/endpoints/get-sounds.ts
@@ -1,5 +1,5 @@
 import { readdir } from "fs/promises";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/hashtags/list.ts b/packages/backend/src/server/api/endpoints/hashtags/list.ts
index df99a1e5a6..6e8016f64b 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/list.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/list.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Hashtags } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/hashtags/search.ts b/packages/backend/src/server/api/endpoints/hashtags/search.ts
index cde586af0c..1dc1fb4922 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/search.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/search.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Hashtags } from "@/models/index.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
diff --git a/packages/backend/src/server/api/endpoints/hashtags/show.ts b/packages/backend/src/server/api/endpoints/hashtags/show.ts
index 8cf90e4505..09849dbd36 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/show.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/show.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Hashtags } from "@/models/index.js";
 import { normalizeForSearch } from "@/misc/normalize-for-search.js";
 
diff --git a/packages/backend/src/server/api/endpoints/hashtags/trend.ts b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
index e2a8345112..fe8bba95fd 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/trend.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
@@ -1,5 +1,5 @@
 import { Brackets } from "typeorm";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Notes } from "@/models/index.js";
 import type { Note } from "@/models/entities/note.js";
diff --git a/packages/backend/src/server/api/endpoints/hashtags/users.ts b/packages/backend/src/server/api/endpoints/hashtags/users.ts
index 532c663070..ccb70a0596 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/users.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/users.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Users } from "@/models/index.js";
 import { normalizeForSearch } from "@/misc/normalize-for-search.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i.ts b/packages/backend/src/server/api/endpoints/i.ts
index 39543442c5..69eabf4d24 100644
--- a/packages/backend/src/server/api/endpoints/i.ts
+++ b/packages/backend/src/server/api/endpoints/i.ts
@@ -1,5 +1,5 @@
 import { Users } from "@/models/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/done.ts b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
index 05d57d2821..c1a7b16a84 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
@@ -1,6 +1,6 @@
 import { publishMainStream } from "@/services/stream.js";
 import * as OTPAuth from "otpauth";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users, UserProfiles } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
index 32f972d0b6..b8104e318f 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
@@ -1,5 +1,5 @@
-import { decode } from "msgpackr";
-import define from "../../../define.js";
+import { decode } from "cbor-x";
+import define from "@/server/api/define.js";
 import {
 	UserProfiles,
 	UserSecurityKeys,
@@ -7,7 +7,7 @@ import {
 	Users,
 } from "@/models/index.js";
 import config from "@/config/index.js";
-import { procedures, hash } from "../../../2fa.js";
+import { procedures, hash } from "@/server/api/2fa.js";
 import { publishMainStream } from "@/services/stream.js";
 import { comparePassword } from "@/misc/password.js";
 
@@ -62,7 +62,7 @@ export default define(meta, paramDef, async (ps, user) => {
 
 	const clientDataJSONHash = hash(Buffer.from(ps.clientDataJSON, "utf-8"));
 
-	const attestation = decode(Buffer.from(ps.attestationObject, "utf-8"));
+	const attestation = decode(Buffer.from(ps.attestationObject, "hex"));
 
 	const rpIdHash = attestation.authData.slice(0, 32);
 	if (!rpIdHashReal.equals(rpIdHash)) {
@@ -79,7 +79,13 @@ export default define(meta, paramDef, async (ps, user) => {
 	const credentialIdLength = authData.readUInt16BE(53);
 	const credentialId = authData.slice(55, 55 + credentialIdLength);
 	const publicKeyData = authData.slice(55 + credentialIdLength);
-	const publicKey: Map<number, any> = decode(publicKeyData);
+	const publicKey: Map<Number, any> = new Map(
+		Object.entries(decode(publicKeyData)).map(([key, value]) => [
+			Number(key),
+			value,
+		]),
+	);
+
 	if (publicKey.get(3) !== -7) {
 		throw new Error("alg mismatch");
 	}
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
index b9f3426804..8125f817a0 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
@@ -1,7 +1,7 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users, UserProfiles, UserSecurityKeys } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
index a10dc9b256..8080c9390f 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
@@ -1,9 +1,9 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { UserProfiles, AttestationChallenges } from "@/models/index.js";
 import { promisify } from "node:util";
 import * as crypto from "node:crypto";
 import { genId } from "@/misc/gen-id.js";
-import { hash } from "../../../2fa.js";
+import { hash } from "@/server/api/2fa.js";
 import { comparePassword } from "@/misc/password.js";
 
 const randomBytes = promisify(crypto.randomBytes);
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
index cf391ca2fd..52e1df39f4 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
@@ -2,7 +2,7 @@ import * as OTPAuth from "otpauth";
 import * as QRCode from "qrcode";
 import config from "@/config/index.js";
 import { UserProfiles } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { comparePassword } from "@/misc/password.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
index d91c8f214b..b3bc5bdfac 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
@@ -1,5 +1,5 @@
 import { comparePassword } from "@/misc/password.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { UserProfiles, UserSecurityKeys, Users } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
index 54f1422d4c..c4e78eecb5 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
@@ -1,5 +1,5 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users, UserProfiles } from "@/models/index.js";
 import { comparePassword } from "@/misc/password.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts
index 7587ec780e..d77ecc88e8 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts
@@ -1,7 +1,7 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Users, UserSecurityKeys } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/apps.ts b/packages/backend/src/server/api/endpoints/i/apps.ts
index b951601949..7e7574ec91 100644
--- a/packages/backend/src/server/api/endpoints/i/apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/apps.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AccessTokens } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
index f759b23037..ad66fe1fd3 100644
--- a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AccessTokens, Apps } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/change-password.ts b/packages/backend/src/server/api/endpoints/i/change-password.ts
index 8bbb3ad93a..b0dc8bba60 100644
--- a/packages/backend/src/server/api/endpoints/i/change-password.ts
+++ b/packages/backend/src/server/api/endpoints/i/change-password.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { UserProfiles } from "@/models/index.js";
 import { hashPassword, comparePassword } from "@/misc/password.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/delete-account.ts b/packages/backend/src/server/api/endpoints/i/delete-account.ts
index 781abe0b38..606cde82e1 100644
--- a/packages/backend/src/server/api/endpoints/i/delete-account.ts
+++ b/packages/backend/src/server/api/endpoints/i/delete-account.ts
@@ -1,6 +1,6 @@
 import { UserProfiles, Users } from "@/models/index.js";
 import { deleteAccount } from "@/services/delete-account.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { comparePassword } from "@/misc/password.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/export-blocking.ts b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
index 4517ad5fab..30e74ab2f5 100644
--- a/packages/backend/src/server/api/endpoints/i/export-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createExportBlockingJob } from "@/queue/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/export-following.ts b/packages/backend/src/server/api/endpoints/i/export-following.ts
index a228de8f17..07d2997a18 100644
--- a/packages/backend/src/server/api/endpoints/i/export-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-following.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createExportFollowingJob } from "@/queue/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/export-mute.ts b/packages/backend/src/server/api/endpoints/i/export-mute.ts
index 7bddc434d4..7d22a073e6 100644
--- a/packages/backend/src/server/api/endpoints/i/export-mute.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-mute.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createExportMuteJob } from "@/queue/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/export-notes.ts b/packages/backend/src/server/api/endpoints/i/export-notes.ts
index 48506ed6d9..f167bb83cb 100644
--- a/packages/backend/src/server/api/endpoints/i/export-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-notes.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createExportNotesJob } from "@/queue/index.js";
 import { DAY } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
index a71b1730b4..b68d889dcd 100644
--- a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createExportUserListsJob } from "@/queue/index.js";
 import { MINUTE } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/favorites.ts b/packages/backend/src/server/api/endpoints/i/favorites.ts
index f0dbd2de6b..f0961ea236 100644
--- a/packages/backend/src/server/api/endpoints/i/favorites.ts
+++ b/packages/backend/src/server/api/endpoints/i/favorites.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { NoteFavorites } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "notes", "favorites"],
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
index d71ee3e5a1..80c90e684d 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { GalleryLikes } from "@/models/index.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "gallery"],
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
index e471731ae7..054784842d 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
@@ -1,6 +1,6 @@
 import { GalleryPosts } from "@/models/index.js";
-import define from "../../../define.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "gallery"],
diff --git a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
index bd58f9257a..39cc45e822 100644
--- a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
+++ b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { MutedNotes } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/import-blocking.ts b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
index e4f1da60cc..58314aced3 100644
--- a/packages/backend/src/server/api/endpoints/i/import-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createImportBlockingJob } from "@/queue/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/import-following.ts b/packages/backend/src/server/api/endpoints/i/import-following.ts
index 1a6c9b565d..b7c475698c 100644
--- a/packages/backend/src/server/api/endpoints/i/import-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-following.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createImportFollowingJob } from "@/queue/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/import-muting.ts b/packages/backend/src/server/api/endpoints/i/import-muting.ts
index 20d240e739..494fb0d420 100644
--- a/packages/backend/src/server/api/endpoints/i/import-muting.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-muting.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createImportMutingJob } from "@/queue/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/import-posts.ts b/packages/backend/src/server/api/endpoints/i/import-posts.ts
index 3adba0514e..b8b52be98f 100644
--- a/packages/backend/src/server/api/endpoints/i/import-posts.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-posts.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createImportPostsJob } from "@/queue/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles } from "@/models/index.js";
 import { DAY } from "@/const.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
diff --git a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
index 03b1dffbbb..ed82a96054 100644
--- a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { createImportUserListsJob } from "@/queue/index.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { DriveFiles } from "@/models/index.js";
 import { HOUR } from "@/const.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/known-as.ts b/packages/backend/src/server/api/endpoints/i/known-as.ts
index 384cbd7c34..39bf6fff83 100644
--- a/packages/backend/src/server/api/endpoints/i/known-as.ts
+++ b/packages/backend/src/server/api/endpoints/i/known-as.ts
@@ -5,9 +5,9 @@ import acceptAllFollowRequests from "@/services/following/requests/accept-all.js
 import { publishToFollowers } from "@/services/i/update.js";
 import { publishMainStream } from "@/services/stream.js";
 import { DAY } from "@/const.js";
-import { apiLogger } from "../../logger.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import { apiLogger } from "@/server/api/logger.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { parse } from "@/misc/acct.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/move.ts b/packages/backend/src/server/api/endpoints/i/move.ts
index 2c064e1d66..c6d1205f98 100644
--- a/packages/backend/src/server/api/endpoints/i/move.ts
+++ b/packages/backend/src/server/api/endpoints/i/move.ts
@@ -3,9 +3,9 @@ import { resolveUser } from "@/remote/resolve-user.js";
 import { DAY } from "@/const.js";
 import DeliverManager from "@/remote/activitypub/deliver-manager.js";
 import { renderActivity } from "@/remote/activitypub/renderer/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { apiLogger } from "../../logger.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { apiLogger } from "@/server/api/logger.js";
 import deleteFollowing from "@/services/following/delete.js";
 import create from "@/services/following/create.js";
 import { getUser } from "@/server/api/common/getters.js";
diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts
index 6e1aabef7d..b07247dd83 100644
--- a/packages/backend/src/server/api/endpoints/i/notifications.ts
+++ b/packages/backend/src/server/api/endpoints/i/notifications.ts
@@ -8,9 +8,9 @@ import {
 } from "@/models/index.js";
 import { notificationTypes } from "@/types.js";
 import read from "@/services/note/read.js";
-import { readNotification } from "../../common/read-notification.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { readNotification } from "@/server/api/common/read-notification.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "notifications"],
diff --git a/packages/backend/src/server/api/endpoints/i/page-likes.ts b/packages/backend/src/server/api/endpoints/i/page-likes.ts
index 1be783a061..289d072670 100644
--- a/packages/backend/src/server/api/endpoints/i/page-likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/page-likes.ts
@@ -1,6 +1,6 @@
 import { PageLikes } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "pages"],
diff --git a/packages/backend/src/server/api/endpoints/i/pages.ts b/packages/backend/src/server/api/endpoints/i/pages.ts
index 78b72e3bce..1177d2e664 100644
--- a/packages/backend/src/server/api/endpoints/i/pages.ts
+++ b/packages/backend/src/server/api/endpoints/i/pages.ts
@@ -1,6 +1,6 @@
 import { Pages } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "pages"],
diff --git a/packages/backend/src/server/api/endpoints/i/pin.ts b/packages/backend/src/server/api/endpoints/i/pin.ts
index 7520705265..4291541ea2 100644
--- a/packages/backend/src/server/api/endpoints/i/pin.ts
+++ b/packages/backend/src/server/api/endpoints/i/pin.ts
@@ -1,6 +1,6 @@
 import { addPinned } from "@/services/i/pin.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Users } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
index 0333677275..505c424edb 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
@@ -1,5 +1,5 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { MessagingMessages, UserGroupJoinings } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
index 8a8857c83c..6f70e55a1a 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
@@ -1,5 +1,5 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { NoteUnreads } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/read-announcement.ts b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
index d0dfa66579..a59d15b994 100644
--- a/packages/backend/src/server/api/endpoints/i/read-announcement.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { genId } from "@/misc/gen-id.js";
 import { AnnouncementReads, Announcements, Users } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
index b5b34c0902..c1b4325adb 100644
--- a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
@@ -3,8 +3,8 @@ import {
 	publishMainStream,
 	publishUserEvent,
 } from "@/services/stream.js";
-import generateUserToken from "../../common/generate-native-user-token.js";
-import define from "../../define.js";
+import generateUserToken from "@/server/api/common/generate-native-user-token.js";
+import define from "@/server/api/define.js";
 import { Users, UserProfiles } from "@/models/index.js";
 import { comparePassword } from "@/misc/password.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
index ee9fe7e9d5..c267bb144e 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
index 85900bd74d..57db3c7144 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts b/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts
index a9bcf69351..ac37beea54 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-unsecure.ts
@@ -1,5 +1,5 @@
-import { ApiError } from "../../../error.js";
-import define from "../../../define.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get.ts b/packages/backend/src/server/api/endpoints/i/registry/get.ts
index b143b7228a..d25047e009 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
index 23698dc53a..f691552bce 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys.ts b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
index ad7d08c5af..186e744bd1 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/registry/remove.ts b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
index d3793b0e20..aa459952ee 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/remove.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
-import { ApiError } from "../../../error.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
index 3d66359c1d..e235ef67f0 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/registry/set.ts b/packages/backend/src/server/api/endpoints/i/registry/set.ts
index 7f9eebd5e0..7a1f8ab5f7 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/set.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/set.ts
@@ -1,5 +1,5 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/revoke-token.ts b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
index 3a410fa0e5..f3e8116944 100644
--- a/packages/backend/src/server/api/endpoints/i/revoke-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AccessTokens } from "@/models/index.js";
 import { publishUserEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/signin-history.ts b/packages/backend/src/server/api/endpoints/i/signin-history.ts
index 288b750b7b..14d303089e 100644
--- a/packages/backend/src/server/api/endpoints/i/signin-history.ts
+++ b/packages/backend/src/server/api/endpoints/i/signin-history.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Signins } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/i/unpin.ts b/packages/backend/src/server/api/endpoints/i/unpin.ts
index c248eb34e5..9aee1dfea8 100644
--- a/packages/backend/src/server/api/endpoints/i/unpin.ts
+++ b/packages/backend/src/server/api/endpoints/i/unpin.ts
@@ -1,6 +1,6 @@
 import { removePinned } from "@/services/i/pin.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Users } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts
index 94ad6b3c72..a48252ed1a 100644
--- a/packages/backend/src/server/api/endpoints/i/update-email.ts
+++ b/packages/backend/src/server/api/endpoints/i/update-email.ts
@@ -1,10 +1,10 @@
 import { publishMainStream } from "@/services/stream.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import rndstr from "rndstr";
 import config from "@/config/index.js";
 import { Users, UserProfiles } from "@/models/index.js";
 import { sendEmail } from "@/services/send-email.js";
-import { ApiError } from "../../error.js";
+import { ApiError } from "@/server/api/error.js";
 import { validateEmailForAccount } from "@/services/validate-email-for-account.js";
 import { HOUR } from "@/const.js";
 import { comparePassword } from "@/misc/password.js";
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index a464bd344a..7b900a74ad 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -13,9 +13,8 @@ import { notificationTypes } from "@/types.js";
 import { normalizeForSearch } from "@/misc/normalize-for-search.js";
 import { langmap } from "@/misc/langmap.js";
 import { verifyLink } from "@/services/fetch-rel-me.js";
-import { ApiError } from "../../error.js";
-import config from "@/config/index.js";
-import define from "../../define.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
index d0c6caf0e2..99e8209a37 100644
--- a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
+++ b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { UserGroupInvitations } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account", "groups"],
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
index 2b0f1781ea..ee38b76372 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { genId } from "@/misc/gen-id.js";
 import { Webhooks } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/delete.ts b/packages/backend/src/server/api/endpoints/i/webhooks/delete.ts
index 4a2c3d83be..a92ed179d0 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/delete.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/delete.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Webhooks } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/list.ts b/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
index 3afead5996..f937e560c5 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/list.ts
@@ -1,4 +1,4 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { Webhooks } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/show.ts b/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
index 96c0457475..b24850f5e5 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/show.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Webhooks } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/update.ts b/packages/backend/src/server/api/endpoints/i/webhooks/update.ts
index 161d705e12..4a211b915f 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/update.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { Webhooks } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 import { webhookEventTypes } from "@/models/entities/webhook.js";
diff --git a/packages/backend/src/server/api/endpoints/latest-version.ts b/packages/backend/src/server/api/endpoints/latest-version.ts
index 4d07406d1e..a5c00e7a4c 100644
--- a/packages/backend/src/server/api/endpoints/latest-version.ts
+++ b/packages/backend/src/server/api/endpoints/latest-version.ts
@@ -1,4 +1,4 @@
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/messaging/history.ts b/packages/backend/src/server/api/endpoints/messaging/history.ts
index 7d1df69850..25418a17a6 100644
--- a/packages/backend/src/server/api/endpoints/messaging/history.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/history.ts
@@ -5,7 +5,7 @@ import {
 	Mutings,
 	UserGroupJoinings,
 } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["messaging"],
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages.ts b/packages/backend/src/server/api/endpoints/messaging/messages.ts
index 17f626b69e..01f7028673 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages.ts
@@ -1,19 +1,19 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import {
 	MessagingMessages,
 	UserGroups,
 	UserGroupJoinings,
 	Users,
 } from "@/models/index.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { Brackets } from "typeorm";
 import {
 	readUserMessagingMessage,
 	readGroupMessagingMessage,
 	deliverReadActivity,
-} from "../../common/read-messaging-message.js";
+} from "@/server/api/common/read-messaging-message.js";
 
 export const meta = {
 	tags: ["messaging"],
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
index 4ffbb0699f..6fd38eff79 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
@@ -1,8 +1,7 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import {
-	MessagingMessages,
 	DriveFiles,
 	UserGroups,
 	UserGroupJoinings,
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
index 42ff050d16..76691dd34d 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
@@ -1,5 +1,5 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { MessagingMessages } from "@/models/index.js";
 import { deleteMessage } from "@/services/messages/delete.js";
 import { SECOND, HOUR } from "@/const.js";
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
index 0ef013b799..5aa50155ca 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
@@ -1,10 +1,10 @@
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { MessagingMessages } from "@/models/index.js";
 import {
 	readUserMessagingMessage,
 	readGroupMessagingMessage,
-} from "../../../common/read-messaging-message.js";
+} from "@/server/api/common/read-messaging-message.js";
 
 export const meta = {
 	tags: ["messaging"],
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 8c521fcff9..03cf0fb631 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -4,7 +4,7 @@ import config from "@/config/index.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Ads, Emojis, Users } from "@/models/index.js";
 import { MAX_NOTE_TEXT_LENGTH, MAX_CAPTION_TEXT_LENGTH } from "@/const.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
index 0525d79a7e..bca09d3f07 100644
--- a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
+++ b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { AccessTokens } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { secureRndstr } from "@/misc/secure-rndstr.js";
diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts
index 7b2f109053..2eb935198e 100644
--- a/packages/backend/src/server/api/endpoints/mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/mute/create.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { genId } from "@/misc/gen-id.js";
 import { Mutings, NoteWatchings } from "@/models/index.js";
 import type { Muting } from "@/models/entities/muting.js";
diff --git a/packages/backend/src/server/api/endpoints/mute/delete.ts b/packages/backend/src/server/api/endpoints/mute/delete.ts
index cd00c1a8ab..8058e9a612 100644
--- a/packages/backend/src/server/api/endpoints/mute/delete.ts
+++ b/packages/backend/src/server/api/endpoints/mute/delete.ts
@@ -1,6 +1,6 @@
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 import { Mutings } from "@/models/index.js";
 import { publishUserEvent } from "@/services/stream.js";
 
diff --git a/packages/backend/src/server/api/endpoints/mute/list.ts b/packages/backend/src/server/api/endpoints/mute/list.ts
index 7bbe29a4c8..9619457cd7 100644
--- a/packages/backend/src/server/api/endpoints/mute/list.ts
+++ b/packages/backend/src/server/api/endpoints/mute/list.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 import { Mutings } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/my/apps.ts b/packages/backend/src/server/api/endpoints/my/apps.ts
index 8a097c8a04..bc75b38e58 100644
--- a/packages/backend/src/server/api/endpoints/my/apps.ts
+++ b/packages/backend/src/server/api/endpoints/my/apps.ts
@@ -1,4 +1,4 @@
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { Apps } from "@/models/index.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/notes.ts b/packages/backend/src/server/api/endpoints/notes.ts
index 9787740ab0..6e2d3b4f3b 100644
--- a/packages/backend/src/server/api/endpoints/notes.ts
+++ b/packages/backend/src/server/api/endpoints/notes.ts
@@ -1,6 +1,6 @@
 import { Notes } from "@/models/index.js";
-import define from "../define.js";
-import { makePaginationQuery } from "../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/children.ts b/packages/backend/src/server/api/endpoints/notes/children.ts
index a35b17a022..d76771c34c 100644
--- a/packages/backend/src/server/api/endpoints/notes/children.ts
+++ b/packages/backend/src/server/api/endpoints/notes/children.ts
@@ -1,9 +1,9 @@
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/clips.ts b/packages/backend/src/server/api/endpoints/notes/clips.ts
index 34b035add2..430ed02ec6 100644
--- a/packages/backend/src/server/api/endpoints/notes/clips.ts
+++ b/packages/backend/src/server/api/endpoints/notes/clips.ts
@@ -1,8 +1,8 @@
 import { In } from "typeorm";
 import { ClipNotes, Clips } from "@/models/index.js";
-import define from "../../define.js";
-import { getNote } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["clips", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/conversation.ts b/packages/backend/src/server/api/endpoints/notes/conversation.ts
index c74da2ec71..9939740874 100644
--- a/packages/backend/src/server/api/endpoints/notes/conversation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/conversation.ts
@@ -1,8 +1,8 @@
 import type { Note } from "@/models/entities/note.js";
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getNote } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index f3fc2ac28b..b5b5dee113 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -12,9 +12,9 @@ import type { DriveFile } from "@/models/entities/drive-file.js";
 import type { Note } from "@/models/entities/note.js";
 import type { Channel } from "@/models/entities/channel.js";
 import { MAX_NOTE_TEXT_LENGTH } from "@/const.js";
-import { noteVisibilities } from "../../../../types.js";
-import { ApiError } from "../../error.js";
-import define from "../../define.js";
+import { noteVisibilities } from "@/types.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 import { HOUR } from "@/const.js";
 import { getNote } from "../../common/getters.js";
 import { langmap } from "@/misc/langmap.js";
diff --git a/packages/backend/src/server/api/endpoints/notes/delete.ts b/packages/backend/src/server/api/endpoints/notes/delete.ts
index 5fc79db7d1..54aad1ebad 100644
--- a/packages/backend/src/server/api/endpoints/notes/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/delete.ts
@@ -1,8 +1,8 @@
 import deleteNote from "@/services/note/delete.js";
 import { Users } from "@/models/index.js";
-import define from "../../define.js";
-import { getNote } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 import { SECOND, HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts
index 404e7e35f1..a05580aa21 100644
--- a/packages/backend/src/server/api/endpoints/notes/edit.ts
+++ b/packages/backend/src/server/api/endpoints/notes/edit.ts
@@ -1,5 +1,5 @@
 import { In } from "typeorm";
-import create, { index } from "@/services/note/create.js";
+import { index } from "@/services/note/create.js";
 import type { IRemoteUser, User } from "@/models/entities/user.js";
 import {
 	Users,
@@ -15,11 +15,11 @@ import type { DriveFile } from "@/models/entities/drive-file.js";
 import type { IMentionedRemoteUsers, Note } from "@/models/entities/note.js";
 import type { Channel } from "@/models/entities/channel.js";
 import { MAX_NOTE_TEXT_LENGTH } from "@/const.js";
-import { noteVisibilities } from "../../../../types.js";
-import { ApiError } from "../../error.js";
-import define from "../../define.js";
+import { noteVisibilities } from "@/types.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 import { HOUR } from "@/const.js";
-import { getNote } from "../../common/getters.js";
+import { getNote } from "@/server/api/common/getters.js";
 import { Poll } from "@/models/entities/poll.js";
 import * as mfm from "mfm-js";
 import { concat } from "@/prelude/array.js";
@@ -34,7 +34,6 @@ import renderNote from "@/remote/activitypub/renderer/note.js";
 import renderUpdate from "@/remote/activitypub/renderer/update.js";
 import { deliverToRelays } from "@/services/relay.js";
 // import { deliverQuestionUpdate } from "@/services/note/polls/update.js";
-import { fetchMeta } from "@/misc/fetch-meta.js";
 import { langmap } from "@/misc/langmap.js";
 import detectLanguage from "@/misc/detect-language.js";
 
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
index 64862a3733..8b2c7ad3a4 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,8 +1,8 @@
 import { NoteFavorites } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getNote } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["notes", "favorites"],
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
index e05d04a969..018ef91bca 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,7 +1,7 @@
 import { NoteFavorites } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getNote } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["notes", "favorites"],
diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts
index 47c1e13812..4f90145ec3 100644
--- a/packages/backend/src/server/api/endpoints/notes/featured.ts
+++ b/packages/backend/src/server/api/endpoints/notes/featured.ts
@@ -1,7 +1,7 @@
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
index 0a365a6dfd..fee660ddb2 100644
--- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,14 +1,14 @@
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Notes } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateRepliesQuery } from "../../common/generate-replies-query.js";
-import { generateMutedNoteQuery } from "../../common/generate-muted-note-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedUserRenotesQueryForNotes } from "../../common/generated-muted-renote-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateRepliesQuery } from "@/server/api/common/generate-replies-query.js";
+import { generateMutedNoteQuery } from "@/server/api/common/generate-muted-note-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedUserRenotesQueryForNotes } from "@/server/api/common/generated-muted-renote-query.js";
 
 export const meta = {
 	tags: ["notes"],
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 4e32b0ab29..c573a0c865 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -2,16 +2,16 @@ import { Brackets } from "typeorm";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Followings, Notes } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateRepliesQuery } from "../../common/generate-replies-query.js";
-import { generateMutedNoteQuery } from "../../common/generate-muted-note-query.js";
-import { generateChannelQuery } from "../../common/generate-channel-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedUserRenotesQueryForNotes } from "../../common/generated-muted-renote-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateRepliesQuery } from "@/server/api/common/generate-replies-query.js";
+import { generateMutedNoteQuery } from "@/server/api/common/generate-muted-note-query.js";
+import { generateChannelQuery } from "@/server/api/common/generate-channel-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedUserRenotesQueryForNotes } from "@/server/api/common/generated-muted-renote-query.js";
 
 export const meta = {
 	tags: ["notes"],
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 82e93e371f..c89b8f8710 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,17 +1,17 @@
 import { Brackets } from "typeorm";
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import { Notes, Users } from "@/models/index.js";
+import { Notes } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateRepliesQuery } from "../../common/generate-replies-query.js";
-import { generateMutedNoteQuery } from "../../common/generate-muted-note-query.js";
-import { generateChannelQuery } from "../../common/generate-channel-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedUserRenotesQueryForNotes } from "../../common/generated-muted-renote-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateRepliesQuery } from "@/server/api/common/generate-replies-query.js";
+import { generateMutedNoteQuery } from "@/server/api/common/generate-muted-note-query.js";
+import { generateChannelQuery } from "@/server/api/common/generate-channel-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedUserRenotesQueryForNotes } from "@/server/api/common/generated-muted-renote-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts
index 68688b504c..44ee90938b 100644
--- a/packages/backend/src/server/api/endpoints/notes/mentions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts
@@ -1,12 +1,12 @@
 import { Brackets } from "typeorm";
 import read from "@/services/note/read.js";
 import { Notes, Followings } from "@/models/index.js";
-import define from "../../define.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedNoteThreadQuery } from "../../common/generate-muted-note-thread-query.js";
+import define from "@/server/api/define.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedNoteThreadQuery } from "@/server/api/common/generate-muted-note-thread-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
index fcd24db992..ca0d0f03dd 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -1,6 +1,6 @@
 import { Brackets, In } from "typeorm";
 import { Polls, Mutings, Notes, PollVotes } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
index 40535d3401..1680eca640 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
@@ -13,9 +13,9 @@ import {
 } from "@/models/index.js";
 import type { IRemoteUser } from "@/models/entities/user.js";
 import { genId } from "@/misc/gen-id.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
-import define from "../../../define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions.ts b/packages/backend/src/server/api/endpoints/notes/reactions.ts
index 3c8af119ab..386a3a08df 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions.ts
@@ -1,10 +1,9 @@
 import type { FindOptionsWhere } from "typeorm";
-import { DeepPartial } from "typeorm";
 import { NoteReactions } from "@/models/index.js";
 import type { NoteReaction } from "@/models/entities/note-reaction.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getNote } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["notes", "reactions"],
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
index 2c8671070f..c49a957da1 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
@@ -1,7 +1,7 @@
 import createReaction from "@/services/note/reaction/create.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["reactions", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
index 59096c4c88..f135bd7ffa 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,7 +1,7 @@
 import deleteReaction from "@/services/note/reaction/delete.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 import { SECOND, HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts b/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts
index d3b5cbff50..53ac1288a8 100644
--- a/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/recommended-timeline.ts
@@ -2,16 +2,16 @@ import { Brackets } from "typeorm";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { Notes } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateRepliesQuery } from "../../common/generate-replies-query.js";
-import { generateMutedNoteQuery } from "../../common/generate-muted-note-query.js";
-import { generateChannelQuery } from "../../common/generate-channel-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedUserRenotesQueryForNotes } from "../../common/generated-muted-renote-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateRepliesQuery } from "@/server/api/common/generate-replies-query.js";
+import { generateMutedNoteQuery } from "@/server/api/common/generate-muted-note-query.js";
+import { generateChannelQuery } from "@/server/api/common/generate-channel-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedUserRenotesQueryForNotes } from "@/server/api/common/generated-muted-renote-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts
index df801c7fc4..683004ebe8 100644
--- a/packages/backend/src/server/api/endpoints/notes/renotes.ts
+++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts
@@ -1,11 +1,11 @@
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { getNote } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts
index 5ea4d479c5..e4341ebce0 100644
--- a/packages/backend/src/server/api/endpoints/notes/replies.ts
+++ b/packages/backend/src/server/api/endpoints/notes/replies.ts
@@ -1,9 +1,9 @@
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
index f988acaa51..e87725e342 100644
--- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
@@ -2,11 +2,11 @@ import { Brackets } from "typeorm";
 import { Notes } from "@/models/index.js";
 import { safeForSql } from "@/misc/safe-for-sql.js";
 import { normalizeForSearch } from "@/misc/normalize-for-search.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["notes", "hashtags"],
diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts
index 6247bd6526..4ddcf11abf 100644
--- a/packages/backend/src/server/api/endpoints/notes/search.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search.ts
@@ -5,11 +5,11 @@ import config from "@/config/index.js";
 import es from "@/db/elasticsearch.js";
 import sonic from "@/db/sonic.js";
 import meilisearch, { MeilisearchNote } from "@/db/meilisearch.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
@@ -90,6 +90,7 @@ export default define(meta, paramDef, async (ps, me) => {
 			.andWhere("note.text ILIKE :q", { q: `%${sqlLikeEscape(ps.query)}%` })
 			.andWhere("note.visibility = 'public'")
 			.innerJoinAndSelect("note.user", "user")
+			.andWhere("user.isIndexable = TRUE")
 			.leftJoinAndSelect("user.avatar", "avatar")
 			.leftJoinAndSelect("user.banner", "banner")
 			.leftJoinAndSelect("note.reply", "reply")
diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts
index 8c5f91c5c1..1319e47d93 100644
--- a/packages/backend/src/server/api/endpoints/notes/show.ts
+++ b/packages/backend/src/server/api/endpoints/notes/show.ts
@@ -1,7 +1,7 @@
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { getNote } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/state.ts b/packages/backend/src/server/api/endpoints/notes/state.ts
index 630b2a8007..b14e6842d1 100644
--- a/packages/backend/src/server/api/endpoints/notes/state.ts
+++ b/packages/backend/src/server/api/endpoints/notes/state.ts
@@ -1,11 +1,10 @@
 import {
 	NoteFavorites,
-	Notes,
 	NoteThreadMutings,
 	NoteWatchings,
 } from "@/models/index.js";
-import { getNote } from "../../common/getters.js";
-import define from "../../define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
index e4803cc291..7c40a45923 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
@@ -1,9 +1,9 @@
 import { Notes, NoteThreadMutings } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import readNote from "@/services/note/read.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
index c06fd59ba5..62766bedc6 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
@@ -1,7 +1,7 @@
 import { NoteThreadMutings } from "@/models/index.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 56243977f8..0f8da62e2d 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -1,16 +1,16 @@
 import { Brackets } from "typeorm";
 import { Notes, Followings } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateRepliesQuery } from "../../common/generate-replies-query.js";
-import { generateMutedNoteQuery } from "../../common/generate-muted-note-query.js";
-import { generateChannelQuery } from "../../common/generate-channel-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
-import { generateMutedUserRenotesQueryForNotes } from "../../common/generated-muted-renote-query.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateRepliesQuery } from "@/server/api/common/generate-replies-query.js";
+import { generateMutedNoteQuery } from "@/server/api/common/generate-muted-note-query.js";
+import { generateChannelQuery } from "@/server/api/common/generate-channel-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
+import { generateMutedUserRenotesQueryForNotes } from "@/server/api/common/generated-muted-renote-query.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/translate.ts b/packages/backend/src/server/api/endpoints/notes/translate.ts
index 1e90fb617e..d1de399936 100644
--- a/packages/backend/src/server/api/endpoints/notes/translate.ts
+++ b/packages/backend/src/server/api/endpoints/notes/translate.ts
@@ -4,9 +4,9 @@ import config from "@/config/index.js";
 import { Converter } from "opencc-js";
 import { getAgentByUrl } from "@/misc/fetch.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import { ApiError } from "../../error.js";
-import { getNote } from "../../common/getters.js";
-import define from "../../define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notes"],
@@ -64,6 +64,7 @@ export default define(meta, paramDef, async (ps, user) => {
 
 	let targetLang = ps.targetLang;
 	if (targetLang.includes("-")) targetLang = targetLang.split("-")[0];
+	if (targetLang.includes("_")) targetLang = targetLang.split("_")[0];
 
 	if (instance.libreTranslateApiUrl != null) {
 		const jsonBody = {
diff --git a/packages/backend/src/server/api/endpoints/notes/unrenote.ts b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
index a30a19f190..4a3966123e 100644
--- a/packages/backend/src/server/api/endpoints/notes/unrenote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
@@ -1,8 +1,8 @@
 import deleteNote from "@/services/note/delete.js";
 import { Notes, Users } from "@/models/index.js";
-import define from "../../define.js";
-import { getNote } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 import { SECOND, HOUR } from "@/const.js";
 
 export const meta = {
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 5c3fc55bef..3a87ed647c 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
@@ -1,10 +1,10 @@
 import { Brackets } from "typeorm";
 import { UserLists, UserListJoinings, Notes } from "@/models/index.js";
 import { activeUsersChart } from "@/services/chart/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
 
 export const meta = {
 	tags: ["notes", "lists"],
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/create.ts b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
index f8921099a1..ec13f5aa2a 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
@@ -1,7 +1,7 @@
 import watch from "@/services/note/watch.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
index b441ad74b9..18994fa80c 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
@@ -1,7 +1,7 @@
 import unwatch from "@/services/note/unwatch.js";
-import define from "../../../define.js";
-import { getNote } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { getNote } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/notifications/create.ts b/packages/backend/src/server/api/endpoints/notifications/create.ts
index bc5723369c..2077cceba4 100644
--- a/packages/backend/src/server/api/endpoints/notifications/create.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/create.ts
@@ -1,5 +1,5 @@
 import { createNotification } from "@/services/create-notification.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notifications"],
diff --git a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
index e0888ad752..568036380a 100644
--- a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
@@ -1,7 +1,7 @@
 import { publishMainStream } from "@/services/stream.js";
 import { pushNotification } from "@/services/push-notification.js";
 import { Notifications } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["notifications", "account"],
diff --git a/packages/backend/src/server/api/endpoints/notifications/read.ts b/packages/backend/src/server/api/endpoints/notifications/read.ts
index 9efb2fcc0b..358ca062fe 100644
--- a/packages/backend/src/server/api/endpoints/notifications/read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/read.ts
@@ -1,5 +1,5 @@
-import define from "../../define.js";
-import { readNotification } from "../../common/read-notification.js";
+import define from "@/server/api/define.js";
+import { readNotification } from "@/server/api/common/read-notification.js";
 
 export const meta = {
 	tags: ["notifications", "account"],
diff --git a/packages/backend/src/server/api/endpoints/page-push.ts b/packages/backend/src/server/api/endpoints/page-push.ts
index a0f1e912fc..1f87372d61 100644
--- a/packages/backend/src/server/api/endpoints/page-push.ts
+++ b/packages/backend/src/server/api/endpoints/page-push.ts
@@ -1,7 +1,7 @@
 import { publishMainStream } from "@/services/stream.js";
 import { Users, Pages } from "@/models/index.js";
-import define from "../define.js";
-import { ApiError } from "../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	requireCredential: true,
diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts
index 716d3265cc..ea0f8ba83e 100644
--- a/packages/backend/src/server/api/endpoints/pages/create.ts
+++ b/packages/backend/src/server/api/endpoints/pages/create.ts
@@ -1,8 +1,8 @@
 import { Pages, DriveFiles } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { Page } from "@/models/entities/page.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/pages/delete.ts b/packages/backend/src/server/api/endpoints/pages/delete.ts
index 98b035f7c7..85688d9b4f 100644
--- a/packages/backend/src/server/api/endpoints/pages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/pages/delete.ts
@@ -1,6 +1,6 @@
 import { Pages } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["pages"],
diff --git a/packages/backend/src/server/api/endpoints/pages/featured.ts b/packages/backend/src/server/api/endpoints/pages/featured.ts
index a763465897..c3ff1f57f8 100644
--- a/packages/backend/src/server/api/endpoints/pages/featured.ts
+++ b/packages/backend/src/server/api/endpoints/pages/featured.ts
@@ -1,5 +1,5 @@
 import { Pages } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["pages"],
diff --git a/packages/backend/src/server/api/endpoints/pages/like.ts b/packages/backend/src/server/api/endpoints/pages/like.ts
index 03482c9616..ab64b9b93e 100644
--- a/packages/backend/src/server/api/endpoints/pages/like.ts
+++ b/packages/backend/src/server/api/endpoints/pages/like.ts
@@ -1,7 +1,7 @@
 import { Pages, PageLikes } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["pages"],
diff --git a/packages/backend/src/server/api/endpoints/pages/show.ts b/packages/backend/src/server/api/endpoints/pages/show.ts
index a25eb30b6d..ac347cf139 100644
--- a/packages/backend/src/server/api/endpoints/pages/show.ts
+++ b/packages/backend/src/server/api/endpoints/pages/show.ts
@@ -1,8 +1,8 @@
 import { IsNull } from "typeorm";
 import { Pages, Users } from "@/models/index.js";
 import type { Page } from "@/models/entities/page.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["pages"],
diff --git a/packages/backend/src/server/api/endpoints/pages/unlike.ts b/packages/backend/src/server/api/endpoints/pages/unlike.ts
index e607d7a546..428f984582 100644
--- a/packages/backend/src/server/api/endpoints/pages/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/pages/unlike.ts
@@ -1,6 +1,6 @@
 import { Pages, PageLikes } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["pages"],
diff --git a/packages/backend/src/server/api/endpoints/pages/update.ts b/packages/backend/src/server/api/endpoints/pages/update.ts
index 65e1b3b2d2..5f434d02e1 100644
--- a/packages/backend/src/server/api/endpoints/pages/update.ts
+++ b/packages/backend/src/server/api/endpoints/pages/update.ts
@@ -1,7 +1,7 @@
 import { Not } from "typeorm";
 import { Pages, DriveFiles } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 import { HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/patrons.ts b/packages/backend/src/server/api/endpoints/patrons.ts
index d4793e1b94..12a41742b0 100644
--- a/packages/backend/src/server/api/endpoints/patrons.ts
+++ b/packages/backend/src/server/api/endpoints/patrons.ts
@@ -1,4 +1,4 @@
-import define from "../define.js";
+import define from "@/server/api/define.js";
 import { redisClient } from "@/db/redis.js";
 import * as fs from "node:fs";
 import { fileURLToPath } from "node:url";
diff --git a/packages/backend/src/server/api/endpoints/ping.ts b/packages/backend/src/server/api/endpoints/ping.ts
index c1f7e110bc..7b45edad13 100644
--- a/packages/backend/src/server/api/endpoints/ping.ts
+++ b/packages/backend/src/server/api/endpoints/ping.ts
@@ -1,4 +1,4 @@
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	requireCredential: false,
diff --git a/packages/backend/src/server/api/endpoints/pinned-users.ts b/packages/backend/src/server/api/endpoints/pinned-users.ts
index 22020068ce..b327378700 100644
--- a/packages/backend/src/server/api/endpoints/pinned-users.ts
+++ b/packages/backend/src/server/api/endpoints/pinned-users.ts
@@ -3,7 +3,7 @@ import { Users } from "@/models/index.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import * as Acct from "@/misc/acct.js";
 import type { User } from "@/models/entities/user.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/promo/read.ts b/packages/backend/src/server/api/endpoints/promo/read.ts
index 5310382a43..4b41467906 100644
--- a/packages/backend/src/server/api/endpoints/promo/read.ts
+++ b/packages/backend/src/server/api/endpoints/promo/read.ts
@@ -1,8 +1,8 @@
 import { PromoReads } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getNote } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getNote } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["notes"],
diff --git a/packages/backend/src/server/api/endpoints/recommended-instances.ts b/packages/backend/src/server/api/endpoints/recommended-instances.ts
index 8407afb1d3..b235678428 100644
--- a/packages/backend/src/server/api/endpoints/recommended-instances.ts
+++ b/packages/backend/src/server/api/endpoints/recommended-instances.ts
@@ -1,6 +1,6 @@
 // import { IsNull } from 'typeorm';
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/release.ts b/packages/backend/src/server/api/endpoints/release.ts
index bce1bc082c..1314e90365 100644
--- a/packages/backend/src/server/api/endpoints/release.ts
+++ b/packages/backend/src/server/api/endpoints/release.ts
@@ -1,4 +1,4 @@
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["meta"],
diff --git a/packages/backend/src/server/api/endpoints/renote-mute/create.ts b/packages/backend/src/server/api/endpoints/renote-mute/create.ts
index f09f197c01..afe23f38da 100644
--- a/packages/backend/src/server/api/endpoints/renote-mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/renote-mute/create.ts
@@ -1,9 +1,9 @@
 import { genId } from "@/misc/gen-id.js";
 import { RenoteMutings } from "@/models/index.js";
 import { RenoteMuting } from "@/models/entities/renote-muting.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/renote-mute/delete.ts b/packages/backend/src/server/api/endpoints/renote-mute/delete.ts
index 7a898141c3..6a824881b0 100644
--- a/packages/backend/src/server/api/endpoints/renote-mute/delete.ts
+++ b/packages/backend/src/server/api/endpoints/renote-mute/delete.ts
@@ -1,7 +1,7 @@
 import { RenoteMutings } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/renote-mute/list.ts b/packages/backend/src/server/api/endpoints/renote-mute/list.ts
index 9149dd9753..b19452714d 100644
--- a/packages/backend/src/server/api/endpoints/renote-mute/list.ts
+++ b/packages/backend/src/server/api/endpoints/renote-mute/list.ts
@@ -1,6 +1,6 @@
 import { RenoteMutings } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts
index bac564c1d6..3c78058af2 100644
--- a/packages/backend/src/server/api/endpoints/request-reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts
@@ -1,12 +1,10 @@
 import rndstr from "rndstr";
 import { IsNull } from "typeorm";
-import { publishMainStream } from "@/services/stream.js";
 import config from "@/config/index.js";
 import { Users, UserProfiles, PasswordResetRequests } from "@/models/index.js";
 import { sendEmail } from "@/services/send-email.js";
 import { genId } from "@/misc/gen-id.js";
-import { ApiError } from "../error.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 import { HOUR } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/reset-db.ts b/packages/backend/src/server/api/endpoints/reset-db.ts
index c64db7bca8..daba09b8e5 100644
--- a/packages/backend/src/server/api/endpoints/reset-db.ts
+++ b/packages/backend/src/server/api/endpoints/reset-db.ts
@@ -1,6 +1,5 @@
 import { resetDb } from "@/db/postgre.js";
-import define from "../define.js";
-import { ApiError } from "../error.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["non-productive"],
diff --git a/packages/backend/src/server/api/endpoints/reset-password.ts b/packages/backend/src/server/api/endpoints/reset-password.ts
index f695ae41f1..ff5c8d987f 100644
--- a/packages/backend/src/server/api/endpoints/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/reset-password.ts
@@ -1,7 +1,5 @@
-import { publishMainStream } from "@/services/stream.js";
-import { Users, UserProfiles, PasswordResetRequests } from "@/models/index.js";
-import define from "../define.js";
-import { ApiError } from "../error.js";
+import { UserProfiles, PasswordResetRequests } from "@/models/index.js";
+import define from "@/server/api/define.js";
 import { hashPassword } from "@/misc/password.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts
index 87132758fe..ff3bfcd100 100644
--- a/packages/backend/src/server/api/endpoints/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/server-info.ts
@@ -1,6 +1,6 @@
 import * as os from "node:os";
 import si from "systeminformation";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 import meilisearch from "@/db/meilisearch.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 
diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts
index 97889c42ed..e50305c692 100644
--- a/packages/backend/src/server/api/endpoints/stats.ts
+++ b/packages/backend/src/server/api/endpoints/stats.ts
@@ -1,7 +1,6 @@
 import { Instances, NoteReactions, Notes, Users } from "@/models/index.js";
-import define from "../define.js";
+import define from "@/server/api/define.js";
 import { driveChart, notesChart, usersChart } from "@/services/chart/index.js";
-import { IsNull } from "typeorm";
 
 export const meta = {
 	requireCredential: false,
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index 6268ae26d7..ee6b3bbf45 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -1,7 +1,7 @@
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { genId } from "@/misc/gen-id.js";
 import { SwSubscriptions } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/sw/show-registration.ts b/packages/backend/src/server/api/endpoints/sw/show-registration.ts
index 3ccb7de948..412179244d 100644
--- a/packages/backend/src/server/api/endpoints/sw/show-registration.ts
+++ b/packages/backend/src/server/api/endpoints/sw/show-registration.ts
@@ -1,5 +1,5 @@
 import { SwSubscriptions } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/sw/unregister.ts b/packages/backend/src/server/api/endpoints/sw/unregister.ts
index e2a40f51cb..d8a49cbeac 100644
--- a/packages/backend/src/server/api/endpoints/sw/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/sw/unregister.ts
@@ -1,5 +1,5 @@
 import { SwSubscriptions } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/sw/update-registration.ts b/packages/backend/src/server/api/endpoints/sw/update-registration.ts
index 5ba53ee8a7..ece1c8449e 100644
--- a/packages/backend/src/server/api/endpoints/sw/update-registration.ts
+++ b/packages/backend/src/server/api/endpoints/sw/update-registration.ts
@@ -1,5 +1,5 @@
 import { SwSubscriptions } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["account"],
diff --git a/packages/backend/src/server/api/endpoints/test.ts b/packages/backend/src/server/api/endpoints/test.ts
index 2c43c61152..f5041cfbff 100644
--- a/packages/backend/src/server/api/endpoints/test.ts
+++ b/packages/backend/src/server/api/endpoints/test.ts
@@ -1,4 +1,4 @@
-import define from "../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["non-productive"],
diff --git a/packages/backend/src/server/api/endpoints/username/available.ts b/packages/backend/src/server/api/endpoints/username/available.ts
index 6fa09ba369..cd634a798a 100644
--- a/packages/backend/src/server/api/endpoints/username/available.ts
+++ b/packages/backend/src/server/api/endpoints/username/available.ts
@@ -1,7 +1,7 @@
 import { IsNull } from "typeorm";
 import { Users, UsedUsernames } from "@/models/index.js";
 import config from "@/config/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users.ts b/packages/backend/src/server/api/endpoints/users.ts
index f0a8670902..20371fce9f 100644
--- a/packages/backend/src/server/api/endpoints/users.ts
+++ b/packages/backend/src/server/api/endpoints/users.ts
@@ -1,7 +1,7 @@
 import { Users } from "@/models/index.js";
-import define from "../define.js";
-import { generateMutedUserQueryForUsers } from "../common/generate-muted-user-query.js";
-import { generateBlockQueryForUsers } from "../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { generateMutedUserQueryForUsers } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockQueryForUsers } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts
index 0dc90b8f99..132e190bb6 100644
--- a/packages/backend/src/server/api/endpoints/users/clips.ts
+++ b/packages/backend/src/server/api/endpoints/users/clips.ts
@@ -1,6 +1,6 @@
 import { Clips } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["users", "clips"],
diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts
index 31719bad32..f57983d4b9 100644
--- a/packages/backend/src/server/api/endpoints/users/followers.ts
+++ b/packages/backend/src/server/api/endpoints/users/followers.ts
@@ -1,9 +1,9 @@
 import { IsNull } from "typeorm";
 import { Users, Followings, UserProfiles } from "@/models/index.js";
 import { toPunyNullable } from "@/misc/convert-host.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts
index 1c1da0e117..84eb7cccc5 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -1,9 +1,9 @@
 import { IsNull } from "typeorm";
 import { Users, Followings, UserProfiles } from "@/models/index.js";
 import { toPunyNullable } from "@/misc/convert-host.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
index 5d64fb4727..e2edbee86a 100644
--- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
@@ -1,6 +1,6 @@
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 import { GalleryPosts } from "@/models/index.js";
-import { makePaginationQuery } from "../../../common/make-pagination-query.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["users", "gallery"],
diff --git a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
index 9722804c8d..0694bd6632 100644
--- a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -1,9 +1,9 @@
 import { Not, In, IsNull } from "typeorm";
 import { maximum } from "@/prelude/array.js";
 import { Notes, Users } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/create.ts b/packages/backend/src/server/api/endpoints/users/groups/create.ts
index 76bd78c49f..1cfb223013 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -2,7 +2,7 @@ import { UserGroups, UserGroupJoinings } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import type { UserGroup } from "@/models/entities/user-group.js";
 import type { UserGroupJoining } from "@/models/entities/user-group-joining.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["groups"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/delete.ts b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
index 81c15ad38e..93bf594f51 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
@@ -1,6 +1,6 @@
 import { UserGroups } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["groups"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
index 5cb3a7bad3..a483ccd184 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,8 +1,8 @@
 import { UserGroupJoinings, UserGroupInvitations } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import type { UserGroupJoining } from "@/models/entities/user-group-joining.js";
-import { ApiError } from "../../../../error.js";
-import define from "../../../../define.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
index c04ebed23b..9d4e51cca9 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
@@ -1,6 +1,6 @@
 import { UserGroupInvitations } from "@/models/index.js";
-import define from "../../../../define.js";
-import { ApiError } from "../../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invite.ts b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
index 10cc215861..8a1e6b31ed 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -6,9 +6,9 @@ import {
 import { genId } from "@/misc/gen-id.js";
 import type { UserGroupInvitation } from "@/models/entities/user-group-invitation.js";
 import { createNotification } from "@/services/create-notification.js";
-import { getUser } from "../../../common/getters.js";
-import { ApiError } from "../../../error.js";
-import define from "../../../define.js";
+import { getUser } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/joined.ts b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
index 8422cf586d..5d50b5e33c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/joined.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
@@ -1,6 +1,6 @@
 import { Not, In } from "typeorm";
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["groups", "account"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/leave.ts b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
index fac0a47fc5..8165b1d988 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
@@ -1,6 +1,6 @@
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/owned.ts b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
index d86185ff02..293897c16d 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/owned.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
@@ -1,5 +1,5 @@
 import { UserGroups } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["groups", "account"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/pull.ts b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
index ce294b8c86..5e7f91d70a 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
@@ -1,7 +1,7 @@
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/show.ts b/packages/backend/src/server/api/endpoints/users/groups/show.ts
index 46f4410c84..0cd5a92331 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/show.ts
@@ -1,6 +1,6 @@
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["groups", "account"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
index 0322441574..b58ea57b7f 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,7 +1,7 @@
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["groups", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/groups/update.ts b/packages/backend/src/server/api/endpoints/users/groups/update.ts
index fa720c9c45..77e63c6dc9 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/update.ts
@@ -1,6 +1,6 @@
 import { UserGroups } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["groups"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/create.ts b/packages/backend/src/server/api/endpoints/users/lists/create.ts
index 6bbbf603e5..c23e8f6f53 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/create.ts
@@ -1,7 +1,7 @@
 import { UserLists } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import type { UserList } from "@/models/entities/user-list.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["lists"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/delete-all.ts b/packages/backend/src/server/api/endpoints/users/lists/delete-all.ts
index 49c4cf6f63..49ab4f1023 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/delete-all.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/delete-all.ts
@@ -1,6 +1,6 @@
 import { UserLists } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["lists"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/delete.ts b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
index 4566295676..e1df681354 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
@@ -1,6 +1,6 @@
 import { UserLists } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["lists"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/list.ts b/packages/backend/src/server/api/endpoints/users/lists/list.ts
index 5d590ee0ec..2a731b70d3 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/list.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/list.ts
@@ -1,5 +1,5 @@
 import { UserLists } from "@/models/index.js";
-import define from "../../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["lists", "account"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/pull.ts b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
index 07fae20675..ffca5b205a 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
@@ -1,8 +1,8 @@
 import { publishUserListStream } from "@/services/stream.js";
 import { UserLists, UserListJoinings, Users } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["lists", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/push.ts b/packages/backend/src/server/api/endpoints/users/lists/push.ts
index 899754aafb..8dd4442d00 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/push.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/push.ts
@@ -1,8 +1,8 @@
 import { pushUserToUserList } from "@/services/user-list/push.js";
 import { UserLists, UserListJoinings, Blockings } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
-import { getUser } from "../../../common/getters.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
 
 export const meta = {
 	tags: ["lists", "users"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/show.ts b/packages/backend/src/server/api/endpoints/users/lists/show.ts
index cb4893b0e4..ca90fec38c 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/show.ts
@@ -1,6 +1,6 @@
 import { UserLists } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["lists", "account"],
diff --git a/packages/backend/src/server/api/endpoints/users/lists/update.ts b/packages/backend/src/server/api/endpoints/users/lists/update.ts
index 0ac788fd37..e331ce33c3 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/update.ts
@@ -1,6 +1,6 @@
 import { UserLists } from "@/models/index.js";
-import define from "../../../define.js";
-import { ApiError } from "../../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["lists"],
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 724cfc9af1..1485dfa6c5 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -1,12 +1,12 @@
 import { Brackets } from "typeorm";
 import { Notes } from "@/models/index.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
-import { getUser } from "../../common/getters.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
-import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
+import { getUser } from "@/server/api/common/getters.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { generateMutedUserQuery } from "@/server/api/common/generate-muted-user-query.js";
+import { generateBlockedUserQuery } from "@/server/api/common/generate-block-query.js";
 
 export const meta = {
 	tags: ["users", "notes"],
diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts
index c08258b19d..1af50e78a9 100644
--- a/packages/backend/src/server/api/endpoints/users/pages.ts
+++ b/packages/backend/src/server/api/endpoints/users/pages.ts
@@ -1,6 +1,6 @@
 import { Pages } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
 
 export const meta = {
 	tags: ["users", "pages"],
diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts
index 6b6d32e8ad..483a78865f 100644
--- a/packages/backend/src/server/api/endpoints/users/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/users/reactions.ts
@@ -1,8 +1,8 @@
 import { NoteReactions, UserProfiles } from "@/models/index.js";
-import define from "../../define.js";
-import { makePaginationQuery } from "../../common/make-pagination-query.js";
-import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { makePaginationQuery } from "@/server/api/common/make-pagination-query.js";
+import { generateVisibilityQuery } from "@/server/api/common/generate-visibility-query.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["users", "reactions"],
@@ -49,7 +49,7 @@ export const paramDef = {
 export default define(meta, paramDef, async (ps, me) => {
 	const profile = await UserProfiles.findOneByOrFail({ userId: ps.userId });
 
-	if (me.id !== ps.userId && !profile.publicReactions) {
+	if (!profile.publicReactions && (me == null || me.id !== ps.userId)) {
 		throw new ApiError(meta.errors.reactionsNotPublic);
 	}
 
diff --git a/packages/backend/src/server/api/endpoints/users/recommendation.ts b/packages/backend/src/server/api/endpoints/users/recommendation.ts
index 615cca7856..4ea0d618ed 100644
--- a/packages/backend/src/server/api/endpoints/users/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/users/recommendation.ts
@@ -1,10 +1,10 @@
 import { Users, Followings } from "@/models/index.js";
-import define from "../../define.js";
-import { generateMutedUserQueryForUsers } from "../../common/generate-muted-user-query.js";
+import define from "@/server/api/define.js";
+import { generateMutedUserQueryForUsers } from "@/server/api/common/generate-muted-user-query.js";
 import {
 	generateBlockedUserQuery,
 	generateBlockQueryForUsers,
-} from "../../common/generate-block-query.js";
+} from "@/server/api/common/generate-block-query.js";
 import { DAY } from "@/const.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts
index 5580eaea0b..61cc761162 100644
--- a/packages/backend/src/server/api/endpoints/users/relation.ts
+++ b/packages/backend/src/server/api/endpoints/users/relation.ts
@@ -1,5 +1,5 @@
 import { Users } from "@/models/index.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
index 1368f9e2b9..7e9ba7238c 100644
--- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts
+++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
@@ -5,9 +5,9 @@ import { AbuseUserReports, UserProfiles, Users } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { sendEmail } from "@/services/send-email.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import { getUser } from "../../common/getters.js";
-import { ApiError } from "../../error.js";
-import define from "../../define.js";
+import { getUser } from "@/server/api/common/getters.js";
+import { ApiError } from "@/server/api/error.js";
+import define from "@/server/api/define.js";
 import { toHtml } from "@/mfm/to-html.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
index f34083233f..517ef615b1 100644
--- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
+++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
@@ -1,8 +1,7 @@
 import { Brackets } from "typeorm";
 import { Followings, Users } from "@/models/index.js";
-import { USER_ACTIVE_THRESHOLD } from "@/const.js";
 import type { User } from "@/models/entities/user.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts
index 2d84d5bfeb..3aef6dc901 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -1,7 +1,7 @@
 import { Brackets } from "typeorm";
 import { UserProfiles, Users } from "@/models/index.js";
 import type { User } from "@/models/entities/user.js";
-import define from "../../define.js";
+import define from "@/server/api/define.js";
 import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
 
 export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts
index bead8df0a4..61812a0189 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -3,9 +3,9 @@ import { In, IsNull } from "typeorm";
 import { resolveUser } from "@/remote/resolve-user.js";
 import { Users } from "@/models/index.js";
 import type { User } from "@/models/entities/user.js";
-import define from "../../define.js";
-import { apiLogger } from "../../logger.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { apiLogger } from "@/server/api/logger.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/endpoints/users/stats.ts b/packages/backend/src/server/api/endpoints/users/stats.ts
index 83e821f498..ed4dd3b0c1 100644
--- a/packages/backend/src/server/api/endpoints/users/stats.ts
+++ b/packages/backend/src/server/api/endpoints/users/stats.ts
@@ -9,8 +9,8 @@ import {
 	Users,
 } from "@/models/index.js";
 import { awaitAll } from "@/prelude/await-all.js";
-import define from "../../define.js";
-import { ApiError } from "../../error.js";
+import define from "@/server/api/define.js";
+import { ApiError } from "@/server/api/error.js";
 
 export const meta = {
 	tags: ["users"],
diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts
index bf617f06fc..a5970d5843 100644
--- a/packages/backend/src/server/api/index.ts
+++ b/packages/backend/src/server/api/index.ts
@@ -11,9 +11,8 @@ import {
 	apiMastodonCompatible,
 	getClient,
 } from "./mastodon/ApiMastodonCompatibleService.js";
-import { Instances, AccessTokens, Users } from "@/models/index.js";
+import { AccessTokens, Users } from "@/models/index.js";
 import config from "@/config/index.js";
-import fs from "fs";
 import endpoints from "./endpoints.js";
 import compatibility from "./compatibility.js";
 import handler from "./api-handler.js";
@@ -22,11 +21,13 @@ import signin from "./private/signin.js";
 import signupPending from "./private/signup-pending.js";
 import verifyEmail from "./private/verify-email.js";
 import { koaBody } from "koa-body";
+import { convertAttachment } from "./mastodon/converters.js";
+
+// TODO?: should we avoid importing things from built directory?
 import {
 	convertId,
 	IdConvertType as IdType,
-} from "../../../native-utils/built/index.js";
-import { convertAttachment } from "./mastodon/converters.js";
+} from "native-utils/built/index.js";
 
 // re-export native rust id conversion (function and enum)
 export { IdType, convertId };
diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts
index 367fb3d279..f03f8754cf 100644
--- a/packages/backend/src/server/api/limiter.ts
+++ b/packages/backend/src/server/api/limiter.ts
@@ -1,7 +1,6 @@
 import Limiter from "ratelimiter";
-import { CacheableLocalUser, User } from "@/models/entities/user.js";
 import Logger from "@/services/logger.js";
-import { redisClient } from "../../db/redis.js";
+import { redisClient } from "@/db/redis.js";
 import type { IEndpointMeta } from "./endpoints.js";
 import { convertMilliseconds } from "@/misc/convert-milliseconds.js";
 
diff --git a/packages/backend/src/server/api/mastodon/ApiMastodonCompatibleService.ts b/packages/backend/src/server/api/mastodon/ApiMastodonCompatibleService.ts
index 3f6e671bd6..e029bc604e 100644
--- a/packages/backend/src/server/api/mastodon/ApiMastodonCompatibleService.ts
+++ b/packages/backend/src/server/api/mastodon/ApiMastodonCompatibleService.ts
@@ -13,7 +13,7 @@ import {
 	convertAnnouncement,
 	convertFilter,
 } from "./converters.js";
-import { convertId, IdType } from "../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 import { Users } from "@/models/index.js";
 import { IsNull } from "typeorm";
 
@@ -24,11 +24,7 @@ export function getClient(
 	const accessTokenArr = authorization?.split(" ") ?? [null];
 	const accessToken = accessTokenArr[accessTokenArr.length - 1];
 	const generator = (megalodon as any).default;
-	const client = generator(
-		"firefish",
-		BASE_URL,
-		accessToken,
-	) as MegalodonInterface;
+	const client = generator(BASE_URL, accessToken) as MegalodonInterface;
 	return client;
 }
 
diff --git a/packages/backend/src/server/api/mastodon/converters.ts b/packages/backend/src/server/api/mastodon/converters.ts
index 6469d9c97b..30506d9c51 100644
--- a/packages/backend/src/server/api/mastodon/converters.ts
+++ b/packages/backend/src/server/api/mastodon/converters.ts
@@ -1,5 +1,5 @@
 import { Entity } from "megalodon";
-import { convertId, IdType } from "../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 
 function simpleConvert(data: any) {
 	// copy the object to bypass weird pass by reference bugs
diff --git a/packages/backend/src/server/api/mastodon/endpoints/account.ts b/packages/backend/src/server/api/mastodon/endpoints/account.ts
index 36548cd3b2..76c3af378d 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/account.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/account.ts
@@ -1,10 +1,7 @@
-import { Users } from "@/models/index.js";
-import { resolveUser } from "@/remote/resolve-user.js";
 import Router from "@koa/router";
-import { FindOptionsWhere, IsNull } from "typeorm";
 import { getClient } from "../ApiMastodonCompatibleService.js";
 import { argsToBools, convertTimelinesArgsId, limitToInt } from "./timeline.js";
-import { convertId, IdType } from "../../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 import {
 	convertAccount,
 	convertFeaturedTag,
diff --git a/packages/backend/src/server/api/mastodon/endpoints/auth.ts b/packages/backend/src/server/api/mastodon/endpoints/auth.ts
index 3d6eb8c4d6..3c7ece920a 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/auth.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/auth.ts
@@ -1,8 +1,5 @@
-import megalodon, { MegalodonInterface } from "megalodon";
 import Router from "@koa/router";
-import { koaBody } from "koa-body";
 import { getClient } from "../ApiMastodonCompatibleService.js";
-import bodyParser from "koa-bodyparser";
 
 const readScope = [
 	"read:account",
@@ -68,7 +65,7 @@ export function apiAuthMastodon(router: Router): void {
 				website: body.website,
 				redirect_uri: red,
 				client_id: Buffer.from(appData.url || "").toString("base64"),
-				client_secret: appData.client_secret,
+				client_secret: appData.clientSecret,
 			};
 			console.log(returns);
 			ctx.body = returns;
diff --git a/packages/backend/src/server/api/mastodon/endpoints/filter.ts b/packages/backend/src/server/api/mastodon/endpoints/filter.ts
index e27b7e22ae..6524fd2f6e 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/filter.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/filter.ts
@@ -1,7 +1,6 @@
-import megalodon, { MegalodonInterface } from "megalodon";
 import Router from "@koa/router";
 import { getClient } from "../ApiMastodonCompatibleService.js";
-import { IdType, convertId } from "../../index.js";
+import { IdType, convertId } from "@/server/api/index.js";
 import { convertFilter } from "../converters.js";
 
 export function apiFilterMastodon(router: Router): void {
diff --git a/packages/backend/src/server/api/mastodon/endpoints/notifications.ts b/packages/backend/src/server/api/mastodon/endpoints/notifications.ts
index f0a0bab984..9628eccdde 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/notifications.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/notifications.ts
@@ -1,7 +1,5 @@
-import megalodon, { MegalodonInterface } from "megalodon";
 import Router from "@koa/router";
-import { koaBody } from "koa-body";
-import { convertId, IdType } from "../../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 import { getClient } from "../ApiMastodonCompatibleService.js";
 import { convertTimelinesArgsId } from "./timeline.js";
 import { convertNotification } from "../converters.js";
diff --git a/packages/backend/src/server/api/mastodon/endpoints/search.ts b/packages/backend/src/server/api/mastodon/endpoints/search.ts
index 5bd24ca89b..c9bbab0a4f 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/search.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/search.ts
@@ -1,7 +1,7 @@
 import Router from "@koa/router";
 import { getClient } from "../ApiMastodonCompatibleService.js";
 import axios from "axios";
-import Converter from "megalodon";
+import { Converter } from "megalodon";
 import { convertTimelinesArgsId, limitToInt } from "./timeline.js";
 import { convertAccount, convertStatus } from "../converters.js";
 
diff --git a/packages/backend/src/server/api/mastodon/endpoints/status.ts b/packages/backend/src/server/api/mastodon/endpoints/status.ts
index 2c35843dd3..ac1cbe602d 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/status.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/status.ts
@@ -1,11 +1,10 @@
 import Router from "@koa/router";
 import { getClient } from "../ApiMastodonCompatibleService.js";
 import { emojiRegexAtStartToEnd } from "@/misc/emoji-regex.js";
-import axios from "axios";
 import querystring from "node:querystring";
 import qs from "qs";
 import { convertTimelinesArgsId, limitToInt } from "./timeline.js";
-import { convertId, IdType } from "../../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 import {
 	convertAccount,
 	convertAttachment,
@@ -380,7 +379,7 @@ export function apiStatusMastodon(router: Router): void {
 			const accessTokens = ctx.headers.authorization;
 			const client = getClient(BASE_URL, accessTokens);
 			try {
-				const data = await client.createEmojiReaction(
+				const data = await client.reactStatus(
 					convertId(ctx.params.id, IdType.FirefishId),
 					ctx.params.name,
 				);
@@ -400,7 +399,7 @@ export function apiStatusMastodon(router: Router): void {
 			const accessTokens = ctx.headers.authorization;
 			const client = getClient(BASE_URL, accessTokens);
 			try {
-				const data = await client.deleteEmojiReaction(
+				const data = await client.unreactStatus(
 					convertId(ctx.params.id, IdType.FirefishId),
 					ctx.params.name,
 				);
diff --git a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts
index 0a4da322d7..05741c4cef 100644
--- a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts
+++ b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts
@@ -7,7 +7,7 @@ import {
 	convertList,
 	convertStatus,
 } from "../converters.js";
-import { convertId, IdType } from "../../index.js";
+import { convertId, IdType } from "@/server/api/index.js";
 
 export function limitToInt(q: ParsedUrlQuery) {
 	let object: any = q;
diff --git a/packages/backend/src/server/api/openapi/gen-spec.ts b/packages/backend/src/server/api/openapi/gen-spec.ts
index ee14f249f0..ec8c1ca036 100644
--- a/packages/backend/src/server/api/openapi/gen-spec.ts
+++ b/packages/backend/src/server/api/openapi/gen-spec.ts
@@ -1,4 +1,4 @@
-import endpoints from "../endpoints.js";
+import endpoints from "@/server/api/endpoints.js";
 import config from "@/config/index.js";
 import { errors as basicErrors } from "./errors.js";
 import { schemas, convertSchemaToOpenApiSchema } from "./schemas.js";
diff --git a/packages/backend/src/server/api/private/signin.ts b/packages/backend/src/server/api/private/signin.ts
index 06d801a953..3e70d80fe2 100644
--- a/packages/backend/src/server/api/private/signin.ts
+++ b/packages/backend/src/server/api/private/signin.ts
@@ -1,6 +1,6 @@
 import type Koa from "koa";
 import * as OTPAuth from "otpauth";
-import signin from "../common/signin.js";
+import signin from "@/server/api/common/signin.js";
 import config from "@/config/index.js";
 import {
 	Users,
@@ -16,10 +16,10 @@ import {
 	hashPassword,
 	isOldAlgorithm,
 } from "@/misc/password.js";
-import { verifyLogin, hash } from "../2fa.js";
+import { verifyLogin, hash } from "@/server/api/2fa.js";
 import { randomBytes } from "node:crypto";
 import { IsNull } from "typeorm";
-import { limiter } from "../limiter.js";
+import { limiter } from "@/server/api/limiter.js";
 import { getIpHash } from "@/misc/get-ip-hash.js";
 
 export default async (ctx: Koa.Context) => {
diff --git a/packages/backend/src/server/api/private/signup-pending.ts b/packages/backend/src/server/api/private/signup-pending.ts
index c7fdcea221..b92fb90b37 100644
--- a/packages/backend/src/server/api/private/signup-pending.ts
+++ b/packages/backend/src/server/api/private/signup-pending.ts
@@ -1,7 +1,7 @@
 import type Koa from "koa";
-import { Users, UserPendings, UserProfiles } from "@/models/index.js";
-import { signup } from "../common/signup.js";
-import signin from "../common/signin.js";
+import { UserPendings, UserProfiles } from "@/models/index.js";
+import { signup } from "@/server/api/common/signup.js";
+import signin from "@/server/api/common/signin.js";
 
 export default async (ctx: Koa.Context) => {
 	const body = ctx.request.body;
diff --git a/packages/backend/src/server/api/private/signup.ts b/packages/backend/src/server/api/private/signup.ts
index 440d0e3686..d60e5a1910 100644
--- a/packages/backend/src/server/api/private/signup.ts
+++ b/packages/backend/src/server/api/private/signup.ts
@@ -3,7 +3,7 @@ import rndstr from "rndstr";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { verifyHcaptcha, verifyRecaptcha } from "@/misc/captcha.js";
 import { Users, RegistrationTickets, UserPendings } from "@/models/index.js";
-import { signup } from "../common/signup.js";
+import { signup } from "@/server/api/common/signup.js";
 import config from "@/config/index.js";
 import { sendEmail } from "@/services/send-email.js";
 import { genId } from "@/misc/gen-id.js";
diff --git a/packages/backend/src/server/api/stream/channels/messaging.ts b/packages/backend/src/server/api/stream/channels/messaging.ts
index 0622bd4649..a650db8b9b 100644
--- a/packages/backend/src/server/api/stream/channels/messaging.ts
+++ b/packages/backend/src/server/api/stream/channels/messaging.ts
@@ -2,7 +2,7 @@ import {
 	readUserMessagingMessage,
 	readGroupMessagingMessage,
 	deliverReadActivity,
-} from "../../common/read-messaging-message.js";
+} from "@/server/api/common/read-messaging-message.js";
 import Channel from "../channel.js";
 import { UserGroupJoinings, Users, MessagingMessages } from "@/models/index.js";
 import type { User, ILocalUser, IRemoteUser } from "@/models/entities/user.js";
diff --git a/packages/backend/src/server/api/stream/index.ts b/packages/backend/src/server/api/stream/index.ts
index 5a47f2cba7..86408a03d0 100644
--- a/packages/backend/src/server/api/stream/index.ts
+++ b/packages/backend/src/server/api/stream/index.ts
@@ -21,12 +21,12 @@ import {
 } from "@/services/stream.js";
 import type { UserGroup } from "@/models/entities/user-group.js";
 import type { Packed } from "@/misc/schema.js";
-import { readNotification } from "../common/read-notification.js";
+import { readNotification } from "@/server/api/common/read-notification.js";
 import channels from "./channels/index.js";
 import type Channel from "./channel.js";
 import type { StreamEventEmitter, StreamMessages } from "./types.js";
-import Converter from "megalodon";
-import { getClient } from "../mastodon/ApiMastodonCompatibleService.js";
+import { Converter } from "megalodon";
+import { getClient } from "@/server/api/mastodon/ApiMastodonCompatibleService.js";
 
 /**
  * Main stream connection
diff --git a/packages/backend/src/server/file/byte-range-readable.ts b/packages/backend/src/server/file/byte-range-readable.ts
index d80e783cca..96dcbc4a52 100644
--- a/packages/backend/src/server/file/byte-range-readable.ts
+++ b/packages/backend/src/server/file/byte-range-readable.ts
@@ -1,5 +1,5 @@
 import { Readable, ReadableOptions } from "node:stream";
-import { Buffer, constants as BufferConstants } from "node:buffer";
+import { Buffer } from "node:buffer";
 import * as fs from "node:fs";
 
 interface ByteRange {
diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts
index 1c4d4136b5..cb29934911 100644
--- a/packages/backend/src/server/file/send-drive-file.ts
+++ b/packages/backend/src/server/file/send-drive-file.ts
@@ -25,7 +25,8 @@ const assets = `${_dirname}/../../server/file/assets/`;
 const MAX_BYTE_RANGES = 10;
 
 const commonReadableHandlerGenerator =
-	(ctx: Koa.Context) => (e: Error): void => {
+	(ctx: Koa.Context) =>
+	(e: Error): void => {
 		serverLogger.error(e);
 		ctx.status = 500;
 		ctx.set("Cache-Control", "max-age=300");
diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts
index b967754d46..3a9f62f337 100644
--- a/packages/backend/src/server/index.ts
+++ b/packages/backend/src/server/index.ts
@@ -15,11 +15,10 @@ import * as slow from "koa-slow";
 import { IsNull } from "typeorm";
 import config from "@/config/index.js";
 import Logger from "@/services/logger.js";
-import { UserProfiles, Users } from "@/models/index.js";
+import { Users } from "@/models/index.js";
 import { fetchMeta } from "@/misc/fetch-meta.js";
 import { genIdenticon } from "@/misc/gen-identicon.js";
 import { createTemp } from "@/misc/create-temp.js";
-import { publishMainStream } from "@/services/stream.js";
 import * as Acct from "@/misc/acct.js";
 import { envOption } from "@/env.js";
 import megalodon, { MegalodonInterface } from "megalodon";
@@ -163,10 +162,10 @@ mastoRouter.post("/oauth/token", async (ctx) => {
 		ctx.body = ret;
 		return;
 	}
-	let client_id: Array<string> | string | null = body.client_id;
+	let client_id: any = body.client_id;
 	const BASE_URL = `${ctx.request.protocol}://${ctx.request.hostname}`;
 	const generator = (megalodon as any).default;
-	const client = generator("firefish", BASE_URL, null) as MegalodonInterface;
+	const client = generator(BASE_URL, null) as MegalodonInterface;
 	let token = null;
 	if (body.code) {
 		//m = body.code.match(/^([a-zA-Z0-9]{8})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{12})/);
@@ -190,7 +189,7 @@ mastoRouter.post("/oauth/token", async (ctx) => {
 			token ? token : "",
 		);
 		const ret = {
-			access_token: atData.access_token,
+			access_token: atData.accessToken,
 			token_type: "Bearer",
 			scope: body.scope || "read write follow push",
 			created_at: Math.floor(new Date().getTime() / 1000),
diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts
index 2d01446522..a1d519f3e2 100644
--- a/packages/backend/src/server/nodeinfo.ts
+++ b/packages/backend/src/server/nodeinfo.ts
@@ -89,9 +89,6 @@ const nodeinfo2 = async () => {
 			enableRecaptcha: meta.enableRecaptcha,
 			maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
 			maxCaptionTextLength: MAX_CAPTION_TEXT_LENGTH,
-			enableTwitterIntegration: meta.enableTwitterIntegration,
-			enableGithubIntegration: meta.enableGithubIntegration,
-			enableDiscordIntegration: meta.enableDiscordIntegration,
 			enableEmail: meta.enableEmail,
 			enableServiceWorker: meta.enableServiceWorker,
 			proxyAccountName: proxyAccount ? proxyAccount.username : null,
diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts
index 52078515ab..3981d57667 100644
--- a/packages/backend/src/server/web/index.ts
+++ b/packages/backend/src/server/web/index.ts
@@ -9,7 +9,7 @@ import Koa from "koa";
 import Router from "@koa/router";
 import send from "koa-send";
 import favicon from "koa-favicon";
-import views from "koa-views";
+import views from "@ladjs/koa-views";
 import sharp from "sharp";
 import { createBullBoard } from "@bull-board/api";
 import { BullAdapter } from "@bull-board/api/bullAdapter.js";
diff --git a/packages/backend/src/server/web/manifest.ts b/packages/backend/src/server/web/manifest.ts
index 2090a7f553..bbcf639ffe 100644
--- a/packages/backend/src/server/web/manifest.ts
+++ b/packages/backend/src/server/web/manifest.ts
@@ -11,6 +11,7 @@ export const manifestHandler = async (ctx: Koa.Context) => {
 	const instance = await fetchMeta(true);
 
 	res.short_name = instance.name || "Firefish";
+	res.name = instance.name || "Firefish";
 	if (instance.themeColor) res.theme_color = instance.themeColor;
 	for (const icon of res.icons) {
 		icon.src = `${icon.src}?v=${config.version.replace(/[^0-9]/g, "")}`;
diff --git a/packages/backend/src/server/web/views/flush.pug b/packages/backend/src/server/web/views/flush.pug
index e9866587e5..bb032ffa26 100644
--- a/packages/backend/src/server/web/views/flush.pug
+++ b/packages/backend/src/server/web/views/flush.pug
@@ -37,7 +37,8 @@ html
 					localStorage.clear();
 					message('localStorage cleared.');
 
-					const idbPromises = ['MisskeyClient', 'keyval-store'].map((name, i, arr) => new Promise((res, rej) => {
+					//- Removed 'MisskeyClient' due to seemingly being never referenced
+					const idbPromises = ['keyval-store'].map((name, i, arr) => new Promise((res, rej) => {
 						const delidb = indexedDB.deleteDatabase(name);
 						delidb.onsuccess = () => res(message(`indexedDB "${name}" cleared. (${i + 1}/${arr.length})`));
 						delidb.onerror = e => rej(e)
diff --git a/packages/backend/src/services/blocking/create.ts b/packages/backend/src/services/blocking/create.ts
index 60bd6e9431..321f5c8ea5 100644
--- a/packages/backend/src/services/blocking/create.ts
+++ b/packages/backend/src/services/blocking/create.ts
@@ -17,7 +17,6 @@ import {
 } from "@/models/index.js";
 import { perUserFollowingChart } from "@/services/chart/index.js";
 import { genId } from "@/misc/gen-id.js";
-import { IdentifiableError } from "@/misc/identifiable-error.js";
 import { getActiveWebhooks } from "@/misc/webhook-cache.js";
 import { webhookDeliver } from "@/queue/index.js";
 
diff --git a/packages/backend/src/services/blocking/delete.ts b/packages/backend/src/services/blocking/delete.ts
index 67f1e76f0e..271883fe89 100644
--- a/packages/backend/src/services/blocking/delete.ts
+++ b/packages/backend/src/services/blocking/delete.ts
@@ -2,9 +2,8 @@ import { renderActivity } from "@/remote/activitypub/renderer/index.js";
 import { renderBlock } from "@/remote/activitypub/renderer/block.js";
 import renderUndo from "@/remote/activitypub/renderer/undo.js";
 import { deliver } from "@/queue/index.js";
-import Logger from "../logger.js";
+import Logger from "@/services/logger.js";
 import type { CacheableUser } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 import { Blockings, Users } from "@/models/index.js";
 
 const logger = new Logger("blocking/delete");
diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts
index 322bfd25bc..b88fc22828 100644
--- a/packages/backend/src/services/chart/charts/active-users.ts
+++ b/packages/backend/src/services/chart/charts/active-users.ts
@@ -1,7 +1,6 @@
 import type { KVs } from "../core.js";
 import Chart from "../core.js";
 import type { User } from "@/models/entities/user.js";
-import { Users } from "@/models/index.js";
 import { name, schema } from "./entities/active-users.js";
 
 const week = 1000 * 60 * 60 * 24 * 7;
diff --git a/packages/backend/src/services/chart/charts/drive.ts b/packages/backend/src/services/chart/charts/drive.ts
index 9793ff79dc..d94c8cce71 100644
--- a/packages/backend/src/services/chart/charts/drive.ts
+++ b/packages/backend/src/services/chart/charts/drive.ts
@@ -1,7 +1,5 @@
 import type { KVs } from "../core.js";
 import Chart from "../core.js";
-import { DriveFiles } from "@/models/index.js";
-import { Not, IsNull } from "typeorm";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { name, schema } from "./entities/drive.js";
 
diff --git a/packages/backend/src/services/create-system-user.ts b/packages/backend/src/services/create-system-user.ts
index 24536090a9..0ebd1142f1 100644
--- a/packages/backend/src/services/create-system-user.ts
+++ b/packages/backend/src/services/create-system-user.ts
@@ -1,5 +1,5 @@
 import { v4 as uuid } from "uuid";
-import generateNativeUserToken from "../server/api/common/generate-native-user-token.js";
+import generateNativeUserToken from "@/server/api/common/generate-native-user-token.js";
 import { genRsaKeyPair } from "@/misc/gen-key-pair.js";
 import { User } from "@/models/entities/user.js";
 import { UserProfile } from "@/models/entities/user-profile.js";
diff --git a/packages/backend/src/services/delete-account.ts b/packages/backend/src/services/delete-account.ts
index 927776199a..b307611cf5 100644
--- a/packages/backend/src/services/delete-account.ts
+++ b/packages/backend/src/services/delete-account.ts
@@ -1,7 +1,7 @@
 import { Users } from "@/models/index.js";
 import { createDeleteAccountJob } from "@/queue/index.js";
-import { publishUserEvent } from "./stream.js";
-import { doPostSuspend } from "./suspend-user.js";
+import { publishUserEvent } from "@/services/stream.js";
+import { doPostSuspend } from "@/services/suspend-user.js";
 
 export async function deleteAccount(user: {
 	id: string;
diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts
index 6730ddff27..2f3d3c6e1e 100644
--- a/packages/backend/src/services/drive/add-file.ts
+++ b/packages/backend/src/services/drive/add-file.ts
@@ -2,7 +2,7 @@ import * as fs from "node:fs";
 
 import { v4 as uuid } from "uuid";
 
-import type S3 from "aws-sdk/clients/s3.js";
+import type S3 from "aws-sdk/clients/s3.js"; // TODO: migrate to SDK v3
 import sharp from "sharp";
 import { IsNull } from "typeorm";
 import { publishMainStream, publishDriveStream } from "@/services/stream.js";
@@ -13,7 +13,6 @@ import {
 	DriveFiles,
 	DriveFolders,
 	Users,
-	Instances,
 	UserProfiles,
 } from "@/models/index.js";
 import { DriveFile } from "@/models/entities/drive-file.js";
diff --git a/packages/backend/src/services/drive/delete-file.ts b/packages/backend/src/services/drive/delete-file.ts
index 215270df69..515c1d1c65 100644
--- a/packages/backend/src/services/drive/delete-file.ts
+++ b/packages/backend/src/services/drive/delete-file.ts
@@ -1,6 +1,6 @@
 import type { DriveFile } from "@/models/entities/drive-file.js";
 import { InternalStorage } from "./internal-storage.js";
-import { DriveFiles, Instances } from "@/models/index.js";
+import { DriveFiles } from "@/models/index.js";
 import {
 	driveChart,
 	perUserDriveChart,
diff --git a/packages/backend/src/services/drive/generate-video-thumbnail.ts b/packages/backend/src/services/drive/generate-video-thumbnail.ts
index 356623e79a..0e3f0db58e 100644
--- a/packages/backend/src/services/drive/generate-video-thumbnail.ts
+++ b/packages/backend/src/services/drive/generate-video-thumbnail.ts
@@ -1,4 +1,3 @@
-import * as fs from "node:fs";
 import { createTempDir } from "@/misc/create-temp.js";
 import type { IImage } from "./image-processor.js";
 import { convertToWebp } from "./image-processor.js";
diff --git a/packages/backend/src/services/drive/logger.ts b/packages/backend/src/services/drive/logger.ts
index ebde2d7058..06382ddd78 100644
--- a/packages/backend/src/services/drive/logger.ts
+++ b/packages/backend/src/services/drive/logger.ts
@@ -1,3 +1,3 @@
-import Logger from "../logger.js";
+import Logger from "@/services/logger.js";
 
 export const driveLogger = new Logger("drive", "blue");
diff --git a/packages/backend/src/services/drive/s3.ts b/packages/backend/src/services/drive/s3.ts
index 9357be21ca..d01f89cbbf 100644
--- a/packages/backend/src/services/drive/s3.ts
+++ b/packages/backend/src/services/drive/s3.ts
@@ -1,5 +1,5 @@
 import { URL } from "node:url";
-import S3 from "aws-sdk/clients/s3.js";
+import S3 from "aws-sdk/clients/s3.js"; // TODO: migrate to SDK v3
 import type { Meta } from "@/models/entities/meta.js";
 import { getAgentByUrl } from "@/misc/fetch.js";
 
diff --git a/packages/backend/src/services/fetch-instance-metadata.ts b/packages/backend/src/services/fetch-instance-metadata.ts
index 01ad917648..a4cc33bca5 100644
--- a/packages/backend/src/services/fetch-instance-metadata.ts
+++ b/packages/backend/src/services/fetch-instance-metadata.ts
@@ -6,7 +6,7 @@ import { getJson, getAgentByUrl } from "@/misc/fetch.js";
 import type { Instance } from "@/models/entities/instance.js";
 import { Instances } from "@/models/index.js";
 import { getFetchInstanceMetadataLock } from "@/misc/app-lock.js";
-import Logger from "./logger.js";
+import Logger from "@/services/logger.js";
 
 const logger = new Logger("metadata", "cyan");
 
diff --git a/packages/backend/src/services/fetch-rel-me.ts b/packages/backend/src/services/fetch-rel-me.ts
index 31e7a95a58..c9a37d1c88 100644
--- a/packages/backend/src/services/fetch-rel-me.ts
+++ b/packages/backend/src/services/fetch-rel-me.ts
@@ -1,4 +1,3 @@
-import { getHtml } from "@/misc/fetch.js";
 import { Window } from "happy-dom";
 import config from "@/config/index.js";
 
diff --git a/packages/backend/src/services/following/create.ts b/packages/backend/src/services/following/create.ts
index 3a77676b38..934b235bbc 100644
--- a/packages/backend/src/services/following/create.ts
+++ b/packages/backend/src/services/following/create.ts
@@ -5,7 +5,7 @@ import renderAccept from "@/remote/activitypub/renderer/accept.js";
 import renderReject from "@/remote/activitypub/renderer/reject.js";
 import { deliver } from "@/queue/index.js";
 import createFollowRequest from "./requests/create.js";
-import { registerOrFetchInstanceDoc } from "../register-or-fetch-instance-doc.js";
+import { registerOrFetchInstanceDoc } from "@/services/register-or-fetch-instance-doc.js";
 import Logger from "../logger.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 import type { User } from "@/models/entities/user.js";
@@ -22,7 +22,7 @@ import {
 	perUserFollowingChart,
 } from "@/services/chart/index.js";
 import { genId } from "@/misc/gen-id.js";
-import { createNotification } from "../create-notification.js";
+import { createNotification } from "@/services/create-notification.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
 import type { Packed } from "@/misc/schema.js";
 import { getActiveWebhooks } from "@/misc/webhook-cache.js";
diff --git a/packages/backend/src/services/following/delete.ts b/packages/backend/src/services/following/delete.ts
index fae4bd3cec..8a07244da5 100644
--- a/packages/backend/src/services/following/delete.ts
+++ b/packages/backend/src/services/following/delete.ts
@@ -5,7 +5,7 @@ import renderUndo from "@/remote/activitypub/renderer/undo.js";
 import renderReject from "@/remote/activitypub/renderer/reject.js";
 import { deliver, webhookDeliver } from "@/queue/index.js";
 import Logger from "../logger.js";
-import { registerOrFetchInstanceDoc } from "../register-or-fetch-instance-doc.js";
+import { registerOrFetchInstanceDoc } from "@/services/register-or-fetch-instance-doc.js";
 import type { User } from "@/models/entities/user.js";
 import { Followings, Users, Instances } from "@/models/index.js";
 import {
diff --git a/packages/backend/src/services/following/reject.ts b/packages/backend/src/services/following/reject.ts
index 7464219bf6..3f461268dd 100644
--- a/packages/backend/src/services/following/reject.ts
+++ b/packages/backend/src/services/following/reject.ts
@@ -4,7 +4,6 @@ import renderReject from "@/remote/activitypub/renderer/reject.js";
 import { deliver, webhookDeliver } from "@/queue/index.js";
 import { publishMainStream, publishUserEvent } from "@/services/stream.js";
 import type { ILocalUser, IRemoteUser } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 import { Users, FollowRequests, Followings } from "@/models/index.js";
 import { decrementFollowing } from "./delete.js";
 import { getActiveWebhooks } from "@/misc/webhook-cache.js";
diff --git a/packages/backend/src/services/following/requests/accept.ts b/packages/backend/src/services/following/requests/accept.ts
index 6aa17b09ad..1bc10f6082 100644
--- a/packages/backend/src/services/following/requests/accept.ts
+++ b/packages/backend/src/services/following/requests/accept.ts
@@ -5,7 +5,6 @@ import { deliver } from "@/queue/index.js";
 import { publishMainStream } from "@/services/stream.js";
 import { insertFollowingDoc } from "../create.js";
 import type { User, CacheableUser } from "@/models/entities/user.js";
-import { ILocalUser } from "@/models/entities/user.js";
 import { FollowRequests, Users } from "@/models/index.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 
diff --git a/packages/backend/src/services/following/requests/cancel.ts b/packages/backend/src/services/following/requests/cancel.ts
index 00daae380d..45b8ee0639 100644
--- a/packages/backend/src/services/following/requests/cancel.ts
+++ b/packages/backend/src/services/following/requests/cancel.ts
@@ -5,7 +5,6 @@ import { deliver } from "@/queue/index.js";
 import { publishMainStream } from "@/services/stream.js";
 import { IdentifiableError } from "@/misc/identifiable-error.js";
 import type { User } from "@/models/entities/user.js";
-import { ILocalUser } from "@/models/entities/user.js";
 import { Users, FollowRequests } from "@/models/index.js";
 
 export default async function (
diff --git a/packages/backend/src/services/following/requests/create.ts b/packages/backend/src/services/following/requests/create.ts
index 50dbd9b3be..12dfddf302 100644
--- a/packages/backend/src/services/following/requests/create.ts
+++ b/packages/backend/src/services/following/requests/create.ts
@@ -5,7 +5,7 @@ import { deliver } from "@/queue/index.js";
 import type { User } from "@/models/entities/user.js";
 import { Blockings, FollowRequests, Users } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
-import { createNotification } from "../../create-notification.js";
+import { createNotification } from "@/services/create-notification.js";
 import config from "@/config/index.js";
 
 export default async function (
diff --git a/packages/backend/src/services/i/pin.ts b/packages/backend/src/services/i/pin.ts
index ee13ce6fed..8cb1bf518e 100644
--- a/packages/backend/src/services/i/pin.ts
+++ b/packages/backend/src/services/i/pin.ts
@@ -9,7 +9,7 @@ import { Notes, UserNotePinings, Users } from "@/models/index.js";
 import type { UserNotePining } from "@/models/entities/user-note-pining.js";
 import { genId } from "@/misc/gen-id.js";
 import { deliverToFollowers } from "@/remote/activitypub/deliver-manager.js";
-import { deliverToRelays } from "../relay.js";
+import { deliverToRelays } from "@/services/relay.js";
 
 /**
  * 指定した投稿をピン留めします
diff --git a/packages/backend/src/services/i/update.ts b/packages/backend/src/services/i/update.ts
index cc950ac85a..21b03d9821 100644
--- a/packages/backend/src/services/i/update.ts
+++ b/packages/backend/src/services/i/update.ts
@@ -4,7 +4,7 @@ import { Users } from "@/models/index.js";
 import type { User } from "@/models/entities/user.js";
 import { renderPerson } from "@/remote/activitypub/renderer/person.js";
 import { deliverToFollowers } from "@/remote/activitypub/deliver-manager.js";
-import { deliverToRelays } from "../relay.js";
+import { deliverToRelays } from "@/services/relay.js";
 
 export async function publishToFollowers(userId: User["id"]) {
 	const user = await Users.findOneBy({ id: userId });
diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts
index 330d275029..df4c2e3564 100644
--- a/packages/backend/src/services/logger.ts
+++ b/packages/backend/src/services/logger.ts
@@ -2,7 +2,7 @@ import cluster from "node:cluster";
 import chalk from "chalk";
 import { default as convertColor } from "color-convert";
 import { format as dateFormat } from "date-fns";
-import { envOption } from "../env.js";
+import { envOption } from "@/env.js";
 import config from "@/config/index.js";
 
 import * as SyslogPro from "syslog-pro";
diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts
index dbb48e0fda..f9c6acba18 100644
--- a/packages/backend/src/services/note/create.ts
+++ b/packages/backend/src/services/note/create.ts
@@ -13,10 +13,10 @@ import renderAnnounce from "@/remote/activitypub/renderer/announce.js";
 import { renderActivity } from "@/remote/activitypub/renderer/index.js";
 import { resolveUser } from "@/remote/resolve-user.js";
 import config from "@/config/index.js";
-import { updateHashtags } from "../update-hashtag.js";
+import { updateHashtags } from "@/services/update-hashtag.js";
 import { concat } from "@/prelude/array.js";
 import { insertNoteUnread } from "@/services/note/unread.js";
-import { registerOrFetchInstanceDoc } from "../register-or-fetch-instance-doc.js";
+import { registerOrFetchInstanceDoc } from "@/services/register-or-fetch-instance-doc.js";
 import { extractMentions } from "@/misc/extract-mentions.js";
 import { extractCustomEmojisFromMfm } from "@/misc/extract-custom-emojis-from-mfm.js";
 import { extractHashtags } from "@/misc/extract-hashtags.js";
@@ -47,11 +47,11 @@ import {
 } from "@/services/chart/index.js";
 import type { IPoll } from "@/models/entities/poll.js";
 import { Poll } from "@/models/entities/poll.js";
-import { createNotification } from "../create-notification.js";
+import { createNotification } from "@/services/create-notification.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
 import { checkHitAntenna } from "@/misc/check-hit-antenna.js";
 import { getWordHardMute } from "@/misc/check-word-mute.js";
-import { addNoteToAntenna } from "../add-note-to-antenna.js";
+import { addNoteToAntenna } from "@/services/add-note-to-antenna.js";
 import { countSameRenotes } from "@/misc/count-same-renotes.js";
 import { deliverToRelays, getCachedRelays } from "../relay.js";
 import type { Channel } from "@/models/entities/channel.js";
@@ -173,9 +173,10 @@ export default async (
 	data: Option,
 	silent = false,
 ) =>
-	// rome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME
+	// biome-ignore lint/suspicious/noAsyncPromiseExecutor: FIXME
 	new Promise<Note>(async (res, rej) => {
-		const dontFederateInitially = data.visibility === "hidden";
+		const dontFederateInitially =
+			data.localOnly || data.visibility?.startsWith("hidden") === true;
 
 		// If you reply outside the channel, match the scope of the target.
 		// TODO (I think it's a process that could be done on the client side, but it's server side for now.)
@@ -209,7 +210,7 @@ export default async (
 		if (data.channel != null) data.visibility = "public";
 		if (data.channel != null) data.visibleUsers = [];
 		if (data.channel != null) data.localOnly = true;
-		if (data.visibility.startsWith("hidden"))
+		if (data.visibility.startsWith("hidden") && data.visibility !== "hidden")
 			data.visibility = data.visibility.slice(6);
 
 		// enforce silent clients on server
diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts
index 90175ccdc4..8a75825809 100644
--- a/packages/backend/src/services/note/delete.ts
+++ b/packages/backend/src/services/note/delete.ts
@@ -19,8 +19,8 @@ import {
 	deliverToUser,
 } from "@/remote/activitypub/deliver-manager.js";
 import { countSameRenotes } from "@/misc/count-same-renotes.js";
-import { registerOrFetchInstanceDoc } from "../register-or-fetch-instance-doc.js";
-import { deliverToRelays } from "../relay.js";
+import { registerOrFetchInstanceDoc } from "@/services/register-or-fetch-instance-doc.js";
+import { deliverToRelays } from "@/services/relay.js";
 import meilisearch from "@/db/meilisearch.js";
 
 /**
diff --git a/packages/backend/src/services/note/polls/update.ts b/packages/backend/src/services/note/polls/update.ts
index e02d48d055..270b4d9bf2 100644
--- a/packages/backend/src/services/note/polls/update.ts
+++ b/packages/backend/src/services/note/polls/update.ts
@@ -4,7 +4,7 @@ import renderNote from "@/remote/activitypub/renderer/note.js";
 import { Users, Notes } from "@/models/index.js";
 import type { Note } from "@/models/entities/note.js";
 import { deliverToFollowers } from "@/remote/activitypub/deliver-manager.js";
-import { deliverToRelays } from "../../relay.js";
+import { deliverToRelays } from "@/services/relay.js";
 
 export async function deliverQuestionUpdate(noteId: Note["id"]) {
 	const note = await Notes.findOneBy({ id: noteId });
diff --git a/packages/backend/src/services/note/polls/vote.ts b/packages/backend/src/services/note/polls/vote.ts
index 582af0b17b..6ade899726 100644
--- a/packages/backend/src/services/note/polls/vote.ts
+++ b/packages/backend/src/services/note/polls/vote.ts
@@ -1,11 +1,10 @@
 import { publishNoteStream } from "@/services/stream.js";
 import type { CacheableUser } from "@/models/entities/user.js";
-import { User } from "@/models/entities/user.js";
 import type { Note } from "@/models/entities/note.js";
 import { PollVotes, NoteWatchings, Polls, Blockings } from "@/models/index.js";
 import { Not } from "typeorm";
 import { genId } from "@/misc/gen-id.js";
-import { createNotification } from "../../create-notification.js";
+import { createNotification } from "@/services/create-notification.js";
 
 export default async function (
 	user: CacheableUser,
diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts
index 4cf1fd0941..123356515d 100644
--- a/packages/backend/src/services/note/reaction/create.ts
+++ b/packages/backend/src/services/note/reaction/create.ts
@@ -16,7 +16,7 @@ import {
 import { IsNull, Not } from "typeorm";
 import { perUserReactionsChart } from "@/services/chart/index.js";
 import { genId } from "@/misc/gen-id.js";
-import { createNotification } from "../../create-notification.js";
+import { createNotification } from "@/services/create-notification.js";
 import deleteReaction from "./delete.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
 import type { NoteReaction } from "@/models/entities/note-reaction.js";
diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts
index e969d783a0..fdc42616ea 100644
--- a/packages/backend/src/services/relay.ts
+++ b/packages/backend/src/services/relay.ts
@@ -11,7 +11,7 @@ import { Users, Relays } from "@/models/index.js";
 import { genId } from "@/misc/gen-id.js";
 import { Cache } from "@/misc/cache.js";
 import type { Relay } from "@/models/entities/relay.js";
-import { createSystemUser } from "./create-system-user.js";
+import { createSystemUser } from "@/services/create-system-user.js";
 
 const ACTOR_USERNAME = "relay.actor" as const;
 
diff --git a/packages/backend/src/services/send-email-notification.ts b/packages/backend/src/services/send-email-notification.ts
index 14a9754fe5..a2f422a962 100644
--- a/packages/backend/src/services/send-email-notification.ts
+++ b/packages/backend/src/services/send-email-notification.ts
@@ -1,8 +1,8 @@
-import { UserProfiles } from "@/models/index.js";
+// import { UserProfiles } from "@/models/index.js";
 import type { User } from "@/models/entities/user.js";
-import { sendEmail } from "./send-email.js";
-import { I18n } from "@/misc/i18n.js";
-import * as Acct from "@/misc/acct.js";
+// import { sendEmail } from "./send-email.js";
+// import { I18n } from "@/misc/i18n.js";
+// import * as Acct from "@/misc/acct.js";
 // TODO
 //const locales = await import('../../../../locales/index.js');
 
diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts
index 0703865881..ccc6b365d9 100644
--- a/packages/backend/src/services/send-email.ts
+++ b/packages/backend/src/services/send-email.ts
@@ -1,6 +1,6 @@
 import * as nodemailer from "nodemailer";
 import { fetchMeta } from "@/misc/fetch-meta.js";
-import Logger from "./logger.js";
+import Logger from "@/services/logger.js";
 import config from "@/config/index.js";
 
 export const logger = new Logger("email");
diff --git a/packages/backend/src/services/stream.ts b/packages/backend/src/services/stream.ts
index f3846feaf1..f59674ad6a 100644
--- a/packages/backend/src/services/stream.ts
+++ b/packages/backend/src/services/stream.ts
@@ -1,4 +1,4 @@
-import { redisClient } from "../db/redis.js";
+import { redisClient } from "@/db/redis.js";
 import type { User } from "@/models/entities/user.js";
 import type { Note } from "@/models/entities/note.js";
 import type { UserList } from "@/models/entities/user-list.js";
diff --git a/packages/backend/src/services/user-list/push.ts b/packages/backend/src/services/user-list/push.ts
index 01bb066019..db01b0a900 100644
--- a/packages/backend/src/services/user-list/push.ts
+++ b/packages/backend/src/services/user-list/push.ts
@@ -5,7 +5,7 @@ import { UserListJoinings, Users } from "@/models/index.js";
 import type { UserListJoining } from "@/models/entities/user-list-joining.js";
 import { genId } from "@/misc/gen-id.js";
 import { fetchProxyAccount } from "@/misc/fetch-proxy-account.js";
-import createFollowing from "../following/create.js";
+import createFollowing from "@/services/following/create.js";
 
 export async function pushUserToUserList(target: User, list: UserList) {
 	await UserListJoinings.insert({
diff --git a/packages/backend/test/ap-request.ts b/packages/backend/test/ap-request.ts
index bf77a38532..722977fe14 100644
--- a/packages/backend/test/ap-request.ts
+++ b/packages/backend/test/ap-request.ts
@@ -2,8 +2,8 @@ import * as assert from "assert";
 import httpSignature from "@peertube/http-signature";
 import { genRsaKeyPair } from "../src/misc/gen-key-pair.js";
 import {
-	createSignedPost,
 	createSignedGet,
+	createSignedPost,
 } from "../src/remote/activitypub/ap-request.js";
 
 export const buildParsedSignature = (
diff --git a/packages/backend/test/api-visibility.ts b/packages/backend/test/api-visibility.ts
index 0ee4a4d337..49b1b5a064 100644
--- a/packages/backend/test/api-visibility.ts
+++ b/packages/backend/test/api-visibility.ts
@@ -4,11 +4,11 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
 	post,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
 } from "./utils.js";
 
 describe("API visibility", () => {
diff --git a/packages/backend/test/api.ts b/packages/backend/test/api.ts
index 19a754552c..0fc2f424ec 100644
--- a/packages/backend/test/api.ts
+++ b/packages/backend/test/api.ts
@@ -4,13 +4,13 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
 	post,
 	react,
-	uploadFile,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
+	uploadFile,
 } from "./utils.js";
 
 describe("API", () => {
diff --git a/packages/backend/test/block.ts b/packages/backend/test/block.ts
index 08192e4869..100a4ab7d5 100644
--- a/packages/backend/test/block.ts
+++ b/packages/backend/test/block.ts
@@ -4,11 +4,11 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
 	post,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
 } from "./utils.js";
 
 describe("Block", () => {
diff --git a/packages/backend/test/chart.ts b/packages/backend/test/chart.ts
index e194c6c195..cd600f661a 100644
--- a/packages/backend/test/chart.ts
+++ b/packages/backend/test/chart.ts
@@ -2,11 +2,11 @@ process.env.NODE_ENV = "test";
 
 import * as assert from "assert";
 import * as lolex from "@sinonjs/fake-timers";
-import TestChart from "../src/services/chart/charts/test.js";
-import TestGroupedChart from "../src/services/chart/charts/test-grouped.js";
-import TestUniqueChart from "../src/services/chart/charts/test-unique.js";
-import TestIntersectionChart from "../src/services/chart/charts/test-intersection.js";
 import { initDb } from "../src/db/postgre.js";
+import TestGroupedChart from "../src/services/chart/charts/test-grouped.js";
+import TestIntersectionChart from "../src/services/chart/charts/test-intersection.js";
+import TestUniqueChart from "../src/services/chart/charts/test-unique.js";
+import TestChart from "../src/services/chart/charts/test.js";
 
 describe("Chart", () => {
 	let testChart: TestChart;
diff --git a/packages/backend/test/fetch-resource.ts b/packages/backend/test/fetch-resource.ts
index da3116f0e8..00c0d736ef 100644
--- a/packages/backend/test/fetch-resource.ts
+++ b/packages/backend/test/fetch-resource.ts
@@ -5,13 +5,13 @@ import * as childProcess from "child_process";
 import * as openapi from "@redocly/openapi-core";
 import {
 	async,
-	startServer,
-	signup,
+	port,
 	post,
 	request,
-	simpleGet,
-	port,
 	shutdownServer,
+	signup,
+	simpleGet,
+	startServer,
 } from "./utils.js";
 
 // Request Accept
diff --git a/packages/backend/test/ff-visibility.ts b/packages/backend/test/ff-visibility.ts
index f898926d99..efdbe7f0f6 100644
--- a/packages/backend/test/ff-visibility.ts
+++ b/packages/backend/test/ff-visibility.ts
@@ -4,14 +4,14 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
+	connectStream,
 	post,
 	react,
-	connectStream,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
 	simpleGet,
+	startServer,
 } from "./utils.js";
 
 describe("FF visibility", () => {
diff --git a/packages/backend/test/get-file-info.ts b/packages/backend/test/get-file-info.ts
index 22dc28c8e0..b1092af278 100644
--- a/packages/backend/test/get-file-info.ts
+++ b/packages/backend/test/get-file-info.ts
@@ -1,6 +1,6 @@
 import * as assert from "assert";
-import { fileURLToPath } from "node:url";
 import { dirname } from "node:path";
+import { fileURLToPath } from "node:url";
 import { getFileInfo } from "../src/misc/get-file-info.js";
 import { async } from "./utils.js";
 
diff --git a/packages/backend/test/mfm.ts b/packages/backend/test/mfm.ts
index 926bdd259d..81ed95848a 100644
--- a/packages/backend/test/mfm.ts
+++ b/packages/backend/test/mfm.ts
@@ -1,8 +1,8 @@
 import * as assert from "assert";
 import * as mfm from "mfm-js";
 
-import { toHtml } from "../src/mfm/to-html.js";
 import { fromHtml } from "../src/mfm/from-html.js";
+import { toHtml } from "../src/mfm/to-html.js";
 
 describe("toHtml", () => {
 	it("br", () => {
diff --git a/packages/backend/test/mute.ts b/packages/backend/test/mute.ts
index c511628342..831c2c1ee4 100644
--- a/packages/backend/test/mute.ts
+++ b/packages/backend/test/mute.ts
@@ -4,12 +4,12 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
 	post,
 	react,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
 	waitFire,
 } from "./utils.js";
 
diff --git a/packages/backend/test/note.ts b/packages/backend/test/note.ts
index 3af4b88d87..b78138b1ed 100644
--- a/packages/backend/test/note.ts
+++ b/packages/backend/test/note.ts
@@ -4,15 +4,15 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import { Note } from "../src/models/entities/note.js";
 import {
-	async,
-	signup,
-	request,
-	post,
-	uploadUrl,
-	startServer,
-	shutdownServer,
-	initTestDb,
 	api,
+	async,
+	initTestDb,
+	post,
+	request,
+	shutdownServer,
+	signup,
+	startServer,
+	uploadUrl,
 } from "./utils.js";
 
 describe("Note", () => {
diff --git a/packages/backend/test/streaming.ts b/packages/backend/test/streaming.ts
index 3292c66e17..37171f4184 100644
--- a/packages/backend/test/streaming.ts
+++ b/packages/backend/test/streaming.ts
@@ -4,13 +4,13 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import { Following } from "../src/models/entities/following.js";
 import {
-	connectStream,
-	signup,
 	api,
-	post,
-	startServer,
-	shutdownServer,
+	connectStream,
 	initTestDb,
+	post,
+	shutdownServer,
+	signup,
+	startServer,
 	waitFire,
 } from "./utils.js";
 
diff --git a/packages/backend/test/thread-mute.ts b/packages/backend/test/thread-mute.ts
index 9b3bb8dfe4..88483b51c8 100644
--- a/packages/backend/test/thread-mute.ts
+++ b/packages/backend/test/thread-mute.ts
@@ -4,13 +4,13 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
+	connectStream,
 	post,
 	react,
-	connectStream,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
 } from "./utils.js";
 
 describe("Note thread mute", () => {
diff --git a/packages/backend/test/user-notes.ts b/packages/backend/test/user-notes.ts
index 86a541c101..cdf5e7dbbb 100644
--- a/packages/backend/test/user-notes.ts
+++ b/packages/backend/test/user-notes.ts
@@ -4,12 +4,12 @@ import * as assert from "assert";
 import * as childProcess from "child_process";
 import {
 	async,
-	signup,
-	request,
 	post,
-	uploadUrl,
-	startServer,
+	request,
 	shutdownServer,
+	signup,
+	startServer,
+	uploadUrl,
 } from "./utils.js";
 
 describe("users/notes", () => {
diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts
index ff2dd79de9..3c8449fb58 100644
--- a/packages/backend/test/utils.ts
+++ b/packages/backend/test/utils.ts
@@ -1,18 +1,18 @@
-import * as fs from "node:fs";
-import * as path from "node:path";
-import { fileURLToPath } from "node:url";
-import { dirname } from "node:path";
 import * as childProcess from "child_process";
-import * as http from "node:http";
 import { SIGKILL } from "constants";
-import WebSocket from "ws";
+import * as fs from "node:fs";
+import * as http from "node:http";
+import * as path from "node:path";
+import { dirname } from "node:path";
+import { fileURLToPath } from "node:url";
 import * as firefish from "firefish-js";
-import fetch from "node-fetch";
 import FormData from "form-data";
+import got from "got";
+import fetch from "node-fetch";
 import { DataSource } from "typeorm";
+import WebSocket from "ws";
 import loadConfig from "../src/config/load.js";
 import { entities } from "../src/db/postgre.js";
-import got from "got";
 
 const _filename = fileURLToPath(import.meta.url);
 const _dirname = dirname(_filename);
diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json
index 692d7b95b7..324d7da8f9 100644
--- a/packages/backend/tsconfig.json
+++ b/packages/backend/tsconfig.json
@@ -10,7 +10,7 @@
 		"declaration": false,
 		"sourceMap": false,
 		"target": "es2021",
-		"module": "es2020",
+		"module": "esnext",
 		"moduleResolution": "node",
 		"allowSyntheticDefaultImports": true,
 		"removeComments": false,
diff --git a/packages/client/package.json b/packages/client/package.json
index 890aba4ab8..bb78f481fb 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -11,31 +11,35 @@
 	},
 	"devDependencies": {
 		"@discordapp/twemoji": "14.1.2",
-		"@eslint-sets/eslint-config-vue3": "^5.8.0",
+		"@eslint-sets/eslint-config-vue3": "^5.10.0",
 		"@eslint-sets/eslint-config-vue3-ts": "^3.3.0",
 		"@phosphor-icons/web": "^2.0.3",
-		"@rollup/plugin-alias": "5.0.0",
-		"@rollup/plugin-json": "6.0.0",
-		"@rollup/pluginutils": "^5.0.4",
-		"@syuilo/aiscript": "0.11.1",
-		"@types/escape-regexp": "0.0.1",
+		"@rollup/plugin-alias": "5.0.1",
+		"@rollup/plugin-json": "6.0.1",
+		"@rollup/pluginutils": "^5.0.5",
+		"@syuilo/aiscript": "0.16.0",
+		"@types/autosize": "^4.0.3",
+		"@types/escape-regexp": "0.0.3",
 		"@types/glob": "8.1.0",
-		"@types/gulp": "4.0.13",
-		"@types/gulp-rename": "2.0.2",
-		"@types/katex": "0.16.2",
-		"@types/matter-js": "0.19.0",
-		"@types/punycode": "2.1.0",
-		"@types/seedrandom": "3.0.5",
-		"@types/throttle-debounce": "5.0.0",
-		"@types/tinycolor2": "1.4.3",
-		"@types/uuid": "9.0.3",
-		"@vitejs/plugin-vue": "4.3.4",
-		"@vue/compiler-sfc": "3.3.4",
-		"@vue/runtime-core": "3.3.4",
+		"@types/gulp": "4.0.17",
+		"@types/gulp-rename": "2.0.5",
+		"@types/insert-text-at-cursor": "^0.3.2",
+		"@types/katex": "0.16.6",
+		"@types/matter-js": "0.19.4",
+		"@types/prismjs": "^1.26.3",
+		"@types/punycode": "2.1.2",
+		"@types/seedrandom": "3.0.8",
+		"@types/textarea-caret": "^3.0.3",
+		"@types/throttle-debounce": "5.0.2",
+		"@types/tinycolor2": "1.4.6",
+		"@types/uuid": "9.0.7",
+		"@vitejs/plugin-vue": "4.5.0",
+		"@vue/compiler-sfc": "3.3.8",
+		"@vue/runtime-core": "3.3.8",
 		"autobind-decorator": "2.4.0",
 		"autosize": "6.0.1",
 		"blurhash": "2.0.5",
-		"broadcast-channel": "5.3.0",
+		"broadcast-channel": "6.0.0",
 		"browser-image-resizer": "github:misskey-dev/browser-image-resizer",
 		"chart.js": "4.4.0",
 		"chartjs-adapter-date-fns": "3.0.0",
@@ -46,7 +50,7 @@
 		"compare-versions": "6.1.0",
 		"cropperjs": "2.0.0-beta.4",
 		"cross-env": "7.0.3",
-		"cypress": "10.11.0",
+		"cypress": "13.5.1",
 		"date-fns": "2.30.0",
 		"emojilib": "^3.0.11",
 		"escape-regexp": "0.0.1",
@@ -55,46 +59,46 @@
 		"eventemitter3": "5.0.1",
 		"fast-blurhash": "^1.1.2",
 		"firefish-js": "workspace:*",
-		"focus-trap": "^7.5.2",
-		"focus-trap-vue": "^4.0.2",
+		"focus-trap": "^7.5.4",
+		"focus-trap-vue": "^4.0.3",
 		"gsap": "^3.12.2",
 		"idb-keyval": "6.2.1",
 		"insert-text-at-cursor": "0.3.0",
 		"json5": "2.2.3",
-		"katex": "0.16.8",
+		"katex": "0.16.9",
 		"libopenmpt-wasm": "github:TheEssem/libopenmpt-packaging#build",
 		"matter-js": "0.19.0",
 		"mfm-js": "0.23.3",
-		"photoswipe": "5.3.9",
-		"prettier": "3.0.3",
+		"photoswipe": "5.4.2",
+		"prettier": "3.1.0",
 		"prettier-plugin-vue": "1.1.6",
 		"prismjs": "1.29.0",
-		"punycode": "2.3.0",
+		"punycode": "2.3.1",
 		"rndstr": "1.0.0",
-		"rollup": "3.28.1",
+		"rollup": "4.4.1",
 		"s-age": "1.1.2",
-		"sass": "1.66.1",
+		"sass": "1.69.5",
 		"seedrandom": "3.0.5",
 		"strict-event-emitter-types": "2.0.0",
 		"stringz": "2.1.0",
-		"swiper": "10.2.0",
+		"swiper": "11.0.4",
 		"syuilo-password-strength": "0.0.1",
 		"textarea-caret": "3.1.0",
-		"three": "0.156.0",
+		"three": "0.158.0",
 		"throttle-debounce": "5.0.0",
 		"tinycolor2": "1.6.0",
 		"tinyld": "^1.3.4",
-		"tsc-alias": "1.8.7",
+		"tsc-alias": "1.8.8",
 		"tsconfig-paths": "4.2.0",
 		"twemoji-parser": "14.0.0",
 		"typescript": "5.2.2",
 		"unicode-emoji-json": "^0.4.0",
-		"uuid": "9.0.0",
+		"uuid": "9.0.1",
 		"vanilla-tilt": "1.8.1",
-		"vite": "4.4.9",
+		"vite": "5.0.0",
 		"vite-plugin-compression": "^0.5.1",
-		"vue": "3.3.4",
-		"vue-draggable-plus": "^0.2.6",
+		"vue": "3.3.8",
+		"vue-draggable-plus": "^0.2.7",
 		"vue-isyourpasswordsafe": "^2.0.0",
 		"vue-plyr": "^7.0.0",
 		"vue-prism-editor": "2.0.0-alpha.2"
diff --git a/packages/client/src/account.ts b/packages/client/src/account.ts
index 761ebe5e00..562a9e5422 100644
--- a/packages/client/src/account.ts
+++ b/packages/client/src/account.ts
@@ -1,22 +1,16 @@
-import { defineAsyncComponent, reactive } from "vue";
 import type * as firefish from "firefish-js";
+import { defineAsyncComponent } from "vue";
 import { i18n } from "./i18n";
-import { del, get, set } from "@/scripts/idb-proxy";
 import { apiUrl } from "@/config";
 import { alert, api, popup, popupMenu, waiting } from "@/os";
-import { reloadChannel, unisonReload } from "@/scripts/unison-reload";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
+import { del, get, set } from "@/scripts/idb-proxy";
+import { reloadChannel, unisonReload } from "@/scripts/unison-reload";
 
 // TODO: 他のタブと永続化されたstateを同期
 
-type Account = firefish.entities.MeDetailed;
-
-const accountData = localStorage.getItem("account");
-
-// TODO: 外部からはreadonlyに
-export const $i = accountData
-	? reactive(JSON.parse(accountData) as Account)
-	: null;
+export type Account = firefish.entities.MeDetailed;
 
 export const iAmModerator = $i != null && ($i.isAdmin || $i.isModerator);
 export const iAmAdmin = $i?.isAdmin;
@@ -100,7 +94,6 @@ function fetchAccount(token: string): Promise<Account> {
 					if (res.error.id === "a8c724b3-6e9c-4b46-b1a8-bc3ed6258370") {
 						showSuspendedDialog();
 						signout();
-						return;
 					} else {
 						alert({
 							type: "error",
diff --git a/packages/client/src/components/MkChatPreview.vue b/packages/client/src/components/MkChatPreview.vue
index d4c8dfaa74..b309c8b002 100644
--- a/packages/client/src/components/MkChatPreview.vue
+++ b/packages/client/src/components/MkChatPreview.vue
@@ -22,8 +22,8 @@
 					message.groupId
 						? message.user
 						: isMe(message)
-						? message.recipient
-						: message.user
+						  ? message.recipient
+						  : message.user
 				"
 				:show-indicator="true"
 				disable-link
@@ -66,7 +66,7 @@
 import * as Acct from "firefish-js/built/acct";
 import { i18n } from "@/i18n";
 import { acct } from "@/filters/user";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 const getAcct = Acct.toString;
 
diff --git a/packages/client/src/components/MkCropperDialog.vue b/packages/client/src/components/MkCropperDialog.vue
index c85cdf9419..1c56699337 100644
--- a/packages/client/src/components/MkCropperDialog.vue
+++ b/packages/client/src/components/MkCropperDialog.vue
@@ -42,7 +42,7 @@ import Cropper from "cropperjs";
 import tinycolor from "tinycolor2";
 import XModalWindow from "@/components/MkModalWindow.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { defaultStore } from "@/store";
 import { apiUrl, url } from "@/config";
 import { query } from "@/scripts/url";
diff --git a/packages/client/src/components/MkDialog.vue b/packages/client/src/components/MkDialog.vue
index ce1bfc3871..2659f139b8 100644
--- a/packages/client/src/components/MkDialog.vue
+++ b/packages/client/src/components/MkDialog.vue
@@ -11,32 +11,30 @@
 			</div>
 			<div
 				v-else-if="!input && !select"
-				:class="[$style.icon, $style['type_' + type]]"
+				:class="[$style.icon, $style[`type_${type}`]]"
 			>
 				<i
 					v-if="type === 'success'"
-					:class="$style.iconInner"
-					class="ph-check ph-lg"
+					:class="[$style.iconInner, iconClass('ph-check')]"
 				></i>
 				<i
 					v-else-if="type === 'error'"
-					:class="$style.iconInner"
-					class="ph-circle-wavy-warning ph-lg"
+					:class="[
+						$style.iconInner,
+						iconClass('ph-circle-wavy-warning'),
+					]"
 				></i>
 				<i
 					v-else-if="type === 'warning'"
-					:class="$style.iconInner"
-					class="ph-warning ph-lg"
+					:class="[$style.iconInner, iconClass('ph-warning')]"
 				></i>
 				<i
 					v-else-if="type === 'info'"
-					:class="$style.iconInner"
-					class="ph-info ph-lg"
+					:class="[$style.iconInner, iconClass('ph-info')]"
 				></i>
 				<i
 					v-else-if="type === 'question'"
-					:class="$style.iconInner"
-					class="ph-circle-question ph-lg"
+					:class="[$style.iconInner, iconClass('ph-question')]"
 				></i>
 				<MkLoading
 					v-else-if="type === 'waiting'"
@@ -117,7 +115,7 @@
 				v-if="input && input.type === 'paragraph'"
 				v-model="inputValue"
 				autofocus
-				:type="paragraph"
+				type="paragraph"
 				:placeholder="input.placeholder || undefined"
 			>
 			</MkTextarea>
@@ -193,7 +191,7 @@
 					@click="
 						() => {
 							action.callback();
-							modal?.close();
+							modal?.close(null);
 						}
 					"
 					>{{ action.text }}</MkButton
@@ -320,7 +318,7 @@ const inputEl = ref<typeof MkInput>();
 
 function done(canceled: boolean, result?) {
 	emit("done", { canceled, result });
-	modal.value?.close();
+	modal.value?.close(null);
 }
 
 async function ok() {
@@ -329,8 +327,8 @@ async function ok() {
 	const result = props.input
 		? inputValue.value
 		: props.select
-		? selectedValue.value
-		: true;
+		  ? selectedValue.value
+		  : true;
 	done(false, result);
 }
 
@@ -361,106 +359,134 @@ function formatDateToYYYYMMDD(date) {
 	return `${year}-${month}-${day}`;
 }
 
+/**
+ * Appends a new search parameter to the value in the input field.
+ * Trims any extra whitespace before and after, then adds a space at the end so a user can immediately
+ * begin typing a new criteria.
+ * @param value The value to append.
+ */
+function appendFilter(value: string) {
+	return (
+		[
+			typeof inputValue.value === "string"
+				? inputValue.value.trim()
+				: inputValue.value,
+			value,
+		]
+			.join(" ")
+			.trim() + " "
+	);
+}
+
 async function openSearchFilters(ev) {
 	await os.popupMenu(
 		[
 			{
-				icon: `${icon("ph-user")}`,
+				icon: `${iconClass("ph-user")}`,
 				text: i18n.ts._filters.fromUser,
 				action: () => {
 					os.selectUser().then((user) => {
-						inputValue.value += " from:@" + Acct.toString(user);
+						inputValue.value = appendFilter(
+							"from:@" + Acct.toString(user),
+						);
 					});
 				},
 			},
 			{
 				type: "parent",
 				text: i18n.ts._filters.withFile,
-				icon: `${icon("ph-paperclip")}`,
+				icon: `${iconClass("ph-paperclip")}`,
 				children: [
 					{
 						text: i18n.ts.image,
-						icon: `${icon("ph-image-square")}`,
+						icon: `${iconClass("ph-image-square")}`,
 						action: () => {
-							inputValue.value += " has:image";
+							inputValue.value = appendFilter("has:image");
 						},
 					},
 					{
 						text: i18n.ts.video,
-						icon: `${icon("ph-video-camera")}`,
+						icon: `${iconClass("ph-video-camera")}`,
 						action: () => {
-							inputValue.value += " has:video";
+							inputValue.value = appendFilter("has:video");
 						},
 					},
 					{
 						text: i18n.ts.audio,
-						icon: `${icon("ph-music-note")}`,
+						icon: `${iconClass("ph-music-note")}`,
 						action: () => {
-							inputValue.value += " has:audio";
+							inputValue.value = appendFilter("has:audio");
 						},
 					},
 					{
 						text: i18n.ts.file,
-						icon: `${icon("ph-file")}`,
+						icon: `${iconClass("ph-file")}`,
 						action: () => {
-							inputValue.value += " has:file";
+							inputValue.value = appendFilter("has:file");
 						},
 					},
 				],
 			},
 			{
-				icon: `${icon("ph-link")}`,
+				icon: `${iconClass("ph-link")}`,
 				text: i18n.ts._filters.fromDomain,
 				action: () => {
-					inputValue.value += " domain:";
+					inputValue.value = appendFilter("domain:");
 				},
 			},
 			{
-				icon: `${icon("ph-calendar-blank")}`,
+				icon: `${iconClass("ph-calendar-blank")}`,
 				text: i18n.ts._filters.notesBefore,
 				action: () => {
 					os.inputDate({
 						title: i18n.ts._filters.notesBefore,
 					}).then((res) => {
 						if (res.canceled) return;
-						inputValue.value +=
-							" before:" + formatDateToYYYYMMDD(res.result);
+						inputValue.value = appendFilter(
+							"before:" + formatDateToYYYYMMDD(res.result),
+						);
 					});
 				},
 			},
 			{
-				icon: `${icon("ph-calendar-blank")}`,
+				icon: `${iconClass("ph-calendar-blank")}`,
 				text: i18n.ts._filters.notesAfter,
 				action: () => {
 					os.inputDate({
 						title: i18n.ts._filters.notesAfter,
 					}).then((res) => {
 						if (res.canceled) return;
-						inputValue.value +=
-							" after:" + formatDateToYYYYMMDD(res.result);
+						inputValue.value = appendFilter(
+							"after:" + formatDateToYYYYMMDD(res.result),
+						);
 					});
 				},
 			},
 			{
-				icon: `${icon("ph-eye")}`,
+				icon: `${iconClass("ph-eye")}`,
 				text: i18n.ts._filters.followingOnly,
 				action: () => {
-					inputValue.value += " filter:following ";
+					inputValue.value = appendFilter("filter:following");
 				},
 			},
 			{
-				icon: `${icon("ph-users-three")}`,
+				icon: `${iconClass("ph-users-three")}`,
 				text: i18n.ts._filters.followersOnly,
 				action: () => {
-					inputValue.value += " filter:followers ";
+					inputValue.value = appendFilter("filter:followers");
 				},
 			},
 		],
 		ev.target,
 		{ noReturnFocus: true },
 	);
-	inputEl.value.focus();
-	inputEl.value.selectRange(inputValue.value.length, inputValue.value.length); // cursor at end
+	inputEl.value?.focus();
+	if (typeof inputValue.value === "string") {
+		inputEl.value?.selectRange(
+			inputValue.value.length,
+			inputValue.value.length,
+		); // cursor at end
+	}
 }
 
 onMounted(() => {
diff --git a/packages/client/src/components/MkDrive.file.vue b/packages/client/src/components/MkDrive.file.vue
index 8f5a10730b..5163b9f7cb 100644
--- a/packages/client/src/components/MkDrive.file.vue
+++ b/packages/client/src/components/MkDrive.file.vue
@@ -45,7 +45,7 @@ import MkDriveFileThumbnail from "@/components/MkDriveFileThumbnail.vue";
 import bytes from "@/filters/bytes";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const props = withDefaults(
@@ -107,6 +107,12 @@ function getMenu() {
 			icon: `${icon("ph-download-simple")}`,
 			download: props.file.name,
 		},
+		{
+			type: "a",
+			href: `/my/drive/file/${props.file.id}/attached`,
+			text: i18n.ts.showAttachedNotes,
+			icon: `${icon("ph-paperclip")}`,
+		},
 		null,
 		{
 			text: i18n.ts.delete,
diff --git a/packages/client/src/components/MkDriveSelectDialog.vue b/packages/client/src/components/MkDriveSelectDialog.vue
index af40dc8490..1047acce97 100644
--- a/packages/client/src/components/MkDriveSelectDialog.vue
+++ b/packages/client/src/components/MkDriveSelectDialog.vue
@@ -17,8 +17,8 @@
 						? i18n.ts.selectFiles
 						: i18n.ts.selectFolders
 					: type === "file"
-					? i18n.ts.selectFile
-					: i18n.ts.selectFolder
+					  ? i18n.ts.selectFile
+					  : i18n.ts.selectFolder
 			}}
 			<span
 				v-if="selected.length > 0"
diff --git a/packages/client/src/components/MkFolder.vue b/packages/client/src/components/MkFolder.vue
index a168cbdcfe..279c8f7186 100644
--- a/packages/client/src/components/MkFolder.vue
+++ b/packages/client/src/components/MkFolder.vue
@@ -10,15 +10,15 @@
 				:aria-controls="bodyId"
 			>
 				<template v-if="showBody"
-					><i :class="icon('ph-caret-up')"></i
+					><i class="ph-caret-up ph-bold ph-lg"></i
 				></template>
 				<template v-else
-					><i :class="icon('ph-caret-down')"></i
+					><i class="ph-caret-down ph-bold ph-lg"></i
 				></template>
 			</button>
 		</header>
 		<transition
-			:name="defaultStore.state.animation ? 'folder-toggle' : ''"
+			:name="animation ? 'folder-toggle' : ''"
 			@enter="enter"
 			@after-enter="afterEnter"
 			@leave="leave"
@@ -35,7 +35,7 @@
 import { defineComponent } from "vue";
 import { getUniqueId } from "@/os";
 import { defaultStore } from "@/store";
-import icon from "@/scripts/icon";
+// import icon from "@/scripts/icon";
 
 const localStoragePrefix = "ui:folder:";
 
@@ -62,6 +62,7 @@ export default defineComponent({
 							localStoragePrefix + this.persistKey,
 					  ) === "t"
 					: this.expanded,
+			animation: defaultStore.state.animation,
 		};
 	},
 	watch: {
diff --git a/packages/client/src/components/MkFollowButton.vue b/packages/client/src/components/MkFollowButton.vue
index 961805f553..035847480f 100644
--- a/packages/client/src/components/MkFollowButton.vue
+++ b/packages/client/src/components/MkFollowButton.vue
@@ -66,7 +66,7 @@ import type * as firefish from "firefish-js";
 import * as os from "@/os";
 import { stream } from "@/stream";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { getUserMenu } from "@/scripts/get-user-menu";
 import { useRouter } from "@/router";
 import { vibrate } from "@/scripts/vibrate";
diff --git a/packages/client/src/components/MkHeatmap.vue b/packages/client/src/components/MkHeatmap.vue
index 0565c5914b..fb88f995f7 100644
--- a/packages/client/src/components/MkHeatmap.vue
+++ b/packages/client/src/components/MkHeatmap.vue
@@ -15,7 +15,7 @@ import { defaultStore } from "@/store";
 import { useChartTooltip } from "@/scripts/use-chart-tooltip";
 import { alpha } from "@/scripts/color";
 import { initChart } from "@/scripts/init-chart";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 initChart();
 
diff --git a/packages/client/src/components/MkLaunchPad.vue b/packages/client/src/components/MkLaunchPad.vue
index 286f9ccf58..9e194f8e4b 100644
--- a/packages/client/src/components/MkLaunchPad.vue
+++ b/packages/client/src/components/MkLaunchPad.vue
@@ -88,8 +88,8 @@ const preferedModalType =
 	deviceKind === "desktop" && props.src != null
 		? "popup"
 		: deviceKind === "smartphone"
-		? "drawer"
-		: "dialog";
+		  ? "drawer"
+		  : "dialog";
 
 const modal = ref<InstanceType<typeof MkModal>>();
 
diff --git a/packages/client/src/components/MkMedia.vue b/packages/client/src/components/MkMedia.vue
index 24db8d4e74..dad2f9e77d 100644
--- a/packages/client/src/components/MkMedia.vue
+++ b/packages/client/src/components/MkMedia.vue
@@ -113,9 +113,9 @@ const url =
 	props.raw || defaultStore.state.loadRawImages
 		? props.media.url
 		: defaultStore.state.disableShowingAnimatedImages &&
-		  props.media.type.startsWith("image")
-		? getStaticImageUrl(props.media.thumbnailUrl)
-		: props.media.thumbnailUrl;
+		    props.media.type.startsWith("image")
+		  ? getStaticImageUrl(props.media.thumbnailUrl)
+		  : props.media.thumbnailUrl;
 
 const mediaType = computed(() => {
 	return props.media.type === "video/quicktime"
diff --git a/packages/client/src/components/MkMediaList.vue b/packages/client/src/components/MkMediaList.vue
index 72f50129eb..0d6f098f81 100644
--- a/packages/client/src/components/MkMediaList.vue
+++ b/packages/client/src/components/MkMediaList.vue
@@ -50,9 +50,9 @@ import XMedia from "@/components/MkMedia.vue";
 import XModPlayer from "@/components/MkModPlayer.vue";
 import * as os from "@/os";
 import {
+	FILE_EXT_TRACKER_MODULES,
 	FILE_TYPE_BROWSERSAFE,
 	FILE_TYPE_TRACKER_MODULES,
-	FILE_EXT_TRACKER_MODULES,
 } from "@/const";
 
 const props = defineProps<{
@@ -196,9 +196,7 @@ const previewable = (file: firefish.entities.DriveFile): boolean => {
 
 const isModule = (file: firefish.entities.DriveFile): boolean => {
 	return (
-		FILE_TYPE_TRACKER_MODULES.some((type) => {
-			return file.type === type;
-		}) ||
+		FILE_TYPE_TRACKER_MODULES.includes(file.type) ||
 		FILE_EXT_TRACKER_MODULES.some((ext) => {
 			return file.name.toLowerCase().endsWith("." + ext);
 		})
diff --git a/packages/client/src/components/MkMention.vue b/packages/client/src/components/MkMention.vue
index fa8e2a871a..b113d9cb15 100644
--- a/packages/client/src/components/MkMention.vue
+++ b/packages/client/src/components/MkMention.vue
@@ -37,7 +37,7 @@
 import { toUnicode } from "punycode";
 import {} from "vue";
 import { host as localHost } from "@/config";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { defaultStore } from "@/store";
 
 const props = defineProps<{
diff --git a/packages/client/src/components/MkModPlayer.vue b/packages/client/src/components/MkModPlayer.vue
index 08bfa69b85..266f418f45 100644
--- a/packages/client/src/components/MkModPlayer.vue
+++ b/packages/client/src/components/MkModPlayer.vue
@@ -1,33 +1,33 @@
 <template>
-	<div class="mod-player-disabled" v-if="!available">
+	<div v-if="!available" class="mod-player-disabled">
 		<MkLoading v-if="fetching" />
 		<MkError v-else-if="error" @retry="load()" />
 	</div>
-	<div class="mod-player-disabled" v-else-if="hide" @click="toggleVisible()">
+	<div v-else-if="hide" class="mod-player-disabled" @click="toggleVisible()">
 		<div>
 			<b><i class="ph-warning"></i> {{ i18n.ts.sensitive }}</b>
 			<span>{{ i18n.ts.clickToShow }}</span>
 		</div>
 	</div>
 
-	<div class="mod-player-enabled" v-else>
+	<div v-else class="mod-player-enabled">
 		<div class="pattern-display">
-			<div class="mod-pattern" ref="modPattern" v-if="patternShow">
+			<div v-if="patternShow" ref="modPattern" class="mod-pattern">
 				<span
 					v-for="(row, i) in patData[currentPattern]"
-					ref="initRow"
-					v-bind:class="{ modRowActive: isRowActive(i) }"
 					v-if="patData.length !== 0"
+					ref="initRow"
+					:class="{ modRowActive: isRowActive(i) }"
 				>
-					<span v-bind:class="{ modColQuarter: i % 4 === 0 }">{{
+					<span :class="{ modColQuarter: i % 4 === 0 }">{{
 						indexText(i)
 					}}</span>
 					<span class="mod-row-inner">{{ getRowText(row) }}</span>
 				</span>
 				<MkLoading v-else />
 			</div>
-			<div class="mod-pattern" v-else @click="showPattern()">
-				<span class="modRowActive" ref="initRow">
+			<div v-else class="mod-pattern" @click="showPattern()">
+				<span ref="initRow" class="modRowActive">
 					<span class="modColQuarter">00</span>
 					<span class="mod-row-inner">|F-12Ev10XEF</span>
 				</span>
@@ -36,39 +36,39 @@
 			</div>
 		</div>
 		<div class="controls">
-			<button class="play" @click="playPause()" v-if="!loading">
-				<i class="ph-pause ph-fill" v-if="playing"></i>
-				<i class="ph-play ph-fill" v-else></i>
+			<button v-if="!loading" class="play" @click="playPause()">
+				<i v-if="playing" class="ph-pause ph-fill"></i>
+				<i v-else class="ph-play ph-fill"></i>
 			</button>
 			<MkLoading v-else :em="true" />
 			<button class="stop" @click="stop()">
 				<i class="ph-stop ph-fill"></i>
 			</button>
 			<button class="loop" @click="toggleLoop()">
-				<i class="ph-repeat ph-fill" v-if="loop === -1"></i>
-				<i class="ph-repeat-once ph-fill" v-else></i>
+				<i v-if="loop === -1" class="ph-repeat ph-fill"></i>
+				<i v-else class="ph-repeat-once ph-fill"></i>
 			</button>
 			<FormRange
+				ref="progress"
+				v-model="position"
 				class="progress"
 				:min="0"
 				:max="length"
-				v-model="position"
 				:step="0.1"
-				ref="progress"
 				:background="false"
 				:tooltips="false"
 				:instant="true"
 				@update:modelValue="performSeek()"
 			></FormRange>
 			<button class="mute" @click="toggleMute()">
-				<i class="ph-speaker-simple-x ph-fill" v-if="muted"></i>
-				<i class="ph-speaker-simple-high ph-fill" v-else></i>
+				<i v-if="muted" class="ph-speaker-simple-x ph-fill"></i>
+				<i v-else class="ph-speaker-simple-high ph-fill"></i>
 			</button>
 			<FormRange
+				v-model="player.context.gain.value"
 				class="volume"
 				:min="0"
 				:max="1"
-				v-model="player.context.gain.value"
 				:step="0.1"
 				:background="false"
 				:tooltips="false"
@@ -91,7 +91,7 @@
 				class="_button"
 				@click.stop="captionPopup"
 			>
-				<i class="ph-subtitles"></i>
+				<i :class="icon('ph-subtitles')"></i>
 			</button>
 			<button
 				v-if="!hide"
@@ -99,20 +99,20 @@
 				class="_button"
 				@click.stop="toggleVisible()"
 			>
-				<i class="ph-eye-slash"></i>
+				<i :class="icon('ph-eye-slash')"></i>
 			</button>
 		</div>
 	</div>
 </template>
 
 <script lang="ts" setup>
-import { ref, shallowRef, nextTick, onDeactivated, onMounted } from "vue";
-import * as firefish from "firefish-js";
+import { nextTick, onDeactivated, onMounted, ref, shallowRef } from "vue";
+import type * as firefish from "firefish-js";
 import FormRange from "./form/range.vue";
 import { i18n } from "@/i18n";
 import * as os from "@/os";
 import { defaultStore } from "@/store";
-import { ChiptuneJsPlayer, ChiptuneJsConfig } from "@/scripts/chiptune2";
+import { ChiptuneJsConfig, ChiptuneJsPlayer } from "@/scripts/chiptune2";
 import icon from "@/scripts/icon";
 
 const props = defineProps<{
@@ -130,25 +130,25 @@ interface ModRow {
 const available = ref(false);
 const initRow = shallowRef<HTMLSpanElement>();
 const player = shallowRef(new ChiptuneJsPlayer(new ChiptuneJsConfig()));
-let hide = ref(
+const hide = ref(
 	defaultStore.state.nsfw === "force"
 		? true
 		: props.module.isSensitive && defaultStore.state.nsfw !== "ignore",
 );
-let playing = ref(false);
-let patternShow = ref(false);
-let modPattern = ref<HTMLDivElement>();
-let progress = ref<typeof FormRange>();
-let position = ref(0);
-let patData = shallowRef([] as ModRow[][]);
-let currentPattern = ref(0);
-let nbChannels = ref(0);
-let length = ref(1);
-let muted = ref(false);
-let loop = ref(0);
-let fetching = ref(true);
-let error = ref(false);
-let loading = ref(false);
+const playing = ref(false);
+const patternShow = ref(false);
+const modPattern = ref<HTMLDivElement>();
+const progress = ref<typeof FormRange>();
+const position = ref(0);
+const patData = shallowRef([] as ModRow[][]);
+const currentPattern = ref(0);
+const nbChannels = ref(0);
+const length = ref(1);
+const muted = ref(false);
+const loop = ref(0);
+const fetching = ref(true);
+const error = ref(false);
+const loading = ref(false);
 
 function load() {
 	player.value
@@ -168,10 +168,10 @@ function load() {
 
 onMounted(load);
 
-let currentRow = 0;
-let rowHeight = 0;
-let buffer = null;
-let isSeeking = false;
+let currentRow = 0,
+	rowHeight = 0,
+	buffer = null,
+	isSeeking = false;
 
 function captionPopup() {
 	os.alert({
@@ -293,7 +293,6 @@ function isRowActive(i: number) {
 		}
 		return true;
 	}
-	return;
 }
 
 function indexText(i: number) {
@@ -305,11 +304,11 @@ function indexText(i: number) {
 }
 
 function getRow(pattern: number, rowOffset: number) {
-	let notes: string[] = [],
-		insts: string[] = [],
-		vols: string[] = [],
-		fxs: string[] = [],
-		ops: string[] = [];
+	const notes: string[] = [];
+	const insts: string[] = [];
+	const vols: string[] = [];
+	const fxs: string[] = [];
+	const ops: string[] = [];
 
 	for (let channel = 0; channel < nbChannels.value; channel++) {
 		const part = player.value.getPatternRowChannel(
diff --git a/packages/client/src/components/MkModal.vue b/packages/client/src/components/MkModal.vue
index 893cced0d5..f6b52a626c 100644
--- a/packages/client/src/components/MkModal.vue
+++ b/packages/client/src/components/MkModal.vue
@@ -169,22 +169,22 @@ const transitionName = computed(() =>
 		? useSendAnime.value
 			? "send"
 			: type.value === "drawer"
-			? "modal-drawer"
-			: type.value === "popup"
-			? "modal-popup"
-			: "modal"
+			  ? "modal-drawer"
+			  : type.value === "popup"
+			    ? "modal-popup"
+			    : "modal"
 		: "",
 );
 const transitionDuration = computed(() =>
 	transitionName.value === "send"
 		? 400
 		: transitionName.value === "modal-popup"
-		? 100
-		: transitionName.value === "modal"
-		? 200
-		: transitionName.value === "modal-drawer"
-		? 200
-		: 0,
+		  ? 100
+		  : transitionName.value === "modal"
+		    ? 200
+		    : transitionName.value === "modal-drawer"
+		      ? 200
+		      : 0,
 );
 
 let contentClicking = false;
diff --git a/packages/client/src/components/MkModalPageWindow.vue b/packages/client/src/components/MkModalPageWindow.vue
index bcf763e3a1..bd44379001 100644
--- a/packages/client/src/components/MkModalPageWindow.vue
+++ b/packages/client/src/components/MkModalPageWindow.vue
@@ -64,7 +64,6 @@ import { i18n } from "@/i18n";
 import type { PageMetadata } from "@/scripts/page-metadata";
 import { provideMetadataReceiver } from "@/scripts/page-metadata";
 import { Router } from "@/nirax";
-import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
 
 const props = defineProps<{
diff --git a/packages/client/src/components/MkModalWindow.vue b/packages/client/src/components/MkModalWindow.vue
index 1a2b3db85e..cab0f07a79 100644
--- a/packages/client/src/components/MkModalWindow.vue
+++ b/packages/client/src/components/MkModalWindow.vue
@@ -17,8 +17,8 @@
 							? `${props.height}px`
 							: null
 						: height
-						? `min(${props.height}px, 100%)`
-						: '100%',
+						  ? `min(${props.height}px, 100%)`
+						  : '100%',
 				}"
 				tabindex="-1"
 			>
diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue
index 7463d32f96..92584bce0d 100644
--- a/packages/client/src/components/MkNote.vue
+++ b/packages/client/src/components/MkNote.vue
@@ -294,7 +294,7 @@ import { userPage } from "@/filters/user";
 import * as os from "@/os";
 import { defaultStore, noteViewInterruptors } from "@/store";
 import { reactionPicker } from "@/scripts/reaction-picker";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { getNoteMenu } from "@/scripts/get-note-menu";
 import { useNoteCapture } from "@/scripts/use-note-capture";
@@ -359,7 +359,7 @@ const isDeleted = ref(false);
 const muted = ref(
 	getWordSoftMute(
 		note.value,
-		$i.id,
+		$i?.id,
 		defaultStore.state.mutedWords,
 		defaultStore.state.mutedLangs,
 	),
diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue
index 5e0770e151..97232c5185 100644
--- a/packages/client/src/components/MkNoteDetailed.vue
+++ b/packages/client/src/components/MkNoteDetailed.vue
@@ -182,7 +182,7 @@ import { userPage } from "@/filters/user";
 import * as os from "@/os";
 import { defaultStore, noteViewInterruptors } from "@/store";
 import { reactionPicker } from "@/scripts/reaction-picker";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { getNoteMenu } from "@/scripts/get-note-menu";
 import { useNoteCapture } from "@/scripts/use-note-capture";
@@ -235,7 +235,7 @@ const isDeleted = ref(false);
 const muted = ref(
 	getWordSoftMute(
 		note.value,
-		$i.id,
+		$i?.id,
 		defaultStore.state.mutedWords,
 		defaultStore.state.mutedLangs,
 	),
diff --git a/packages/client/src/components/MkNotePreview.vue b/packages/client/src/components/MkNotePreview.vue
index be007738d9..62bcc0f0c5 100644
--- a/packages/client/src/components/MkNotePreview.vue
+++ b/packages/client/src/components/MkNotePreview.vue
@@ -22,7 +22,7 @@
 <script lang="ts" setup>
 import preprocess from "@/scripts/preprocess";
 
-const props = defineProps<{
+defineProps<{
 	text: string;
 }>();
 </script>
diff --git a/packages/client/src/components/MkNoteSimple.vue b/packages/client/src/components/MkNoteSimple.vue
index 5f45811fc1..70ee62bf28 100644
--- a/packages/client/src/components/MkNoteSimple.vue
+++ b/packages/client/src/components/MkNoteSimple.vue
@@ -15,7 +15,7 @@ import type * as firefish from "firefish-js";
 import XNoteHeader from "@/components/MkNoteHeader.vue";
 import MkSubNoteContent from "@/components/MkSubNoteContent.vue";
 
-const props = defineProps<{
+defineProps<{
 	note: firefish.entities.Note;
 	pinned?: boolean;
 }>();
diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue
index 535320079d..5bca4e8dc0 100644
--- a/packages/client/src/components/MkNoteSub.vue
+++ b/packages/client/src/components/MkNoteSub.vue
@@ -210,7 +210,7 @@ import { useRouter } from "@/router";
 import { userPage } from "@/filters/user";
 import * as os from "@/os";
 import { reactionPicker } from "@/scripts/reaction-picker";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { useNoteCapture } from "@/scripts/use-note-capture";
 import { defaultStore } from "@/store";
@@ -268,7 +268,7 @@ const isDeleted = ref(false);
 const muted = ref(
 	getWordSoftMute(
 		note.value,
-		$i.id,
+		$i?.id,
 		defaultStore.state.mutedWords,
 		defaultStore.state.mutedLangs,
 	),
diff --git a/packages/client/src/components/MkNotes.vue b/packages/client/src/components/MkNotes.vue
index 267ce7463b..f64100a6fd 100644
--- a/packages/client/src/components/MkNotes.vue
+++ b/packages/client/src/components/MkNotes.vue
@@ -45,7 +45,7 @@ import { scroll } from "@/scripts/scroll";
 
 const tlEl = ref<HTMLElement>();
 
-const props = defineProps<{
+defineProps<{
 	pagination: Paging;
 	noGap?: boolean;
 }>();
diff --git a/packages/client/src/components/MkNotifications.vue b/packages/client/src/components/MkNotifications.vue
index e9292342b2..8ae7365110 100644
--- a/packages/client/src/components/MkNotifications.vue
+++ b/packages/client/src/components/MkNotifications.vue
@@ -54,7 +54,7 @@ import XNotification from "@/components/MkNotification.vue";
 import XList from "@/components/MkDateSeparatedList.vue";
 import XNote from "@/components/MkNote.vue";
 import { stream } from "@/stream";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 
 const props = defineProps<{
diff --git a/packages/client/src/components/MkObjectView.vue b/packages/client/src/components/MkObjectView.vue
index 74f3ed0a31..1e69ba988d 100644
--- a/packages/client/src/components/MkObjectView.vue
+++ b/packages/client/src/components/MkObjectView.vue
@@ -5,10 +5,9 @@
 </template>
 
 <script lang="ts" setup>
-import {} from "vue";
 import XValue from "./MkObjectView.value.vue";
 
-const props = defineProps<{
+defineProps<{
 	value: Record<string, unknown>;
 }>();
 </script>
diff --git a/packages/client/src/components/MkPagination.vue b/packages/client/src/components/MkPagination.vue
index f06e8a11d9..17d2ef3e7a 100644
--- a/packages/client/src/components/MkPagination.vue
+++ b/packages/client/src/components/MkPagination.vue
@@ -259,12 +259,12 @@ const fetchMore = async (): Promise<void> => {
 						offset: offset.value,
 				  }
 				: props.pagination.reversed
-				? {
-						sinceId: items.value[0].id,
-				  }
-				: {
-						untilId: items.value[items.value.length - 1].id,
-				  }),
+				  ? {
+							sinceId: items.value[0].id,
+				    }
+				  : {
+							untilId: items.value[items.value.length - 1].id,
+				    }),
 		})
 		.then(
 			(res) => {
@@ -320,12 +320,12 @@ const fetchMoreAhead = async (): Promise<void> => {
 						offset: offset.value,
 				  }
 				: props.pagination.reversed
-				? {
-						untilId: items.value[0].id,
-				  }
-				: {
-						sinceId: items.value[items.value.length - 1].id,
-				  }),
+				  ? {
+							untilId: items.value[0].id,
+				    }
+				  : {
+							sinceId: items.value[items.value.length - 1].id,
+				    }),
 		})
 		.then(
 			(res) => {
diff --git a/packages/client/src/components/MkPoll.vue b/packages/client/src/components/MkPoll.vue
index 21540ba454..48211f1712 100644
--- a/packages/client/src/components/MkPoll.vue
+++ b/packages/client/src/components/MkPoll.vue
@@ -81,10 +81,10 @@ const timer = computed(() =>
 		remaining.value >= 86400
 			? "_poll.remainingDays"
 			: remaining.value >= 3600
-			? "_poll.remainingHours"
-			: remaining.value >= 60
-			? "_poll.remainingMinutes"
-			: "_poll.remainingSeconds",
+			  ? "_poll.remainingHours"
+			  : remaining.value >= 60
+			    ? "_poll.remainingMinutes"
+			    : "_poll.remainingSeconds",
 		{
 			s: Math.floor(remaining.value % 60),
 			m: Math.floor(remaining.value / 60) % 60,
diff --git a/packages/client/src/components/MkPollEditor.vue b/packages/client/src/components/MkPollEditor.vue
index d6dcd75b31..622ac7fd98 100644
--- a/packages/client/src/components/MkPollEditor.vue
+++ b/packages/client/src/components/MkPollEditor.vue
@@ -171,8 +171,8 @@ function get() {
 		...(expiration.value === "at"
 			? { expiresAt: calcAt() }
 			: expiration.value === "after"
-			? { expiredAfter: calcAfter() }
-			: {}),
+			  ? { expiredAfter: calcAfter() }
+			  : {}),
 	};
 }
 
diff --git a/packages/client/src/components/MkPostForm.vue b/packages/client/src/components/MkPostForm.vue
index e6a5028770..da1c665c61 100644
--- a/packages/client/src/components/MkPostForm.vue
+++ b/packages/client/src/components/MkPostForm.vue
@@ -80,8 +80,8 @@
 								reply
 									? 'ph-arrow-u-up-left'
 									: renote
-									? 'ph-quotes'
-									: 'ph-paper-plane-tilt',
+									  ? 'ph-quotes'
+									  : 'ph-paper-plane-tilt',
 							)
 						"
 					></i>
@@ -276,11 +276,8 @@ import { defaultStore, notePostInterruptors, postFormActions } from "@/store";
 import MkInfo from "@/components/MkInfo.vue";
 import { i18n } from "@/i18n";
 import { instance } from "@/instance";
-import {
-	$i,
-	getAccounts,
-	openAccountMenu as openAccountMenu_,
-} from "@/account";
+import { getAccounts, openAccountMenu as openAccountMenu_ } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { uploadFile } from "@/scripts/upload";
 import { deepClone } from "@/scripts/clone";
 import XCheatSheet from "@/components/MkCheatSheetDialog.vue";
@@ -420,10 +417,10 @@ const submitText = computed((): string => {
 	return props.editId
 		? i18n.ts.edit
 		: props.renote
-		? i18n.ts.quote
-		: props.reply
-		? i18n.ts.reply
-		: i18n.ts.note;
+		  ? i18n.ts.quote
+		  : props.reply
+		    ? i18n.ts.reply
+		    : i18n.ts.note;
 });
 
 const textLength = computed((): number => {
@@ -492,8 +489,8 @@ if (props.reply && props.reply.text != null) {
 		const mention = x.host
 			? `@${x.username}@${toASCII(x.host)}`
 			: otherHost == null || otherHost === host
-			? `@${x.username}`
-			: `@${x.username}@${toASCII(otherHost)}`;
+			  ? `@${x.username}`
+			  : `@${x.username}@${toASCII(otherHost)}`;
 
 		// 自分は除外
 		if ($i.username === x.username && (x.host == null || x.host === host))
@@ -926,8 +923,8 @@ async function post() {
 		renoteId: props.renote
 			? props.renote.id
 			: quoteId.value
-			? quoteId.value
-			: undefined,
+			  ? quoteId.value
+			  : undefined,
 		channelId: props.channel ? props.channel.id : undefined,
 		poll: poll.value,
 		cw: useCw.value ? cw.value || "" : undefined,
diff --git a/packages/client/src/components/MkPostFormAttaches.vue b/packages/client/src/components/MkPostFormAttaches.vue
index 8e6e41a279..a879bd5d8b 100644
--- a/packages/client/src/components/MkPostFormAttaches.vue
+++ b/packages/client/src/components/MkPostFormAttaches.vue
@@ -35,7 +35,6 @@ import { VueDraggable } from "vue-draggable-plus";
 import MkDriveFileThumbnail from "@/components/MkDriveFileThumbnail.vue";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
-import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
 
 const props = defineProps({
diff --git a/packages/client/src/components/MkPushNotificationAllowButton.vue b/packages/client/src/components/MkPushNotificationAllowButton.vue
index 37ba5ceef3..575983e3b7 100644
--- a/packages/client/src/components/MkPushNotificationAllowButton.vue
+++ b/packages/client/src/components/MkPushNotificationAllowButton.vue
@@ -55,7 +55,8 @@
 <script setup lang="ts">
 import { ref } from "vue";
 
-import { $i, getAccounts } from "@/account";
+import { getAccounts } from "@/account";
+import { $i } from "@/reactiveAccount";
 import MkButton from "@/components/MkButton.vue";
 import { instance } from "@/instance";
 import { api, apiWithDialog, promiseDialog } from "@/os";
diff --git a/packages/client/src/components/MkQuoteButton.vue b/packages/client/src/components/MkQuoteButton.vue
index 3832a13d33..baa09d71ec 100644
--- a/packages/client/src/components/MkQuoteButton.vue
+++ b/packages/client/src/components/MkQuoteButton.vue
@@ -14,7 +14,7 @@ import { computed } from "vue";
 import type { Note } from "firefish-js/built/entities";
 import { pleaseLogin } from "@/scripts/please-login";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/components/MkReactionIcon.vue b/packages/client/src/components/MkReactionIcon.vue
index 89e056bab2..e9d5a198cc 100644
--- a/packages/client/src/components/MkReactionIcon.vue
+++ b/packages/client/src/components/MkReactionIcon.vue
@@ -9,7 +9,7 @@
 </template>
 
 <script lang="ts" setup>
-const props = defineProps<{
+defineProps<{
 	reaction: string;
 	customEmojis?: any[]; // TODO
 	noStyle?: boolean;
diff --git a/packages/client/src/components/MkReactionTooltip.vue b/packages/client/src/components/MkReactionTooltip.vue
index b83a42ee89..0e83226c94 100644
--- a/packages/client/src/components/MkReactionTooltip.vue
+++ b/packages/client/src/components/MkReactionTooltip.vue
@@ -21,7 +21,7 @@
 import MkTooltip from "./MkTooltip.vue";
 import XReactionIcon from "@/components/MkReactionIcon.vue";
 
-const props = defineProps<{
+defineProps<{
 	reaction: string;
 	emojis: any[]; // TODO
 	targetElement: HTMLElement;
diff --git a/packages/client/src/components/MkReactionsViewer.details.vue b/packages/client/src/components/MkReactionsViewer.details.vue
index a04daf0541..0d992ae431 100644
--- a/packages/client/src/components/MkReactionsViewer.details.vue
+++ b/packages/client/src/components/MkReactionsViewer.details.vue
@@ -32,7 +32,7 @@
 import MkTooltip from "./MkTooltip.vue";
 import XReactionIcon from "@/components/MkReactionIcon.vue";
 
-const props = defineProps<{
+defineProps<{
 	reaction: string;
 	users: any[]; // TODO
 	count: number;
diff --git a/packages/client/src/components/MkReactionsViewer.reaction.vue b/packages/client/src/components/MkReactionsViewer.reaction.vue
index 9b4ce95628..5bd2a9e5dd 100644
--- a/packages/client/src/components/MkReactionsViewer.reaction.vue
+++ b/packages/client/src/components/MkReactionsViewer.reaction.vue
@@ -28,7 +28,7 @@ import XDetails from "@/components/MkReactionsViewer.details.vue";
 import XReactionIcon from "@/components/MkReactionIcon.vue";
 import * as os from "@/os";
 import { useTooltip } from "@/scripts/use-tooltip";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 const props = defineProps<{
 	reaction: string;
diff --git a/packages/client/src/components/MkReactionsViewer.vue b/packages/client/src/components/MkReactionsViewer.vue
index e0e695e3f3..dbae48b614 100644
--- a/packages/client/src/components/MkReactionsViewer.vue
+++ b/packages/client/src/components/MkReactionsViewer.vue
@@ -19,7 +19,7 @@
 <script lang="ts" setup>
 import { computed, ref } from "vue";
 import type * as firefish from "firefish-js";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import XReaction from "@/components/MkReactionsViewer.reaction.vue";
 
 const props = defineProps<{
diff --git a/packages/client/src/components/MkRenoteButton.vue b/packages/client/src/components/MkRenoteButton.vue
index 90ecb3217f..f9262ac54b 100644
--- a/packages/client/src/components/MkRenoteButton.vue
+++ b/packages/client/src/components/MkRenoteButton.vue
@@ -27,7 +27,7 @@ import Ripple from "@/components/MkRipple.vue";
 import XDetails from "@/components/MkUsersTooltip.vue";
 import { pleaseLogin } from "@/scripts/please-login";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { useTooltip } from "@/scripts/use-tooltip";
 import { i18n } from "@/i18n";
 import { defaultStore } from "@/store";
@@ -73,13 +73,16 @@ useTooltip(buttonRef, async (showing) => {
 });
 
 const hasRenotedBefore = ref(false);
-os.api("notes/renotes", {
-	noteId: props.note.id,
-	userId: $i.id,
-	limit: 1,
-}).then((res) => {
-	hasRenotedBefore.value = res.length > 0;
-});
+
+if ($i != null) {
+	os.api("notes/renotes", {
+		noteId: props.note.id,
+		userId: $i.id,
+		limit: 1,
+	}).then((res) => {
+		hasRenotedBefore.value = res.length > 0;
+	});
+}
 
 const renote = (viaKeyboard = false, ev?: MouseEvent) => {
 	pleaseLogin();
diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue
index a19d833ed6..10bcfc3bdf 100644
--- a/packages/client/src/components/MkSignin.vue
+++ b/packages/client/src/components/MkSignin.vue
@@ -128,12 +128,12 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, defineAsyncComponent, ref } from "vue";
+import { defineAsyncComponent, ref } from "vue";
 import { toUnicode } from "punycode/";
 import MkButton from "@/components/MkButton.vue";
 import MkInput from "@/components/form/input.vue";
 import MkInfo from "@/components/MkInfo.vue";
-import { apiUrl, host as configHost } from "@/config";
+import { host as configHost } from "@/config";
 import { byteify, hexify } from "@/scripts/2fa";
 import * as os from "@/os";
 import { login } from "@/account";
diff --git a/packages/client/src/components/MkSigninDialog.vue b/packages/client/src/components/MkSigninDialog.vue
index cecf605945..b0fc7700e8 100644
--- a/packages/client/src/components/MkSigninDialog.vue
+++ b/packages/client/src/components/MkSigninDialog.vue
@@ -18,7 +18,7 @@ import MkSignin from "@/components/MkSignin.vue";
 import XModalWindow from "@/components/MkModalWindow.vue";
 import { i18n } from "@/i18n";
 
-const props = withDefaults(
+withDefaults(
 	defineProps<{
 		autoSet?: boolean;
 		message?: string;
diff --git a/packages/client/src/components/MkSignup.vue b/packages/client/src/components/MkSignup.vue
index ff41c5a5d9..9340d9af92 100644
--- a/packages/client/src/components/MkSignup.vue
+++ b/packages/client/src/components/MkSignup.vue
@@ -371,10 +371,10 @@ function onChangeUsername(): void {
 		const err = !username.value.match(/^[a-zA-Z0-9_]+$/)
 			? "invalid-format"
 			: username.value.length < 1
-			? "min-range"
-			: username.value.length > 20
-			? "max-range"
-			: null;
+			  ? "min-range"
+			  : username.value.length > 20
+			    ? "max-range"
+			    : null;
 
 		if (err) {
 			usernameState.value = err;
@@ -410,16 +410,16 @@ function onChangeEmail(): void {
 			emailState.value = result.available
 				? "ok"
 				: result.reason === "used"
-				? "unavailable:used"
-				: result.reason === "format"
-				? "unavailable:format"
-				: result.reason === "disposable"
-				? "unavailable:disposable"
-				: result.reason === "mx"
-				? "unavailable:mx"
-				: result.reason === "smtp"
-				? "unavailable:smtp"
-				: "unavailable";
+				  ? "unavailable:used"
+				  : result.reason === "format"
+				    ? "unavailable:format"
+				    : result.reason === "disposable"
+				      ? "unavailable:disposable"
+				      : result.reason === "mx"
+				        ? "unavailable:mx"
+				        : result.reason === "smtp"
+				          ? "unavailable:smtp"
+				          : "unavailable";
 		})
 		.catch(() => {
 			emailState.value = "error";
diff --git a/packages/client/src/components/MkSignupDialog.vue b/packages/client/src/components/MkSignupDialog.vue
index 9024d6fc59..f9829c1040 100644
--- a/packages/client/src/components/MkSignupDialog.vue
+++ b/packages/client/src/components/MkSignupDialog.vue
@@ -26,7 +26,7 @@ import XSignup from "@/components/MkSignup.vue";
 import XModalWindow from "@/components/MkModalWindow.vue";
 import { i18n } from "@/i18n";
 
-const props = withDefaults(
+withDefaults(
 	defineProps<{
 		autoSet?: boolean;
 	}>(),
diff --git a/packages/client/src/components/MkTimeline.vue b/packages/client/src/components/MkTimeline.vue
index 864876b6cc..c310851e2e 100644
--- a/packages/client/src/components/MkTimeline.vue
+++ b/packages/client/src/components/MkTimeline.vue
@@ -33,7 +33,7 @@ import XNotes from "@/components/MkNotes.vue";
 import MkInfo from "@/components/MkInfo.vue";
 import { stream } from "@/stream";
 import * as sound from "@/scripts/sound";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
@@ -44,6 +44,7 @@ const props = defineProps<{
 	antenna?: string;
 	channel?: string;
 	sound?: boolean;
+	fileId?: string;
 }>();
 
 const queue = ref(0);
@@ -195,6 +196,11 @@ if (props.src === "antenna") {
 		channelId: props.channel,
 	});
 	connection.on("note", prepend);
+} else if (props.src === "file") {
+	endpoint = "drive/files/attached-notes";
+	query = {
+		fileId: props.fileId,
+	};
 }
 
 function closeHint() {
diff --git a/packages/client/src/components/MkTutorialDialog.vue b/packages/client/src/components/MkTutorialDialog.vue
index 767e8c3fd6..d60bf9be60 100644
--- a/packages/client/src/components/MkTutorialDialog.vue
+++ b/packages/client/src/components/MkTutorialDialog.vue
@@ -211,7 +211,7 @@ import MkPushNotificationAllowButton from "@/components/MkPushNotificationAllowB
 import FormSwitch from "@/components/form/switch.vue";
 import { defaultStore } from "@/store";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { instance } from "@/instance";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/components/MkUserList.vue b/packages/client/src/components/MkUserList.vue
index 8f5935ee48..92eb5df953 100644
--- a/packages/client/src/components/MkUserList.vue
+++ b/packages/client/src/components/MkUserList.vue
@@ -31,7 +31,7 @@ import type { Paging } from "@/components/MkPagination.vue";
 import MkPagination from "@/components/MkPagination.vue";
 import { i18n } from "@/i18n";
 
-const props = defineProps<{
+defineProps<{
 	pagination: Paging;
 	noGap?: boolean;
 }>();
diff --git a/packages/client/src/components/MkUsersTooltip.vue b/packages/client/src/components/MkUsersTooltip.vue
index dd6018cb61..25af3ac121 100644
--- a/packages/client/src/components/MkUsersTooltip.vue
+++ b/packages/client/src/components/MkUsersTooltip.vue
@@ -18,10 +18,9 @@
 </template>
 
 <script lang="ts" setup>
-import {} from "vue";
 import MkTooltip from "./MkTooltip.vue";
 
-const props = defineProps<{
+defineProps<{
 	users: any[]; // TODO
 	count: number;
 	targetElement: HTMLElement;
diff --git a/packages/client/src/components/MkVisibility.vue b/packages/client/src/components/MkVisibility.vue
index 598c0b4cb0..3d691106dc 100644
--- a/packages/client/src/components/MkVisibility.vue
+++ b/packages/client/src/components/MkVisibility.vue
@@ -17,7 +17,10 @@
 		></i>
 	</span>
 	<span v-if="note.localOnly" :class="$style.localOnly"
-		><i v-tooltip="i18n.ts._visibility.localOnly" class="ph-users ph-lg"></i
+		><i
+			v-tooltip="i18n.ts._visibility.localOnly"
+			:class="icon('ph-users')"
+		></i
 	></span>
 </template>
 
diff --git a/packages/client/src/components/MkVisibilityPicker.vue b/packages/client/src/components/MkVisibilityPicker.vue
index 3d4d762338..a3aa2647a1 100644
--- a/packages/client/src/components/MkVisibilityPicker.vue
+++ b/packages/client/src/components/MkVisibilityPicker.vue
@@ -128,7 +128,6 @@ import { nextTick, ref, shallowRef, watch } from "vue";
 import type * as firefish from "firefish-js";
 import MkModal from "@/components/MkModal.vue";
 import { i18n } from "@/i18n";
-import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
 
 const modal = shallowRef<InstanceType<typeof MkModal>>();
diff --git a/packages/client/src/components/MkWaitingDialog.vue b/packages/client/src/components/MkWaitingDialog.vue
index 944ec29374..01701755dd 100644
--- a/packages/client/src/components/MkWaitingDialog.vue
+++ b/packages/client/src/components/MkWaitingDialog.vue
@@ -14,8 +14,7 @@
 		>
 			<i
 				v-if="success"
-				:class="[$style.icon, $style.success]"
-				class="ph-check ph-lg"
+				:class="[$style.icon, $style.success, iconClass('ph-check')]"
 			></i>
 			<MkLoading
 				v-else
@@ -32,6 +31,7 @@
 <script lang="ts" setup>
 import { shallowRef, watch } from "vue";
 import MkModal from "@/components/MkModal.vue";
+import iconClass from "@/scripts/icon";
 
 const modal = shallowRef<InstanceType<typeof MkModal>>();
 
diff --git a/packages/client/src/components/form/folder.vue b/packages/client/src/components/form/folder.vue
index 9446dabe6d..c289701d83 100644
--- a/packages/client/src/components/form/folder.vue
+++ b/packages/client/src/components/form/folder.vue
@@ -18,11 +18,14 @@
 </template>
 
 <script lang="ts" setup>
+import { ref } from "vue";
 import icon from "@/scripts/icon";
 
-defineProps<{
+const props = defineProps<{
 	defaultOpen: boolean;
 }>();
+
+const opened = ref(props.defaultOpen);
 </script>
 
 <style lang="scss" scoped>
diff --git a/packages/client/src/components/form/suspense.vue b/packages/client/src/components/form/suspense.vue
index d8965f13ff..543e8e09bf 100644
--- a/packages/client/src/components/form/suspense.vue
+++ b/packages/client/src/components/form/suspense.vue
@@ -12,11 +12,11 @@
 		<div v-else>
 			<div class="wszdbhzo">
 				<div>
-					<i :class="icon('ph-warning')"></i>
+					<i :class="iconClass('ph-warning')"></i>
 					{{ i18n.ts.somethingHappened }}
 				</div>
-				<MkButton inline class="retry" @click="retry"
-					><i :class="icon('ph-arrow-clockwise')"></i>
+				<MkButton inline class="retry" @click="retry">
+					<i :class="iconClass('ph-arrow-clockwise')"></i>
 					{{ i18n.ts.retry }}</MkButton
 				>
 			</div>
@@ -30,7 +30,7 @@ import { defineComponent, ref, watch } from "vue";
 import MkButton from "@/components/MkButton.vue";
 import { i18n } from "@/i18n";
 import { defaultStore } from "@/store";
-import icon from "@/scripts/icon";
+import iconClass from "@/scripts/icon";
 
 export default defineComponent({
 	components: {
@@ -90,6 +90,8 @@ export default defineComponent({
 			result,
 			retry,
 			i18n,
+			defaultStore,
+			iconClass,
 		};
 	},
 });
diff --git a/packages/client/src/components/form/textarea.vue b/packages/client/src/components/form/textarea.vue
index 4c00311942..23197e1d71 100644
--- a/packages/client/src/components/form/textarea.vue
+++ b/packages/client/src/components/form/textarea.vue
@@ -32,9 +32,7 @@
 			class="save"
 			@click="updated"
 		>
-			<!-- FIXME: icon function doesn't work here -->
-			<!-- <i :class="icon('ph-floppy-disk-back')"></i> -->
-			<i class="ph-floppy-disk-back ph-bold ph-lg"></i>
+			<i :class="icon('ph-floppy-disk-back')"></i>
 			{{ i18n.ts.save }}</MkButton
 		>
 	</div>
@@ -53,7 +51,7 @@ import {
 import { debounce } from "throttle-debounce";
 import MkButton from "@/components/MkButton.vue";
 import { i18n } from "@/i18n";
-// import icon from "@/scripts/icon";
+import icon from "@/scripts/icon";
 
 export default defineComponent({
 	components: {
@@ -192,6 +190,7 @@ export default defineComponent({
 			onKeydown,
 			updated,
 			i18n,
+			icon,
 		};
 	},
 });
diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue
index 78abe21b3e..c68c2695fd 100644
--- a/packages/client/src/components/global/MkPageHeader.vue
+++ b/packages/client/src/components/global/MkPageHeader.vue
@@ -43,7 +43,7 @@
 				<i
 					v-else-if="metadata.icon && !narrow"
 					class="icon"
-					:class="metadata.icon"
+					:class="icon(metadata.icon)"
 				></i>
 
 				<div class="title">
@@ -138,7 +138,8 @@ import MkFollowButton from "@/components/MkFollowButton.vue";
 import { popupMenu } from "@/os";
 import { scrollToTop } from "@/scripts/scroll";
 import { injectPageMetadata } from "@/scripts/page-metadata";
-import { $i, openAccountMenu as openAccountMenu_ } from "@/account";
+import { openAccountMenu as openAccountMenu_ } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/components/global/MkTime.vue b/packages/client/src/components/global/MkTime.vue
index 8e25b6d78a..e235684584 100644
--- a/packages/client/src/components/global/MkTime.vue
+++ b/packages/client/src/components/global/MkTime.vue
@@ -29,11 +29,11 @@ const _time =
 	props.time == null
 		? NaN
 		: typeof props.time === "number"
-		? props.time
-		: (props.time instanceof Date
-				? props.time
-				: new Date(props.time)
-		  ).getTime();
+		  ? props.time
+		  : (props.time instanceof Date
+					? props.time
+					: new Date(props.time)
+		    ).getTime();
 const invalid = Number.isNaN(_time);
 const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid;
 
@@ -46,20 +46,30 @@ const relative = computed<string>(() => {
 	return ago >= 31536000
 		? i18n.t("_ago.yearsAgo", { n: Math.floor(ago / 31536000).toString() })
 		: ago >= 2592000
-		? i18n.t("_ago.monthsAgo", { n: Math.floor(ago / 2592000).toString() })
-		: ago >= 604800
-		? i18n.t("_ago.weeksAgo", { n: Math.floor(ago / 604800).toString() })
-		: ago >= 86400
-		? i18n.t("_ago.daysAgo", { n: Math.floor(ago / 86400).toString() })
-		: ago >= 3600
-		? i18n.t("_ago.hoursAgo", { n: Math.floor(ago / 3600).toString() })
-		: ago >= 60
-		? i18n.t("_ago.minutesAgo", { n: (~~(ago / 60)).toString() })
-		: ago >= 10
-		? i18n.t("_ago.secondsAgo", { n: (~~(ago % 60)).toString() })
-		: ago >= -1
-		? i18n.ts._ago.justNow
-		: i18n.ts._ago.future;
+		  ? i18n.t("_ago.monthsAgo", {
+					n: Math.floor(ago / 2592000).toString(),
+		    })
+		  : ago >= 604800
+		    ? i18n.t("_ago.weeksAgo", {
+						n: Math.floor(ago / 604800).toString(),
+		      })
+		    : ago >= 86400
+		      ? i18n.t("_ago.daysAgo", {
+							n: Math.floor(ago / 86400).toString(),
+		        })
+		      : ago >= 3600
+		        ? i18n.t("_ago.hoursAgo", {
+								n: Math.floor(ago / 3600).toString(),
+		          })
+		        : ago >= 60
+		          ? i18n.t("_ago.minutesAgo", { n: (~~(ago / 60)).toString() })
+		          : ago >= 10
+		            ? i18n.t("_ago.secondsAgo", {
+										n: (~~(ago % 60)).toString(),
+		              })
+		            : ago >= -1
+		              ? i18n.ts._ago.justNow
+		              : i18n.ts._ago.future;
 });
 
 let tickId: number;
diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts
index cfdbd8a23c..5dbf710118 100644
--- a/packages/client/src/components/mfm.ts
+++ b/packages/client/src/components/mfm.ts
@@ -264,7 +264,7 @@ export default defineComponent({
 										: token.props.args.y
 										? "perspective(128px) rotateY"
 										: "rotate";
-									const degrees = parseInt(token.props.args.deg) || "90";
+									const degrees = parseFloat(token.props.args.deg ?? "90");
 									style = `transform: ${rotate}(${degrees}deg); transform-origin: center center;`;
 									break;
 								}
diff --git a/packages/client/src/components/page/page.post.vue b/packages/client/src/components/page/page.post.vue
index 7366d2c4a0..1910e8431e 100644
--- a/packages/client/src/components/page/page.post.vue
+++ b/packages/client/src/components/page/page.post.vue
@@ -44,6 +44,7 @@ export default defineComponent({
 			text: this.hpml.interpolate(this.block.text),
 			posted: false,
 			posting: false,
+			icon,
 		};
 	},
 	watch: {
diff --git a/packages/client/src/components/page/page.vue b/packages/client/src/components/page/page.vue
index 4041b0e6fd..e43af6add6 100644
--- a/packages/client/src/components/page/page.vue
+++ b/packages/client/src/components/page/page.vue
@@ -17,11 +17,11 @@
 <script lang="ts">
 import type { PropType } from "vue";
 import { defineComponent, nextTick, onMounted, onUnmounted } from "vue";
-import { parse } from "@syuilo/aiscript";
+import { Parser } from "@syuilo/aiscript";
 import XBlock from "./page.block.vue";
 import { Hpml } from "@/scripts/hpml/evaluator";
 import { url } from "@/config";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { defaultStore } from "@/store";
 
 export default defineComponent({
@@ -42,12 +42,14 @@ export default defineComponent({
 			enableAiScript: !defaultStore.state.disablePagesScript,
 		});
 
+		const parser = new Parser();
+
 		onMounted(() => {
 			nextTick(() => {
 				if (props.page.script && hpml.aiscript) {
 					let ast;
 					try {
-						ast = parse(props.page.script);
+						ast = parser.parse(props.page.script);
 					} catch (err) {
 						console.error(err);
 						/* os.alert({
diff --git a/packages/client/src/config.ts b/packages/client/src/config.ts
index 0b346d1dd6..e77ee87e85 100644
--- a/packages/client/src/config.ts
+++ b/packages/client/src/config.ts
@@ -12,7 +12,7 @@ export const wsUrl = `${url
 	.replace("https://", "wss://")}/streaming`;
 export const lang = localStorage.getItem("lang");
 export const langs = _LANGS_;
-export const locale = JSON.parse(localStorage.getItem("locale"));
+export const locale = JSON.parse(localStorage.getItem("locale") || "en-US");
 export const version = _VERSION_;
 export const instanceName = siteName === "Firefish" ? host : siteName;
 export const ui = localStorage.getItem("ui");
diff --git a/packages/client/src/directives/focus.ts b/packages/client/src/directives/focus.ts
index 36b2c2d714..6ad6e485a0 100644
--- a/packages/client/src/directives/focus.ts
+++ b/packages/client/src/directives/focus.ts
@@ -1,3 +1,3 @@
 export default {
-	mounted: (el) => el.focus(),
+	mounted: (el: HTMLElement) => el.focus(),
 };
diff --git a/packages/client/src/directives/hotkey.ts b/packages/client/src/directives/hotkey.ts
index 9e89c271dc..9e148cc0a7 100644
--- a/packages/client/src/directives/hotkey.ts
+++ b/packages/client/src/directives/hotkey.ts
@@ -1,5 +1,5 @@
 import type { Directive } from "vue";
-import { makeHotkey } from "../scripts/hotkey";
+import { makeHotkey } from "@/scripts/hotkey";
 
 export default {
 	mounted(el, binding) {
diff --git a/packages/client/src/directives/ripple.ts b/packages/client/src/directives/ripple.ts
index 395f1a0779..bf364d1268 100644
--- a/packages/client/src/directives/ripple.ts
+++ b/packages/client/src/directives/ripple.ts
@@ -1,8 +1,9 @@
+import type { Ref } from "vue";
 import Ripple from "@/components/MkRipple.vue";
 import { popup } from "@/os";
 
 export default {
-	mounted(el, binding, vn) {
+	mounted(el: HTMLElement, binding: Ref<boolean>) {
 		// 明示的に false であればバインドしない
 		if (binding.value === false) return;
 
diff --git a/packages/client/src/directives/vibrate.ts b/packages/client/src/directives/vibrate.ts
index 15ec8bc5bc..45bb6e7664 100644
--- a/packages/client/src/directives/vibrate.ts
+++ b/packages/client/src/directives/vibrate.ts
@@ -1,5 +1,5 @@
 import type { Directive } from "vue";
-import { vibrate } from "../scripts/vibrate";
+import { vibrate } from "@/scripts/vibrate";
 
 export default {
 	mounted(el, binding) {
diff --git a/packages/client/src/filters/note.ts b/packages/client/src/filters/note.ts
index 5677f6bb0d..3f7294634e 100644
--- a/packages/client/src/filters/note.ts
+++ b/packages/client/src/filters/note.ts
@@ -1,3 +1,5 @@
-export const notePage = (note) => {
+import type { entities } from "firefish-js";
+
+export const notePage = (note: entities.Note) => {
 	return `/notes/${note.id}`;
 };
diff --git a/packages/client/src/filters/number.ts b/packages/client/src/filters/number.ts
index 35e10fcbc2..dae49a0e59 100644
--- a/packages/client/src/filters/number.ts
+++ b/packages/client/src/filters/number.ts
@@ -1 +1 @@
-export default (n) => (n == null ? "N/A" : n.toLocaleString());
+export default (n?: number) => (n == null ? "N/A" : n.toLocaleString());
diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts
index ddcdfc207c..b758b4c99e 100644
--- a/packages/client/src/init.ts
+++ b/packages/client/src/init.ts
@@ -7,14 +7,13 @@ import "vite/modulepreload-polyfill";
 
 import "@/style.scss";
 
-import "@phosphor-icons/web/fill";
 import "@phosphor-icons/web/bold";
-import "@phosphor-icons/web/regular";
-import "@phosphor-icons/web/light";
 import "@phosphor-icons/web/duotone";
+import "@phosphor-icons/web/fill";
+import "@phosphor-icons/web/light";
+import "@phosphor-icons/web/regular";
 
 // #region account indexedDB migration
-import { set } from "@/scripts/idb-proxy";
 
 const accounts = localStorage.getItem("accounts");
 if (accounts) {
@@ -23,6 +22,7 @@ if (accounts) {
 }
 // #endregion
 
+import { compareVersions } from "compare-versions";
 import {
 	computed,
 	createApp,
@@ -31,29 +31,30 @@ import {
 	version as vueVersion,
 	watch,
 } from "vue";
-import { compareVersions } from "compare-versions";
+import { set } from "@/scripts/idb-proxy";
 
-import widgets from "@/widgets";
-import directives from "@/directives";
+import { login, refreshAccount, signout, updateAccount } from "@/account";
 import components from "@/components";
-import { host, lang, ui, version } from "@/config";
-import { applyTheme } from "@/scripts/theme";
-import { isDeviceDarkmode } from "@/scripts/is-device-darkmode";
+import { lang, ui, version } from "@/config";
+import directives from "@/directives";
 import { i18n } from "@/i18n";
-import { alert, api, confirm, popup, post, toast } from "@/os";
-import { stream } from "@/stream";
-import * as sound from "@/scripts/sound";
-import { $i, login, refreshAccount, signout, updateAccount } from "@/account";
-import { ColdDeviceStorage, defaultStore } from "@/store";
 import { fetchInstance, instance } from "@/instance";
-import { makeHotkey } from "@/scripts/hotkey";
-import { search } from "@/scripts/search";
+import { alert, api, confirm, popup, post, toast } from "@/os";
+import { $i } from "@/reactiveAccount";
 import { deviceKind } from "@/scripts/device-kind";
-import { initializeSw } from "@/scripts/initialize-sw";
-import { reloadChannel } from "@/scripts/unison-reload";
-import { reactionPicker } from "@/scripts/reaction-picker";
-import { getUrlWithoutLoginId } from "@/scripts/login-id";
 import { getAccountFromId } from "@/scripts/get-account-from-id";
+import { makeHotkey } from "@/scripts/hotkey";
+import { initializeSw } from "@/scripts/initialize-sw";
+import { isDeviceDarkmode } from "@/scripts/is-device-darkmode";
+import { getUrlWithoutLoginId } from "@/scripts/login-id";
+import { reactionPicker } from "@/scripts/reaction-picker";
+import { search } from "@/scripts/search";
+import * as sound from "@/scripts/sound";
+import { applyTheme } from "@/scripts/theme";
+import { reloadChannel } from "@/scripts/unison-reload";
+import { ColdDeviceStorage, defaultStore } from "@/store";
+import { stream } from "@/stream";
+import widgets from "@/widgets";
 
 function checkForSplash() {
 	const splash = document.getElementById("splash");
diff --git a/packages/client/src/instance.ts b/packages/client/src/instance.ts
index 783cb01ad6..493baeb94b 100644
--- a/packages/client/src/instance.ts
+++ b/packages/client/src/instance.ts
@@ -1,5 +1,5 @@
-import { computed, reactive } from "vue";
 import type * as firefish from "firefish-js";
+import { computed, reactive } from "vue";
 import { api } from "./os";
 
 // TODO: 他のタブと永続化されたstateを同期
diff --git a/packages/client/src/navbar.ts b/packages/client/src/navbar.ts
index c2ab1d4d1f..55cfab5bba 100644
--- a/packages/client/src/navbar.ts
+++ b/packages/client/src/navbar.ts
@@ -1,11 +1,11 @@
 import { computed, reactive } from "vue";
-import { $i } from "./account";
-import { search } from "@/scripts/search";
-import * as os from "@/os";
-import { i18n } from "@/i18n";
 import { ui } from "@/config";
-import { unisonReload } from "@/scripts/unison-reload";
+import { i18n } from "@/i18n";
+import * as os from "@/os";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
+import { search } from "@/scripts/search";
+import { unisonReload } from "@/scripts/unison-reload";
 
 export const navbarItemDef = reactive({
 	notifications: {
diff --git a/packages/client/src/nirax.ts b/packages/client/src/nirax.ts
index 43e770ec33..800d47042c 100644
--- a/packages/client/src/nirax.ts
+++ b/packages/client/src/nirax.ts
@@ -2,9 +2,9 @@
 
 import { EventEmitter } from "eventemitter3";
 import type { Component, ShallowRef } from "vue";
-import { Ref, ref, shallowRef } from "vue";
-import { pleaseLogin } from "@/scripts/please-login";
+import { shallowRef } from "vue";
 import { safeURIDecode } from "@/scripts/safe-uri-decode";
+import { pleaseLogin } from "@/scripts/please-login";
 
 interface RouteDef {
 	path: string;
@@ -112,7 +112,7 @@ export class Router extends EventEmitter<{
 				let parts = [..._parts];
 				const props = new Map<string, string>();
 
-				pathMatchLoop: for (const p of parsePath(route.path)) {
+				for (const p of parsePath(route.path)) {
 					if (typeof p === "string") {
 						if (p === parts[0]) {
 							parts.shift();
@@ -128,7 +128,7 @@ export class Router extends EventEmitter<{
 								props.set(p.name, safeURIDecode(parts.join("/")));
 								parts = [];
 							}
-							break pathMatchLoop;
+							break;
 						} else {
 							if (p.startsWith) {
 								if (parts[0] == null || !parts[0].startsWith(p.startsWith))
@@ -159,7 +159,7 @@ export class Router extends EventEmitter<{
 								child,
 							};
 						} else {
-							continue forEachRouteLoop;
+							continue;
 						}
 					}
 
diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts
index 7a78e95530..d367dc2fc9 100644
--- a/packages/client/src/os.ts
+++ b/packages/client/src/os.ts
@@ -1,18 +1,18 @@
 // TODO: なんでもかんでもos.tsに突っ込むのやめたいのでよしなに分割する
 
+import { EventEmitter } from "eventemitter3";
+import * as firefish from "firefish-js";
+import insertTextAtCursor from "insert-text-at-cursor";
 import type { Component, Ref } from "vue";
 import { defineAsyncComponent, markRaw, ref } from "vue";
-import { EventEmitter } from "eventemitter3";
-import insertTextAtCursor from "insert-text-at-cursor";
-import * as firefish from "firefish-js";
 import { i18n } from "./i18n";
-import { apiUrl, url } from "@/config";
-import MkPostFormDialog from "@/components/MkPostFormDialog.vue";
-import MkWaitingDialog from "@/components/MkWaitingDialog.vue";
-import MkToast from "@/components/MkToast.vue";
 import MkDialog from "@/components/MkDialog.vue";
+import MkPostFormDialog from "@/components/MkPostFormDialog.vue";
+import MkToast from "@/components/MkToast.vue";
+import MkWaitingDialog from "@/components/MkWaitingDialog.vue";
+import { apiUrl, url } from "@/config";
+import { $i } from "@/reactiveAccount";
 import type { MenuItem } from "@/types/menu";
-import { $i } from "@/account";
 
 export const pendingApiRequestsCount = ref(0);
 
@@ -24,7 +24,7 @@ export const api = ((
 	endpoint: string,
 	data: Record<string, any> = {},
 	token?: string | null | undefined,
-	useToken: boolean = true,
+	useToken = true,
 ) => {
 	pendingApiRequestsCount.value++;
 
diff --git a/packages/client/src/pages/_empty_.vue b/packages/client/src/pages/_empty_.vue
index 3892edbd3d..ee9bc3ac72 100644
--- a/packages/client/src/pages/_empty_.vue
+++ b/packages/client/src/pages/_empty_.vue
@@ -1,5 +1,3 @@
 <template>
 	<div></div>
 </template>
-
-<script lang="ts" setup></script>
diff --git a/packages/client/src/pages/_loading_.vue b/packages/client/src/pages/_loading_.vue
index 832c05916c..93bb8bb2fb 100644
--- a/packages/client/src/pages/_loading_.vue
+++ b/packages/client/src/pages/_loading_.vue
@@ -1,5 +1,3 @@
 <template>
 	<MkLoading />
 </template>
-
-<script lang="ts" setup></script>
diff --git a/packages/client/src/pages/about.federation.vue b/packages/client/src/pages/about.federation.vue
index 163166a382..d2d00dce27 100644
--- a/packages/client/src/pages/about.federation.vue
+++ b/packages/client/src/pages/about.federation.vue
@@ -127,18 +127,18 @@ const pagination = {
 		...(state.value === "federating"
 			? { federating: true }
 			: state.value === "subscribing"
-			? { subscribing: true }
-			: state.value === "publishing"
-			? { publishing: true }
-			: state.value === "suspended"
-			? { suspended: true }
-			: state.value === "blocked"
-			? { blocked: true }
-			: state.value === "silenced"
-			? { silenced: true }
-			: state.value === "notResponding"
-			? { notResponding: true }
-			: {}),
+			  ? { subscribing: true }
+			  : state.value === "publishing"
+			    ? { publishing: true }
+			    : state.value === "suspended"
+			      ? { suspended: true }
+			      : state.value === "blocked"
+			        ? { blocked: true }
+			        : state.value === "silenced"
+			          ? { silenced: true }
+			          : state.value === "notResponding"
+			            ? { notResponding: true }
+			            : {}),
 	})),
 };
 
diff --git a/packages/client/src/pages/admin/_header_.vue b/packages/client/src/pages/admin/_header_.vue
index 0192a48c0d..7b0b627087 100644
--- a/packages/client/src/pages/admin/_header_.vue
+++ b/packages/client/src/pages/admin/_header_.vue
@@ -2,7 +2,11 @@
 	<div ref="el" class="fdidabkc" :style="{ background: bg }" @click="onClick">
 		<template v-if="metadata">
 			<div class="titleContainer" @click="showTabsPopup">
-				<i v-if="metadata.icon" class="icon" :class="metadata.icon"></i>
+				<i
+					v-if="metadata.icon"
+					class="icon"
+					:class="icon(metadata.icon)"
+				></i>
 
 				<div class="title">
 					<div class="title">{{ metadata.title }}</div>
@@ -63,6 +67,7 @@ import { scrollToTop } from "@/scripts/scroll";
 import MkButton from "@/components/MkButton.vue";
 import { globalEvents } from "@/events";
 import { injectPageMetadata } from "@/scripts/page-metadata";
+import icon from "@/scripts/icon";
 
 interface Tab {
 	key?: string | null;
diff --git a/packages/client/src/pages/admin/bot-protection.vue b/packages/client/src/pages/admin/bot-protection.vue
index 54d1b2ae11..0114aa3993 100644
--- a/packages/client/src/pages/admin/bot-protection.vue
+++ b/packages/client/src/pages/admin/bot-protection.vue
@@ -105,8 +105,8 @@ async function init() {
 	provider.value = meta.enableHcaptcha
 		? "hcaptcha"
 		: meta.enableRecaptcha
-		? "recaptcha"
-		: null;
+		  ? "recaptcha"
+		  : null;
 }
 
 function save() {
diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue
index f4c5490420..009a6ba6e2 100644
--- a/packages/client/src/pages/admin/index.vue
+++ b/packages/client/src/pages/admin/index.vue
@@ -73,7 +73,7 @@ import MkSuperMenu from "@/components/MkSuperMenu.vue";
 import MkInfo from "@/components/MkInfo.vue";
 import { instance } from "@/instance";
 import { version } from "@/config";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import * as os from "@/os";
 import { lookupUser } from "@/scripts/lookup-user";
 import { lookupFile } from "@/scripts/lookup-file";
diff --git a/packages/client/src/pages/admin/overview.queue.chart.vue b/packages/client/src/pages/admin/overview.queue.chart.vue
index 2e9195e205..6482d99db7 100644
--- a/packages/client/src/pages/admin/overview.queue.chart.vue
+++ b/packages/client/src/pages/admin/overview.queue.chart.vue
@@ -51,23 +51,23 @@ const label =
 	props.type === "process"
 		? "Process"
 		: props.type === "active"
-		? "Active"
-		: props.type === "delayed"
-		? "Delayed"
-		: props.type === "waiting"
-		? "Waiting"
-		: ("?" as never);
+		  ? "Active"
+		  : props.type === "delayed"
+		    ? "Delayed"
+		    : props.type === "waiting"
+		      ? "Waiting"
+		      : ("?" as never);
 
 const color =
 	props.type === "process"
 		? "#c4a7e7"
 		: props.type === "active"
-		? "#31748f"
-		: props.type === "delayed"
-		? "#eb6f92"
-		: props.type === "waiting"
-		? "#f6c177"
-		: ("?" as never);
+		  ? "#31748f"
+		  : props.type === "delayed"
+		    ? "#eb6f92"
+		    : props.type === "waiting"
+		      ? "#f6c177"
+		      : ("?" as never);
 
 onMounted(() => {
 	const vLineColor = defaultStore.state.darkMode
diff --git a/packages/client/src/pages/admin/queue.chart.chart.vue b/packages/client/src/pages/admin/queue.chart.chart.vue
index bd7b781cbb..fd3edea98d 100644
--- a/packages/client/src/pages/admin/queue.chart.chart.vue
+++ b/packages/client/src/pages/admin/queue.chart.chart.vue
@@ -96,23 +96,23 @@ const label =
 	props.type === "process"
 		? "Process"
 		: props.type === "active"
-		? "Active"
-		: props.type === "delayed"
-		? "Delayed"
-		: props.type === "waiting"
-		? "Waiting"
-		: ("?" as never);
+		  ? "Active"
+		  : props.type === "delayed"
+		    ? "Delayed"
+		    : props.type === "waiting"
+		      ? "Waiting"
+		      : ("?" as never);
 
 const color =
 	props.type === "process"
 		? "#9ccfd8"
 		: props.type === "active"
-		? "#31748f"
-		: props.type === "delayed"
-		? "#eb6f92"
-		: props.type === "waiting"
-		? "#f6c177"
-		: ("?" as never);
+		  ? "#31748f"
+		  : props.type === "delayed"
+		    ? "#eb6f92"
+		    : props.type === "waiting"
+		      ? "#f6c177"
+		      : ("?" as never);
 
 onMounted(() => {
 	chartInstance = new Chart(chartEl.value, {
diff --git a/packages/client/src/pages/admin/queue.chart.vue b/packages/client/src/pages/admin/queue.chart.vue
index fad0deb6ca..cb10e27e7f 100644
--- a/packages/client/src/pages/admin/queue.chart.vue
+++ b/packages/client/src/pages/admin/queue.chart.vue
@@ -117,8 +117,8 @@ onMounted(() => {
 		props.domain === "inbox"
 			? "admin/queue/inbox-delayed"
 			: props.domain === "deliver"
-			? "admin/queue/deliver-delayed"
-			: null,
+			  ? "admin/queue/deliver-delayed"
+			  : null,
 		{},
 	).then((result) => {
 		jobs.value = result;
diff --git a/packages/client/src/pages/admin/security.vue b/packages/client/src/pages/admin/security.vue
index dd8eff4fe4..7522b53d8a 100644
--- a/packages/client/src/pages/admin/security.vue
+++ b/packages/client/src/pages/admin/security.vue
@@ -290,14 +290,14 @@ async function init() {
 		meta.sensitiveMediaDetectionSensitivity === "veryLow"
 			? 0
 			: meta.sensitiveMediaDetectionSensitivity === "low"
-			? 1
-			: meta.sensitiveMediaDetectionSensitivity === "medium"
-			? 2
-			: meta.sensitiveMediaDetectionSensitivity === "high"
-			? 3
-			: meta.sensitiveMediaDetectionSensitivity === "veryHigh"
-			? 4
-			: 0;
+			  ? 1
+			  : meta.sensitiveMediaDetectionSensitivity === "medium"
+			    ? 2
+			    : meta.sensitiveMediaDetectionSensitivity === "high"
+			      ? 3
+			      : meta.sensitiveMediaDetectionSensitivity === "veryHigh"
+			        ? 4
+			        : 0;
 	setSensitiveFlagAutomatically.value = meta.setSensitiveFlagAutomatically;
 	enableSensitiveMediaDetectionForVideos.value =
 		meta.enableSensitiveMediaDetectionForVideos;
@@ -317,14 +317,14 @@ function save() {
 			sensitiveMediaDetectionSensitivity.value === 0
 				? "veryLow"
 				: sensitiveMediaDetectionSensitivity.value === 1
-				? "low"
-				: sensitiveMediaDetectionSensitivity.value === 2
-				? "medium"
-				: sensitiveMediaDetectionSensitivity.value === 3
-				? "high"
-				: sensitiveMediaDetectionSensitivity.value === 4
-				? "veryHigh"
-				: 0,
+				  ? "low"
+				  : sensitiveMediaDetectionSensitivity.value === 2
+				    ? "medium"
+				    : sensitiveMediaDetectionSensitivity.value === 3
+				      ? "high"
+				      : sensitiveMediaDetectionSensitivity.value === 4
+				        ? "veryHigh"
+				        : 0,
 		setSensitiveFlagAutomatically: setSensitiveFlagAutomatically.value,
 		enableSensitiveMediaDetectionForVideos:
 			enableSensitiveMediaDetectionForVideos.value,
diff --git a/packages/client/src/pages/api-console.vue b/packages/client/src/pages/api-console.vue
index 63957c115f..083db86ce0 100644
--- a/packages/client/src/pages/api-console.vue
+++ b/packages/client/src/pages/api-console.vue
@@ -98,14 +98,14 @@ function onEndpointChange() {
 				p.type === "String"
 					? ""
 					: p.type === "Number"
-					? 0
-					: p.type === "Boolean"
-					? false
-					: p.type === "Array"
-					? []
-					: p.type === "Object"
-					? {}
-					: null;
+					  ? 0
+					  : p.type === "Boolean"
+					    ? false
+					    : p.type === "Array"
+					      ? []
+					      : p.type === "Object"
+					        ? {}
+					        : null;
 		}
 		body.value = JSON5.stringify(endpointBody, null, 2);
 	});
diff --git a/packages/client/src/pages/attached-files.vue b/packages/client/src/pages/attached-files.vue
new file mode 100644
index 0000000000..91528b981a
--- /dev/null
+++ b/packages/client/src/pages/attached-files.vue
@@ -0,0 +1,39 @@
+<template>
+	<MkStickyContainer>
+		<template #header
+			><MkPageHeader :display-back-button="true"
+		/></template>
+		<MkSpacer :content-max="800">
+			<div class="attachments-timeline">
+				<XTimeline ref="tl" class="tl" src="file" :file-id="fileId" />
+			</div>
+		</MkSpacer>
+	</MkStickyContainer>
+</template>
+
+<script lang="ts" setup>
+import { computed } from "vue";
+import XTimeline from "@/components/MkTimeline.vue";
+import { i18n } from "@/i18n";
+import { definePageMetadata } from "@/scripts/page-metadata";
+import icon from "@/scripts/icon";
+
+defineProps<{
+	fileId: string;
+}>();
+
+definePageMetadata(
+	computed(() => ({
+		title: i18n.ts.attachedToNotes,
+		icon: `${icon("ph-paperclip")}`,
+	})),
+);
+</script>
+
+<style lang="scss" scoped>
+.attachments-timeline {
+	background: var(--bg);
+	border-radius: var(--radius);
+	overflow: clip;
+}
+</style>
diff --git a/packages/client/src/pages/auth.vue b/packages/client/src/pages/auth.vue
index 0c0f52d75b..5762fd9613 100644
--- a/packages/client/src/pages/auth.vue
+++ b/packages/client/src/pages/auth.vue
@@ -51,7 +51,8 @@ import XForm from "./auth.form.vue";
 import MkSignin from "@/components/MkSignin.vue";
 import MkKeyValue from "@/components/MkKeyValue.vue";
 import * as os from "@/os";
-import { $i, login } from "@/account";
+import { login } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 
 const props = defineProps<{
diff --git a/packages/client/src/pages/channel.vue b/packages/client/src/pages/channel.vue
index e84b0e1d45..f141cc6fa8 100644
--- a/packages/client/src/pages/channel.vue
+++ b/packages/client/src/pages/channel.vue
@@ -103,7 +103,7 @@ import XTimeline from "@/components/MkTimeline.vue";
 import XChannelFollowButton from "@/components/MkChannelFollowButton.vue";
 import * as os from "@/os";
 import { useRouter } from "@/router";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/clip.vue b/packages/client/src/pages/clip.vue
index 7d8a2c27b3..033864e1d6 100644
--- a/packages/client/src/pages/clip.vue
+++ b/packages/client/src/pages/clip.vue
@@ -31,7 +31,7 @@
 import { computed, provide, ref, watch } from "vue";
 import type * as firefish from "firefish-js";
 import XNotes from "@/components/MkNotes.vue";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import * as os from "@/os";
 import { definePageMetadata } from "@/scripts/page-metadata";
diff --git a/packages/client/src/pages/explore.users.vue b/packages/client/src/pages/explore.users.vue
index 89dd1efdf6..9f3a4391d8 100644
--- a/packages/client/src/pages/explore.users.vue
+++ b/packages/client/src/pages/explore.users.vue
@@ -146,7 +146,7 @@ import MkFolder from "@/components/MkFolder.vue";
 import MkTab from "@/components/MkTab.vue";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const props = defineProps<{
diff --git a/packages/client/src/pages/follow-requests.vue b/packages/client/src/pages/follow-requests.vue
index 68d0ce78c0..a3282a7ea9 100644
--- a/packages/client/src/pages/follow-requests.vue
+++ b/packages/client/src/pages/follow-requests.vue
@@ -88,7 +88,7 @@ import { acct, userPage } from "@/filters/user";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const paginationComponent = ref<InstanceType<typeof MkPagination>>();
diff --git a/packages/client/src/pages/messaging/index.vue b/packages/client/src/pages/messaging/index.vue
index 1649a6c311..6892a24c39 100644
--- a/packages/client/src/pages/messaging/index.vue
+++ b/packages/client/src/pages/messaging/index.vue
@@ -100,7 +100,7 @@ import { stream } from "@/stream";
 import { useRouter } from "@/router";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { deviceKind } from "@/scripts/device-kind";
 import { defaultStore } from "@/store";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/messaging/messaging-room.message.vue b/packages/client/src/pages/messaging/messaging-room.message.vue
index 6094d2b4b1..f1ce1baf71 100644
--- a/packages/client/src/pages/messaging/messaging-room.message.vue
+++ b/packages/client/src/pages/messaging/messaging-room.message.vue
@@ -90,7 +90,7 @@ import XMediaList from "@/components/MkMediaList.vue";
 import { extractUrlFromMfm } from "@/scripts/extract-url-from-mfm";
 import MkUrlPreview from "@/components/MkUrlPreview.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/pages/messaging/messaging-room.vue b/packages/client/src/pages/messaging/messaging-room.vue
index 6655c5be8d..336996df92 100644
--- a/packages/client/src/pages/messaging/messaging-room.vue
+++ b/packages/client/src/pages/messaging/messaging-room.vue
@@ -122,7 +122,7 @@ import { stream } from "@/stream";
 import * as sound from "@/scripts/sound";
 import { vibrate } from "@/scripts/vibrate";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { defaultStore } from "@/store";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue
index 9d1e3fe6bf..34dd7825b9 100644
--- a/packages/client/src/pages/miauth.vue
+++ b/packages/client/src/pages/miauth.vue
@@ -82,7 +82,8 @@ import { ref } from "vue";
 import MkSignin from "@/components/MkSignin.vue";
 import MkButton from "@/components/MkButton.vue";
 import * as os from "@/os";
-import { $i, login } from "@/account";
+import { login } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { appendQuery, query } from "@/scripts/url";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/page-editor/page-editor.container.vue b/packages/client/src/pages/page-editor/page-editor.container.vue
index 18ac745831..f769fc211c 100644
--- a/packages/client/src/pages/page-editor/page-editor.container.vue
+++ b/packages/client/src/pages/page-editor/page-editor.container.vue
@@ -75,6 +75,7 @@ export default defineComponent({
 		return {
 			showBody: this.expanded,
 			i18n,
+			icon,
 		};
 	},
 	methods: {
diff --git a/packages/client/src/pages/page-editor/page-editor.script-block.vue b/packages/client/src/pages/page-editor/page-editor.script-block.vue
index 918de6e13e..e271fcf795 100644
--- a/packages/client/src/pages/page-editor/page-editor.script-block.vue
+++ b/packages/client/src/pages/page-editor/page-editor.script-block.vue
@@ -17,7 +17,7 @@
 		>
 		<template #func>
 			<button class="_button" @click="changeType()">
-				<i :class="icon('ph-pencil')"></i>
+				<i :class="iconClass('ph-pencil')"></i>
 			</button>
 		</template>
 
@@ -158,7 +158,7 @@ import * as os from "@/os";
 import { isLiteralValue } from "@/scripts/hpml/expr";
 import { funcDefs } from "@/scripts/hpml/lib";
 import { i18n } from "@/i18n";
-import icon from "@/scripts/icon";
+import iconClass from "@/scripts/icon";
 
 export default defineComponent({
 	components: {
@@ -207,6 +207,7 @@ export default defineComponent({
 			warn: null,
 			slots: "",
 			i18n,
+			iconClass,
 		};
 	},
 
diff --git a/packages/client/src/pages/page-editor/page-editor.vue b/packages/client/src/pages/page-editor/page-editor.vue
index 3a581ff208..4d1608455b 100644
--- a/packages/client/src/pages/page-editor/page-editor.vue
+++ b/packages/client/src/pages/page-editor/page-editor.vue
@@ -179,7 +179,7 @@ import { selectFile } from "@/scripts/select-file";
 import { mainRouter } from "@/router";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const props = defineProps<{
diff --git a/packages/client/src/pages/scratchpad.vue b/packages/client/src/pages/scratchpad.vue
index e7c65701c5..232a1ab8c6 100644
--- a/packages/client/src/pages/scratchpad.vue
+++ b/packages/client/src/pages/scratchpad.vue
@@ -45,12 +45,12 @@ import "prismjs/components/prism-javascript";
 import "prismjs/themes/prism-okaidia.css";
 import { PrismEditor } from "vue-prism-editor";
 import "vue-prism-editor/dist/prismeditor.min.css";
-import { AiScript, parse, utils } from "@syuilo/aiscript";
+import { Interpreter, Parser, utils } from "@syuilo/aiscript";
 import MkContainer from "@/components/MkContainer.vue";
 import MkButton from "@/components/MkButton.vue";
 import { createAiScriptEnv } from "@/scripts/aiscript/api";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
@@ -58,6 +58,8 @@ import icon from "@/scripts/icon";
 const code = ref("");
 const logs = ref<any[]>([]);
 
+const parser = new Parser();
+
 const saved = localStorage.getItem("scratchpad");
 if (saved) {
 	code.value = saved;
@@ -69,7 +71,7 @@ watch(code, () => {
 
 async function run() {
 	logs.value = [];
-	const aiscript = new AiScript(
+	const aiscript = new Interpreter(
 		createAiScriptEnv({
 			storageKey: "scratchpad",
 			token: $i?.token,
@@ -112,11 +114,11 @@ async function run() {
 
 	let ast;
 	try {
-		ast = parse(code.value);
+		ast = parser.parse(code.value);
 	} catch (error) {
 		os.alert({
 			type: "error",
-			text: "Syntax error :(",
+			text: `Syntax error : ${error}`,
 		});
 		return;
 	}
diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue
index 0caacdc60f..75c2e32f82 100644
--- a/packages/client/src/pages/settings/2fa.vue
+++ b/packages/client/src/pages/settings/2fa.vue
@@ -120,7 +120,7 @@ import MkSwitch from "@/components/form/switch.vue";
 import FormSection from "@/components/form/section.vue";
 import MkFolder from "@/components/MkFolder.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
@@ -279,7 +279,7 @@ async function addSecurityKey() {
 			challenge: byteify(challenge.challenge, "base64"),
 			rp: {
 				id: hostname,
-				name: "Misskey",
+				name: "Firefish",
 			},
 			user: {
 				id: byteify($i!.id, "ascii"),
diff --git a/packages/client/src/pages/settings/account-info.vue b/packages/client/src/pages/settings/account-info.vue
index 7342f2df42..d3b640a7e4 100644
--- a/packages/client/src/pages/settings/account-info.vue
+++ b/packages/client/src/pages/settings/account-info.vue
@@ -179,7 +179,7 @@ import MkKeyValue from "@/components/MkKeyValue.vue";
 import * as os from "@/os";
 import number from "@/filters/number";
 import bytes from "@/filters/bytes";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/settings/accounts.vue b/packages/client/src/pages/settings/accounts.vue
index 7058b652ad..2e0230d7a2 100644
--- a/packages/client/src/pages/settings/accounts.vue
+++ b/packages/client/src/pages/settings/accounts.vue
@@ -34,12 +34,12 @@ import FormSuspense from "@/components/form/suspense.vue";
 import FormButton from "@/components/MkButton.vue";
 import * as os from "@/os";
 import {
-	$i,
 	removeAccount as _removeAccount,
 	addAccount as addAccounts,
 	getAccounts,
 	login,
 } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/settings/drive.vue b/packages/client/src/pages/settings/drive.vue
index e6b07acaa3..a0b88e1728 100644
--- a/packages/client/src/pages/settings/drive.vue
+++ b/packages/client/src/pages/settings/drive.vue
@@ -85,15 +85,15 @@ import { defaultStore } from "@/store";
 import MkChart from "@/components/MkChart.vue";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const fetching = ref(true);
 const usage = ref<any>(null);
 const capacity = ref<any>(null);
 const uploadFolder = ref<any>(null);
-const alwaysMarkNsfw = ref<boolean>($i.alwaysMarkNsfw);
-const autoSensitive = ref<boolean>($i.autoSensitive);
+const alwaysMarkNsfw = ref<boolean>($i != null && $i.alwaysMarkNsfw);
+const autoSensitive = ref<boolean>($i != null && $i.autoSensitive);
 
 const meterStyle = computed(() => {
 	return {
diff --git a/packages/client/src/pages/settings/email.vue b/packages/client/src/pages/settings/email.vue
index 4d760fb9e7..da8578ead7 100644
--- a/packages/client/src/pages/settings/email.vue
+++ b/packages/client/src/pages/settings/email.vue
@@ -66,7 +66,7 @@ import FormSection from "@/components/form/section.vue";
 import FormInput from "@/components/form/input.vue";
 import FormSwitch from "@/components/form/switch.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue
index 5b475b8939..0891b9269a 100644
--- a/packages/client/src/pages/settings/general.vue
+++ b/packages/client/src/pages/settings/general.vue
@@ -303,7 +303,7 @@
 
 <script lang="ts" setup>
 import { computed, ref, watch } from "vue";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import FormSwitch from "@/components/form/switch.vue";
 import FormSelect from "@/components/form/select.vue";
 import FormRadios from "@/components/form/radios.vue";
diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue
index 56caea41f1..47812e5349 100644
--- a/packages/client/src/pages/settings/index.vue
+++ b/packages/client/src/pages/settings/index.vue
@@ -45,7 +45,8 @@ import { computed, onActivated, onMounted, onUnmounted, ref, watch } from "vue";
 import { i18n } from "@/i18n";
 import MkInfo from "@/components/MkInfo.vue";
 import MkSuperMenu from "@/components/MkSuperMenu.vue";
-import { $i, signout } from "@/account";
+import { signout } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { unisonReload } from "@/scripts/unison-reload";
 import { instance } from "@/instance";
 import { useRouter } from "@/router";
diff --git a/packages/client/src/pages/settings/instance-mute.vue b/packages/client/src/pages/settings/instance-mute.vue
index 1826fcc2c6..f73416bbb4 100644
--- a/packages/client/src/pages/settings/instance-mute.vue
+++ b/packages/client/src/pages/settings/instance-mute.vue
@@ -26,7 +26,7 @@ import FormTextarea from "@/components/form/textarea.vue";
 import MkInfo from "@/components/MkInfo.vue";
 import MkButton from "@/components/MkButton.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/settings/migration.vue b/packages/client/src/pages/settings/migration.vue
index d05f473771..527b297c3f 100644
--- a/packages/client/src/pages/settings/migration.vue
+++ b/packages/client/src/pages/settings/migration.vue
@@ -60,7 +60,7 @@ import FormInfo from "@/components/MkInfo.vue";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const moveToAccount = ref("");
diff --git a/packages/client/src/pages/settings/notifications.vue b/packages/client/src/pages/settings/notifications.vue
index 0e0f954a55..0100451893 100644
--- a/packages/client/src/pages/settings/notifications.vue
+++ b/packages/client/src/pages/settings/notifications.vue
@@ -54,7 +54,7 @@ import { notificationTypes } from "firefish-js";
 import FormButton from "@/components/MkButton.vue";
 import FormSection from "@/components/form/section.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import MkPushNotificationAllowButton from "@/components/MkPushNotificationAllowButton.vue";
diff --git a/packages/client/src/pages/settings/plugin.install.vue b/packages/client/src/pages/settings/plugin.install.vue
index ef6c609697..3b736d39ec 100644
--- a/packages/client/src/pages/settings/plugin.install.vue
+++ b/packages/client/src/pages/settings/plugin.install.vue
@@ -19,9 +19,9 @@
 
 <script lang="ts" setup>
 import { defineAsyncComponent, nextTick, ref } from "vue";
-import { AiScript, parse } from "@syuilo/aiscript";
-import { serialize } from "@syuilo/aiscript/built/serializer";
+import { Interpreter, Parser, utils } from "@syuilo/aiscript";
 import { v4 as uuid } from "uuid";
+import { compareVersions } from "compare-versions";
 import FormTextarea from "@/components/form/textarea.vue";
 import FormButton from "@/components/MkButton.vue";
 import FormInfo from "@/components/MkInfo.vue";
@@ -32,9 +32,17 @@ import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
 
-const code = ref(null);
+const code = ref<string>();
 
-function installPlugin({ id, meta, ast, token }) {
+function isSupportedVersion(version: string): boolean {
+	try {
+		return compareVersions(version, "0.12.0") >= 0;
+	} catch (err) {
+		return false;
+	}
+}
+
+function installPlugin({ id, meta, src, token }) {
 	ColdDeviceStorage.set(
 		"plugins",
 		ColdDeviceStorage.get("plugins").concat({
@@ -42,25 +50,46 @@ function installPlugin({ id, meta, ast, token }) {
 			id,
 			active: true,
 			configData: {},
+			src,
 			token,
-			ast,
 		}),
 	);
 }
 
+const parser = new Parser();
+
 async function install() {
-	let ast;
-	try {
-		ast = parse(code.value);
-	} catch (err) {
+	if (code.value == null) return;
+
+	const scriptVersion = utils.getLangVersion(code.value);
+
+	if (scriptVersion == null) {
 		os.alert({
 			type: "error",
-			text: "Syntax error :(",
+			text: "No language version annotation found :(",
+		});
+		return;
+	}
+	if (!isSupportedVersion(scriptVersion)) {
+		os.alert({
+			type: "error",
+			text: `aiscript version '${scriptVersion}' is not supported :(`,
 		});
 		return;
 	}
 
-	const meta = AiScript.collectMetadata(ast);
+	let ast;
+	try {
+		ast = parser.parse(code.value);
+	} catch (err) {
+		os.alert({
+			type: "error",
+			text: `Syntax error : ${err}`,
+		});
+		return;
+	}
+
+	const meta = Interpreter.collectMetadata(ast);
 	if (meta == null) {
 		os.alert({
 			type: "error",
@@ -83,7 +112,7 @@ async function install() {
 	if (name == null || version == null || author == null) {
 		os.alert({
 			type: "error",
-			text: "Required property not found :(",
+			text: "Required property (name, version, author) not found :(",
 		});
 		return;
 	}
@@ -134,8 +163,8 @@ async function install() {
 			permissions,
 			config,
 		},
+		src: code.value,
 		token,
-		ast: serialize(ast),
 	});
 
 	os.success();
diff --git a/packages/client/src/pages/settings/preferences-backups.vue b/packages/client/src/pages/settings/preferences-backups.vue
index e5197dc489..da4a40b323 100644
--- a/packages/client/src/pages/settings/preferences-backups.vue
+++ b/packages/client/src/pages/settings/preferences-backups.vue
@@ -65,7 +65,7 @@ import * as os from "@/os";
 import { ColdDeviceStorage, defaultStore } from "@/store";
 import { unisonReload } from "@/scripts/unison-reload";
 import { stream } from "@/stream";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { host, version } from "@/config";
 import { definePageMetadata } from "@/scripts/page-metadata";
diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue
index 3b0e154181..a7c5f56a90 100644
--- a/packages/client/src/pages/settings/privacy.vue
+++ b/packages/client/src/pages/settings/privacy.vue
@@ -157,7 +157,7 @@ import FormFolder from "@/components/form/folder.vue";
 import * as os from "@/os";
 import { defaultStore } from "@/store";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue
index 3d9eb2246b..99486adf8c 100644
--- a/packages/client/src/pages/settings/profile.vue
+++ b/packages/client/src/pages/settings/profile.vue
@@ -170,7 +170,7 @@ import FormSlot from "@/components/form/slot.vue";
 import { selectFile } from "@/scripts/select-file";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { langmap } from "@/scripts/langmap";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import { host } from "@/config";
diff --git a/packages/client/src/pages/settings/word-mute.vue b/packages/client/src/pages/settings/word-mute.vue
index 7b2c45d04a..68b6b09a45 100644
--- a/packages/client/src/pages/settings/word-mute.vue
+++ b/packages/client/src/pages/settings/word-mute.vue
@@ -70,7 +70,7 @@ import MkTab from "@/components/MkTab.vue";
 import * as os from "@/os";
 import number from "@/filters/number";
 import { defaultStore } from "@/store";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/pages/theme-editor.vue b/packages/client/src/pages/theme-editor.vue
index d7fba77d12..474fe51b08 100644
--- a/packages/client/src/pages/theme-editor.vue
+++ b/packages/client/src/pages/theme-editor.vue
@@ -90,8 +90,8 @@
 										color: color.forPreview
 											? color.forPreview
 											: theme.base === 'light'
-											? '#5f5f5f'
-											: '#dadada',
+											  ? '#5f5f5f'
+											  : '#dadada',
 									}"
 								>
 									A
@@ -151,7 +151,7 @@ import FormButton from "@/components/MkButton.vue";
 import FormTextarea from "@/components/form/textarea.vue";
 import FormFolder from "@/components/form/folder.vue";
 
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import type { Theme } from "@/scripts/theme";
 import { applyTheme } from "@/scripts/theme";
 import lightTheme from "@/themes/_light.json5";
diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue
index 3573e00523..af5af76d84 100644
--- a/packages/client/src/pages/timeline.vue
+++ b/packages/client/src/pages/timeline.vue
@@ -74,7 +74,7 @@ import * as os from "@/os";
 import { defaultStore } from "@/store";
 import { i18n } from "@/i18n";
 import { instance } from "@/instance";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import { deviceKind } from "@/scripts/device-kind";
 import icon from "@/scripts/icon";
@@ -270,12 +270,12 @@ definePageMetadata(
 			src.value === "local"
 				? "ph-users ph-lg"
 				: src.value === "social"
-				? "ph-handshake ph-lg"
-				: src.value === "recommended"
-				? "ph-thumbs-up ph-lg"
-				: src.value === "global"
-				? "ph-planet ph-lg"
-				: "ph-house ph-lg",
+				  ? "ph-handshake ph-lg"
+				  : src.value === "recommended"
+				    ? "ph-thumbs-up ph-lg"
+				    : src.value === "global"
+				      ? "ph-planet ph-lg"
+				      : "ph-house ph-lg",
 	})),
 );
 
diff --git a/packages/client/src/pages/user/home.vue b/packages/client/src/pages/user/home.vue
index 029b56aa6b..a59df2b0fb 100644
--- a/packages/client/src/pages/user/home.vue
+++ b/packages/client/src/pages/user/home.vue
@@ -392,7 +392,7 @@ import { userPage } from "@/filters/user";
 import { defaultStore } from "@/store";
 import * as os from "@/os";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { host } from "@/config";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/pages/user/index.activity.vue b/packages/client/src/pages/user/index.activity.vue
index bfaf012a7e..e417f93bf4 100644
--- a/packages/client/src/pages/user/index.activity.vue
+++ b/packages/client/src/pages/user/index.activity.vue
@@ -35,7 +35,7 @@ import * as os from "@/os";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
-const props = withDefaults(
+withDefaults(
 	defineProps<{
 		user: firefish.entities.User;
 		limit?: number;
diff --git a/packages/client/src/pages/user/index.vue b/packages/client/src/pages/user/index.vue
index a0c9f4326d..9fe9678e6a 100644
--- a/packages/client/src/pages/user/index.vue
+++ b/packages/client/src/pages/user/index.vue
@@ -37,7 +37,7 @@ import * as os from "@/os";
 import { useRouter } from "@/router";
 import { definePageMetadata } from "@/scripts/page-metadata";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import icon from "@/scripts/icon";
 
 const XHome = defineAsyncComponent(() => import("./home.vue"));
diff --git a/packages/client/src/pizzax.ts b/packages/client/src/pizzax.ts
index 1155158067..a16c8067f6 100644
--- a/packages/client/src/pizzax.ts
+++ b/packages/client/src/pizzax.ts
@@ -2,9 +2,9 @@
 
 import type { Ref } from "vue";
 import { onUnmounted, ref, watch } from "vue";
-import { $i } from "./account";
 import { api } from "./os";
 import { stream } from "./stream";
+import { $i } from "@/reactiveAccount";
 
 type StateDef = Record<
 	string,
diff --git a/packages/client/src/plugin.ts b/packages/client/src/plugin.ts
index 8e964ab3a2..c38aaa365a 100644
--- a/packages/client/src/plugin.ts
+++ b/packages/client/src/plugin.ts
@@ -1,8 +1,6 @@
-import { AiScript, utils, values } from "@syuilo/aiscript";
-import { deserialize } from "@syuilo/aiscript/built/serializer";
-import { jsToVal } from "@syuilo/aiscript/built/interpreter/util";
-import { createAiScriptEnv } from "@/scripts/aiscript/api";
+import { Interpreter, Parser, utils, values } from "@syuilo/aiscript";
 import { inputText } from "@/os";
+import { createAiScriptEnv } from "@/scripts/aiscript/api";
 import {
 	noteActions,
 	notePostInterruptors,
@@ -11,12 +9,13 @@ import {
 	userActions,
 } from "@/store";
 
-const pluginContexts = new Map<string, AiScript>();
+const parser = new Parser();
+const pluginContexts = new Map<string, Interpreter>();
 
 export function install(plugin) {
 	console.info("Plugin installed:", plugin.name, `v${plugin.version}`);
 
-	const aiscript = new AiScript(
+	const aiscript = new Interpreter(
 		createPluginEnv({
 			plugin,
 			storageKey: `plugins:${plugin.id}`,
@@ -40,15 +39,15 @@ export function install(plugin) {
 
 	initPlugin({ plugin, aiscript });
 
-	aiscript.exec(deserialize(plugin.ast));
+	aiscript.exec(parser.parse(plugin.src));
 }
 
 function createPluginEnv(opts) {
-	const config = new Map();
-	for (const [k, v] of Object.entries(opts.plugin.config || {})) {
+	const config = new Map<string, values.Value>();
+	for (const [k, v] of Object.entries(opts.plugin.config ?? {})) {
 		config.set(
 			k,
-			jsToVal(
+			utils.jsToVal(
 				typeof opts.plugin.configData[k] !== "undefined"
 					? opts.plugin.configData[k]
 					: v.default,
@@ -114,6 +113,12 @@ function createPluginEnv(opts) {
 				handler,
 			});
 		}),
+		"Plugin:register_page_view_interruptor": values.FN_NATIVE(([handler]) => {
+			registerPageViewInterruptor({
+				pluginId: opts.plugin.id,
+				handler,
+			});
+		}),
 		"Plugin:open_url": values.FN_NATIVE(([url]) => {
 			window.open(url.value, "_blank");
 		}),
@@ -129,10 +134,17 @@ function registerPostFormAction({ pluginId, title, handler }) {
 	postFormActions.push({
 		title,
 		handler: (form, update) => {
-			pluginContexts.get(pluginId).execFn(handler, [
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
+			pluginContext.execFn(handler, [
 				utils.jsToVal(form),
 				values.FN_NATIVE(([key, value]) => {
-					update(key.value, value.value);
+					if (!key || !value) {
+						return;
+					}
+					update(utils.valToJs(key), utils.valToJs(value));
 				}),
 			]);
 		},
@@ -143,7 +155,11 @@ function registerUserAction({ pluginId, title, handler }) {
 	userActions.push({
 		title,
 		handler: (user) => {
-			pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(user)]);
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
+			pluginContext.execFn(handler, [utils.jsToVal(user)]);
 		},
 	});
 }
@@ -152,7 +168,11 @@ function registerNoteAction({ pluginId, title, handler }) {
 	noteActions.push({
 		title,
 		handler: (note) => {
-			pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]);
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
+			pluginContext.execFn(handler, [utils.jsToVal(user)]);
 		},
 	});
 }
@@ -160,10 +180,12 @@ function registerNoteAction({ pluginId, title, handler }) {
 function registerNoteViewInterruptor({ pluginId, handler }) {
 	noteViewInterruptors.push({
 		handler: async (note) => {
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
 			return utils.valToJs(
-				await pluginContexts
-					.get(pluginId)
-					.execFn(handler, [utils.jsToVal(note)]),
+				await pluginContext.execFn(handler, [utils.jsToVal(note)]),
 			);
 		},
 	});
@@ -172,10 +194,26 @@ function registerNoteViewInterruptor({ pluginId, handler }) {
 function registerNotePostInterruptor({ pluginId, handler }) {
 	notePostInterruptors.push({
 		handler: async (note) => {
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
 			return utils.valToJs(
-				await pluginContexts
-					.get(pluginId)
-					.execFn(handler, [utils.jsToVal(note)]),
+				await pluginContext.execFn(handler, [utils.jsToVal(note)]),
+			);
+		},
+	});
+}
+
+function registerPageViewInterruptor({ pluginId, handler }): void {
+	pageViewInterruptors.push({
+		handler: async (page) => {
+			const pluginContext = pluginContexts.get(pluginId);
+			if (!pluginContext) {
+				return;
+			}
+			return utils.valToJs(
+				await pluginContext.execFn(handler, [utils.jsToVal(page)]),
 			);
 		},
 	});
diff --git a/packages/client/src/reactiveAccount.ts b/packages/client/src/reactiveAccount.ts
new file mode 100644
index 0000000000..46ff249926
--- /dev/null
+++ b/packages/client/src/reactiveAccount.ts
@@ -0,0 +1,9 @@
+import { reactive } from "vue";
+import type { Account } from "@/account";
+
+const accountData = localStorage.getItem("account");
+
+// TODO: 外部からはreadonlyに
+export const $i = accountData
+	? reactive(JSON.parse(accountData) as Account)
+	: null;
diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts
index dd1621777e..5dff5a4ba8 100644
--- a/packages/client/src/router.ts
+++ b/packages/client/src/router.ts
@@ -1,21 +1,21 @@
 import type { AsyncComponentLoader } from "vue";
 import { defineAsyncComponent, inject } from "vue";
+import { iAmModerator } from "@/account";
 import { Router } from "@/nirax";
-import { $i, iAmModerator } from "@/account";
-import MkLoading from "@/pages/_loading_.vue";
 import MkError from "@/pages/_error_.vue";
-import { api } from "@/os";
-import { ui } from "@/config";
+import MkLoading from "@/pages/_loading_.vue";
+import { $i } from "@/reactiveAccount";
+// import { api } from "@/os";
 
-function getGuestTimelineStatus() {
-	api("meta", {
-		detail: false,
-	}).then((meta) => {
-		return meta.enableGuestTimeline;
-	});
-}
+// function getGuestTimelineStatus() {
+// 	api("meta", {
+// 		detail: false,
+// 	}).then((meta) => {
+// 		return meta.enableGuestTimeline;
+// 	});
+// }
 
-const guestTimeline = getGuestTimelineStatus();
+// const guestTimeline = getGuestTimelineStatus();
 
 const page = (loader: AsyncComponentLoader<any>) =>
 	defineAsyncComponent({
@@ -582,6 +582,11 @@ export const routes = [
 		component: page(() => import("./pages/drive.vue")),
 		loginRequired: true,
 	},
+	{
+		path: "/my/drive/file/:fileId/attached",
+		component: page(() => import("./pages/attached-files.vue")),
+		loginRequired: true,
+	},
 	{
 		path: "/my/drive",
 		component: page(() => import("./pages/drive.vue")),
diff --git a/packages/client/src/scripts/aiscript/api.ts b/packages/client/src/scripts/aiscript/api.ts
index 9ec2db9632..e0eed05c02 100644
--- a/packages/client/src/scripts/aiscript/api.ts
+++ b/packages/client/src/scripts/aiscript/api.ts
@@ -1,6 +1,6 @@
 import { utils, values } from "@syuilo/aiscript";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 export function createAiScriptEnv(opts) {
 	let apiRequests = 0;
@@ -54,5 +54,8 @@ export function createAiScriptEnv(opts) {
 				),
 			);
 		}),
+		"Mk:url": values.FN_NATIVE(() => {
+			return values.STR(window.location.href);
+		}),
 	};
 }
diff --git a/packages/client/src/scripts/autocomplete.ts b/packages/client/src/scripts/autocomplete.ts
index 0d5d16f180..18e56ba38d 100644
--- a/packages/client/src/scripts/autocomplete.ts
+++ b/packages/client/src/scripts/autocomplete.ts
@@ -88,7 +88,11 @@ export class Autocomplete {
 		const isHashtag = hashtagIndex !== -1;
 		const isMfmTag = mfmTagIndex !== -1;
 		const isEmoji =
-			emojiIndex !== -1 && text.split(/:[a-z0-9_+\-]+:/).pop()!.includes(":");
+			emojiIndex !== -1 &&
+			text
+				.split(/:[a-z0-9_+\-]+:/)
+				.pop()!
+				.includes(":");
 
 		let opened = false;
 
diff --git a/packages/client/src/scripts/check-word-mute.ts b/packages/client/src/scripts/check-word-mute.ts
index 7bdf6a9685..7a39950cf2 100644
--- a/packages/client/src/scripts/check-word-mute.ts
+++ b/packages/client/src/scripts/check-word-mute.ts
@@ -79,7 +79,7 @@ export function getWordSoftMute(
 	mutedWords: Array<string | string[]>,
 	mutedLangs: Array<string | string[]>,
 ): Muted {
-	if (note.userId === meId) return NotMuted;
+	if (meId == null || note.userId === meId) return NotMuted;
 
 	if (mutedWords.length > 0) {
 		const noteMuted = checkWordMute(note, mutedWords);
@@ -105,14 +105,14 @@ export function getWordSoftMute(
 		}
 	}
 	if (mutedLangs.length > 0) {
-		let noteLangMuted = checkLangMute(note, mutedLangs);
+		const noteLangMuted = checkLangMute(note, mutedLangs);
 		if (noteLangMuted.muted) {
 			noteLangMuted.what = "note";
 			return noteLangMuted;
 		}
 
 		if (note.renote) {
-			let renoteLangMuted = checkLangMute(note, mutedLangs);
+			const renoteLangMuted = checkLangMute(note, mutedLangs);
 			if (renoteLangMuted.muted) {
 				renoteLangMuted.what = note.text == null ? "renote" : "quote";
 				return renoteLangMuted;
@@ -120,7 +120,7 @@ export function getWordSoftMute(
 		}
 
 		if (note.reply) {
-			let replyLangMuted = checkLangMute(note, mutedLangs);
+			const replyLangMuted = checkLangMute(note, mutedLangs);
 			if (replyLangMuted.muted) {
 				replyLangMuted.what = "reply";
 				return replyLangMuted;
diff --git a/packages/client/src/scripts/chiptune2.ts b/packages/client/src/scripts/chiptune2.ts
index 5904f37fcf..2f62428f47 100644
--- a/packages/client/src/scripts/chiptune2.ts
+++ b/packages/client/src/scripts/chiptune2.ts
@@ -309,9 +309,9 @@ ChiptuneJsPlayer.prototype.createLibopenmptNode = async function (
 			}
 			return;
 		}
-		let framesRendered = 0;
-		let ended = false;
-		let error = false;
+		let framesRendered = 0,
+			ended = false,
+			error = false;
 
 		const currentPattern =
 			processNode.player.libopenmpt._openmpt_module_get_current_pattern(
diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts
index fea50ced3b..2e6b84bde0 100644
--- a/packages/client/src/scripts/get-note-menu.ts
+++ b/packages/client/src/scripts/get-note-menu.ts
@@ -1,7 +1,7 @@
 import type { Ref } from "vue";
-import { defineAsyncComponent, inject } from "vue";
+import { defineAsyncComponent } from "vue";
 import type * as firefish from "firefish-js";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { instance } from "@/instance";
 import * as os from "@/os";
diff --git a/packages/client/src/scripts/get-note-summary.ts b/packages/client/src/scripts/get-note-summary.ts
index a2ea4b4e2e..7a09c601ae 100644
--- a/packages/client/src/scripts/get-note-summary.ts
+++ b/packages/client/src/scripts/get-note-summary.ts
@@ -1,5 +1,4 @@
 import type * as firefish from "firefish-js";
-import { i18n } from "@/i18n";
 
 /**
  * 投稿を表す文字列を取得します。
diff --git a/packages/client/src/scripts/get-user-menu.ts b/packages/client/src/scripts/get-user-menu.ts
index 83c70546bb..e9a6ca567f 100644
--- a/packages/client/src/scripts/get-user-menu.ts
+++ b/packages/client/src/scripts/get-user-menu.ts
@@ -5,7 +5,8 @@ import copyToClipboard from "@/scripts/copy-to-clipboard";
 import { host } from "@/config";
 import * as os from "@/os";
 import { userActions } from "@/store";
-import { $i, iAmModerator } from "@/account";
+import { iAmModerator } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { mainRouter } from "@/router";
 import type { Router } from "@/nirax";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/scripts/hpml/evaluator.ts b/packages/client/src/scripts/hpml/evaluator.ts
index f9a08079a9..ba06a87442 100644
--- a/packages/client/src/scripts/hpml/evaluator.ts
+++ b/packages/client/src/scripts/hpml/evaluator.ts
@@ -1,5 +1,5 @@
 import autobind from "autobind-decorator";
-import { AiScript, utils, values } from "@syuilo/aiscript";
+import { Interpreter, utils, values } from "@syuilo/aiscript";
 import type { Ref } from "vue";
 import { markRaw, ref, unref } from "vue";
 import { collectPageVars } from "../collect-page-vars";
@@ -19,7 +19,7 @@ export class Hpml {
 	private variables: Variable[];
 	private pageVars: PageVar[];
 	private envVars: Record<keyof typeof envVarsDef, any>;
-	public aiscript?: AiScript;
+	public aiscript?: Interpreter;
 	public pageVarUpdatedCallback?: values.VFn;
 	public canvases: Record<string, HTMLCanvasElement> = {};
 	public vars: Ref<Record<string, any>> = ref({});
@@ -40,7 +40,7 @@ export class Hpml {
 
 		if (this.opts.enableAiScript) {
 			this.aiscript = markRaw(
-				new AiScript(
+				new Interpreter(
 					{
 						...createAiScriptEnv({
 							storageKey: `pages:${this.page.id}`,
diff --git a/packages/client/src/scripts/icon.ts b/packages/client/src/scripts/icon.ts
index 49d447bb1e..71f643fdc8 100644
--- a/packages/client/src/scripts/icon.ts
+++ b/packages/client/src/scripts/icon.ts
@@ -1,5 +1,5 @@
 import { defaultStore } from "@/store";
 
-export default function icon(name: string, large = true): string {
+export default function (name: string, large = true): string {
 	return `${name} ${large ? "ph-lg" : ""} ${defaultStore.state.iconSet}`;
 }
diff --git a/packages/client/src/scripts/please-login.ts b/packages/client/src/scripts/please-login.ts
index f8f3983ae5..b8421172d4 100644
--- a/packages/client/src/scripts/please-login.ts
+++ b/packages/client/src/scripts/please-login.ts
@@ -1,5 +1,5 @@
 import { defineAsyncComponent } from "vue";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { popup } from "@/os";
 import { vibrate } from "@/scripts/vibrate";
diff --git a/packages/client/src/scripts/popup-position.ts b/packages/client/src/scripts/popup-position.ts
index abc6cfb66f..45bcd4dbf5 100644
--- a/packages/client/src/scripts/popup-position.ts
+++ b/packages/client/src/scripts/popup-position.ts
@@ -1,5 +1,3 @@
-import { Ref } from "vue";
-
 export function calcPopupPosition(
 	el: HTMLElement,
 	props: {
diff --git a/packages/client/src/scripts/preprocess.ts b/packages/client/src/scripts/preprocess.ts
index 835e2185d5..867a99097b 100644
--- a/packages/client/src/scripts/preprocess.ts
+++ b/packages/client/src/scripts/preprocess.ts
@@ -2,7 +2,7 @@ import * as mfm from "mfm-js";
 import { defaultStore } from "@/store";
 import { expandKaTeXMacro } from "@/scripts/katex-macro";
 
-export default function preprocess(text: string): string {
+export default function (text: string): string {
 	if (defaultStore.state.enableCustomKaTeXMacro) {
 		const parsedKaTeXMacro =
 			localStorage.getItem("customKaTeXMacroParsed") ?? "{}";
diff --git a/packages/client/src/scripts/upload.ts b/packages/client/src/scripts/upload.ts
index 2b26ba3024..37f3c8faf1 100644
--- a/packages/client/src/scripts/upload.ts
+++ b/packages/client/src/scripts/upload.ts
@@ -3,7 +3,7 @@ import type * as firefish from "firefish-js";
 import { readAndCompressImage } from "browser-image-resizer";
 import { defaultStore } from "@/store";
 import { apiUrl } from "@/config";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { alert } from "@/os";
 import { i18n } from "@/i18n";
 
diff --git a/packages/client/src/scripts/use-leave-guard.ts b/packages/client/src/scripts/use-leave-guard.ts
index 12c25651c9..07e22556df 100644
--- a/packages/client/src/scripts/use-leave-guard.ts
+++ b/packages/client/src/scripts/use-leave-guard.ts
@@ -1,7 +1,7 @@
 import type { Ref } from "vue";
-import { inject, onUnmounted } from "vue";
-import { i18n } from "@/i18n";
-import * as os from "@/os";
+// import { inject, onUnmounted } from "vue";
+// import { i18n } from "@/i18n";
+// import * as os from "@/os";
 
 export function useLeaveGuard(enabled: Ref<boolean>) {
 	/* TODO
diff --git a/packages/client/src/scripts/use-note-capture.ts b/packages/client/src/scripts/use-note-capture.ts
index 57cf5b84a4..7c5f29d0a3 100644
--- a/packages/client/src/scripts/use-note-capture.ts
+++ b/packages/client/src/scripts/use-note-capture.ts
@@ -2,7 +2,7 @@ import type { Ref } from "vue";
 import { onUnmounted } from "vue";
 import type * as firefish from "firefish-js";
 import { stream } from "@/stream";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import * as os from "@/os";
 
 export function useNoteCapture(props: {
diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts
index 39dd533785..48885bac62 100644
--- a/packages/client/src/store.ts
+++ b/packages/client/src/store.ts
@@ -385,11 +385,11 @@ interface Plugin {
 	ast: any[];
 }
 
+import darkTheme from "@/themes/d-rosepine.json5";
 /**
  * Storage for configuration information that does not need to be constantly loaded into memory (non-reactive)
  */
 import lightTheme from "@/themes/l-rosepinedawn.json5";
-import darkTheme from "@/themes/d-rosepine.json5";
 
 export class ColdDeviceStorage {
 	public static default = {
diff --git a/packages/client/src/stream.ts b/packages/client/src/stream.ts
index 6d7f890d6e..f0dd1879a2 100644
--- a/packages/client/src/stream.ts
+++ b/packages/client/src/stream.ts
@@ -1,7 +1,7 @@
 import * as firefish from "firefish-js";
 import { markRaw } from "vue";
-import { $i } from "@/account";
 import { url } from "@/config";
+import { $i } from "@/reactiveAccount";
 
 export const stream = markRaw(
 	new firefish.Stream(
diff --git a/packages/client/src/theme-store.ts b/packages/client/src/theme-store.ts
index 3dedc045e4..866ba064c4 100644
--- a/packages/client/src/theme-store.ts
+++ b/packages/client/src/theme-store.ts
@@ -1,6 +1,6 @@
 import type { Theme } from "./scripts/theme";
 import { api } from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 const lsCacheKey = $i ? `themes:${$i.id}` : "";
 
diff --git a/packages/client/src/ui/_common_/common.vue b/packages/client/src/ui/_common_/common.vue
index 8e2d20f92f..dc20b6905c 100644
--- a/packages/client/src/ui/_common_/common.vue
+++ b/packages/client/src/ui/_common_/common.vue
@@ -19,10 +19,10 @@
 <script lang="ts" setup>
 import { defineAsyncComponent } from "vue";
 import { swInject } from "./sw-inject";
-import { pendingApiRequestsCount, popup, popups } from "@/os";
+import { popup, popups } from "@/os";
 import { uploads } from "@/scripts/upload";
 import * as sound from "@/scripts/sound";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { stream } from "@/stream";
 
 const XStreamIndicator = defineAsyncComponent(
diff --git a/packages/client/src/ui/_common_/navbar-for-mobile.vue b/packages/client/src/ui/_common_/navbar-for-mobile.vue
index 98d2250ef0..2c0eed97d2 100644
--- a/packages/client/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/client/src/ui/_common_/navbar-for-mobile.vue
@@ -126,14 +126,7 @@
 </template>
 
 <script lang="ts" setup>
-import {
-	computed,
-	defineAsyncComponent,
-	defineComponent,
-	ref,
-	toRef,
-	watch,
-} from "vue";
+import { computed, defineAsyncComponent, toRef } from "vue";
 import * as os from "@/os";
 import { navbarItemDef } from "@/navbar";
 import { openAccountMenu as openAccountMenu_ } from "@/account";
diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue
index 3fad8c0bf0..a5043ed942 100644
--- a/packages/client/src/ui/_common_/navbar.vue
+++ b/packages/client/src/ui/_common_/navbar.vue
@@ -149,7 +149,8 @@
 import { computed, defineAsyncComponent, ref, watch } from "vue";
 import * as os from "@/os";
 import { navbarItemDef } from "@/navbar";
-import { $i, openAccountMenu as openAccountMenu_ } from "@/account";
+import { openAccountMenu as openAccountMenu_ } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { openHelpMenu_ } from "@/scripts/helpMenu";
 import { defaultStore } from "@/store";
 import { i18n } from "@/i18n";
diff --git a/packages/client/src/ui/_common_/statusbar-federation.vue b/packages/client/src/ui/_common_/statusbar-federation.vue
index 7e16b7bbc1..f33561b193 100644
--- a/packages/client/src/ui/_common_/statusbar-federation.vue
+++ b/packages/client/src/ui/_common_/statusbar-federation.vue
@@ -39,13 +39,11 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, defineAsyncComponent, ref, toRef, watch } from "vue";
+import { ref } from "vue";
 import type * as firefish from "firefish-js";
 import MarqueeText from "@/components/MkMarquee.vue";
 import * as os from "@/os";
 import { useInterval } from "@/scripts/use-interval";
-import { getNoteSummary } from "@/scripts/get-note-summary";
-import { notePage } from "@/filters/note";
 import { getProxiedImageUrlNullable } from "@/scripts/media-proxy";
 
 const props = defineProps<{
diff --git a/packages/client/src/ui/_common_/statusbar-rss.vue b/packages/client/src/ui/_common_/statusbar-rss.vue
index d65418469b..1c38d681eb 100644
--- a/packages/client/src/ui/_common_/statusbar-rss.vue
+++ b/packages/client/src/ui/_common_/statusbar-rss.vue
@@ -27,9 +27,8 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, defineAsyncComponent, ref, toRef, watch } from "vue";
+import { ref } from "vue";
 import MarqueeText from "@/components/MkMarquee.vue";
-import * as os from "@/os";
 import { useInterval } from "@/scripts/use-interval";
 import { shuffle } from "@/scripts/shuffle";
 
diff --git a/packages/client/src/ui/_common_/statusbar-user-list.vue b/packages/client/src/ui/_common_/statusbar-user-list.vue
index 6956ef9746..53dea3c2fe 100644
--- a/packages/client/src/ui/_common_/statusbar-user-list.vue
+++ b/packages/client/src/ui/_common_/statusbar-user-list.vue
@@ -34,7 +34,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, defineAsyncComponent, ref, toRef, watch } from "vue";
+import { ref } from "vue";
 import type * as firefish from "firefish-js";
 import MarqueeText from "@/components/MkMarquee.vue";
 import * as os from "@/os";
diff --git a/packages/client/src/ui/_common_/statusbars.vue b/packages/client/src/ui/_common_/statusbars.vue
index 830f9f570b..9e093087fe 100644
--- a/packages/client/src/ui/_common_/statusbars.vue
+++ b/packages/client/src/ui/_common_/statusbars.vue
@@ -49,8 +49,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, defineAsyncComponent, ref, toRef, watch } from "vue";
-import * as os from "@/os";
+import { defineAsyncComponent } from "vue";
 import { defaultStore } from "@/store";
 const XRss = defineAsyncComponent(() => import("./statusbar-rss.vue"));
 const XFederation = defineAsyncComponent(
diff --git a/packages/client/src/ui/_common_/sw-inject.ts b/packages/client/src/ui/_common_/sw-inject.ts
index 7e419c63e0..afc1aee8f6 100644
--- a/packages/client/src/ui/_common_/sw-inject.ts
+++ b/packages/client/src/ui/_common_/sw-inject.ts
@@ -1,7 +1,6 @@
-import { inject } from "vue";
 import { post } from "@/os";
-import { $i, login } from "@/account";
-import { defaultStore } from "@/store";
+import { login } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { getAccountFromId } from "@/scripts/get-account-from-id";
 import { mainRouter } from "@/router";
 
diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue
index 49962087b9..21901916a9 100644
--- a/packages/client/src/ui/deck.vue
+++ b/packages/client/src/ui/deck.vue
@@ -203,7 +203,7 @@ import XDrawerMenu from "@/ui/_common_/navbar-for-mobile.vue";
 import MkButton from "@/components/MkButton.vue";
 import * as os from "@/os";
 import { navbarItemDef } from "@/navbar";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import { mainRouter } from "@/router";
 import { unisonReload } from "@/scripts/unison-reload";
diff --git a/packages/client/src/ui/deck/column-core.vue b/packages/client/src/ui/deck/column-core.vue
index 4c3c93734f..c9d9002019 100644
--- a/packages/client/src/ui/deck/column-core.vue
+++ b/packages/client/src/ui/deck/column-core.vue
@@ -58,7 +58,6 @@
 </template>
 
 <script lang="ts" setup>
-import {} from "vue";
 import XMainColumn from "./main-column.vue";
 import XTlColumn from "./tl-column.vue";
 import XAntennaColumn from "./antenna-column.vue";
diff --git a/packages/client/src/ui/deck/deck-store.ts b/packages/client/src/ui/deck/deck-store.ts
index 31016d4c26..cbe6f4f933 100644
--- a/packages/client/src/ui/deck/deck-store.ts
+++ b/packages/client/src/ui/deck/deck-store.ts
@@ -2,7 +2,6 @@ import { throttle } from "throttle-debounce";
 import { markRaw } from "vue";
 import type { notificationTypes } from "firefish-js";
 import { Storage } from "../../pizzax";
-import { i18n } from "@/i18n";
 import { api } from "@/os";
 import { deepClone } from "@/scripts/clone";
 
diff --git a/packages/client/src/ui/deck/tl-column.vue b/packages/client/src/ui/deck/tl-column.vue
index 9b37687d1b..9c7b4404de 100644
--- a/packages/client/src/ui/deck/tl-column.vue
+++ b/packages/client/src/ui/deck/tl-column.vue
@@ -50,7 +50,7 @@ import type { Column } from "./deck-store";
 import { removeColumn, updateColumn } from "./deck-store";
 import XTimeline from "@/components/MkTimeline.vue";
 import * as os from "@/os";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { instance } from "@/instance";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue
index 1082dc946c..32cf5e97ca 100644
--- a/packages/client/src/ui/universal.vue
+++ b/packages/client/src/ui/universal.vue
@@ -132,8 +132,8 @@
 
 		<button
 			v-if="isMobile && mainRouter.currentRoute.value.name === 'index'"
-			v-vibrate="5"
 			ref="postButton"
+			v-vibrate="5"
 			:aria-label="i18n.t('note')"
 			class="postButton button post _button"
 			@click="os.post()"
@@ -199,7 +199,7 @@ import * as os from "@/os";
 import { defaultStore } from "@/store";
 import { navbarItemDef } from "@/navbar";
 import { i18n } from "@/i18n";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { mainRouter } from "@/router";
 import { provideMetadataReceiver } from "@/scripts/page-metadata";
 import { deviceKind } from "@/scripts/device-kind";
diff --git a/packages/client/src/ui/visitor.vue b/packages/client/src/ui/visitor.vue
index 9b602b5b05..b7ad4175f3 100644
--- a/packages/client/src/ui/visitor.vue
+++ b/packages/client/src/ui/visitor.vue
@@ -4,11 +4,10 @@
 </template>
 
 <script lang="ts">
-import { defineAsyncComponent, defineComponent } from "vue";
+import { defineComponent } from "vue";
 import DesignA from "./visitor/a.vue";
 import DesignB from "./visitor/b.vue";
 import XCommon from "./_common_/common.vue";
-import { i18n } from "@/i18n";
 
 export default defineComponent({
 	components: {
diff --git a/packages/client/src/ui/visitor/a.vue b/packages/client/src/ui/visitor/a.vue
index 973c474284..6006e407d1 100644
--- a/packages/client/src/ui/visitor/a.vue
+++ b/packages/client/src/ui/visitor/a.vue
@@ -74,7 +74,7 @@
 </template>
 
 <script lang="ts">
-import { defineAsyncComponent, defineComponent } from "vue";
+import { defineComponent } from "vue";
 import XHeader from "./header.vue";
 import { host, instanceName } from "@/config";
 import { search } from "@/scripts/search";
diff --git a/packages/client/src/ui/visitor/header.vue b/packages/client/src/ui/visitor/header.vue
index 42d2e3955d..5458efb656 100644
--- a/packages/client/src/ui/visitor/header.vue
+++ b/packages/client/src/ui/visitor/header.vue
@@ -130,6 +130,7 @@ export default defineComponent({
 				!instance.disableLocalTimeline ||
 				!instance.disableRecommendedTimeline ||
 				!instance.disableGlobalTimeline,
+			icon,
 		};
 	},
 
diff --git a/packages/client/src/ui/visitor/kanban.vue b/packages/client/src/ui/visitor/kanban.vue
index f9c68c788a..c92dc9fde3 100644
--- a/packages/client/src/ui/visitor/kanban.vue
+++ b/packages/client/src/ui/visitor/kanban.vue
@@ -81,7 +81,7 @@
 </template>
 
 <script lang="ts">
-import { defineAsyncComponent, defineComponent } from "vue";
+import { defineComponent } from "vue";
 import { host, instanceName } from "@/config";
 import * as os from "@/os";
 import MkPagination from "@/components/MkPagination.vue";
diff --git a/packages/client/src/widgets/activity.vue b/packages/client/src/widgets/activity.vue
index 651307b1a2..beab1b068e 100644
--- a/packages/client/src/widgets/activity.vue
+++ b/packages/client/src/widgets/activity.vue
@@ -46,7 +46,7 @@ import MkHeatmap from "@/components/MkHeatmap.vue";
 import type { GetFormResultType } from "@/scripts/form";
 import * as os from "@/os";
 import MkContainer from "@/components/MkContainer.vue";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
diff --git a/packages/client/src/widgets/aiscript.vue b/packages/client/src/widgets/aiscript.vue
index 256620dfce..a00f143d85 100644
--- a/packages/client/src/widgets/aiscript.vue
+++ b/packages/client/src/widgets/aiscript.vue
@@ -27,14 +27,18 @@
 
 <script lang="ts" setup>
 import { ref } from "vue";
-import { AiScript, parse, utils } from "@syuilo/aiscript";
-import type { Widget, WidgetComponentExpose } from "./widget";
+import { Interpreter, Parser, utils } from "@syuilo/aiscript";
 import { useWidgetPropsManager } from "./widget";
+import type {
+	WidgetComponentEmits,
+	WidgetComponentExpose,
+	WidgetComponentProps,
+} from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import * as os from "@/os";
 import MkContainer from "@/components/MkContainer.vue";
 import { createAiScriptEnv } from "@/scripts/aiscript/api";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import { i18n } from "@/i18n";
 import icon from "@/scripts/icon";
 
@@ -55,11 +59,8 @@ const widgetPropsDef = {
 
 type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
 
-// 現時点ではvueの制限によりimportしたtypeをジェネリックに渡せない
-// const props = defineProps<WidgetComponentProps<WidgetProps>>();
-// const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
-const props = defineProps<{ widget?: Widget<WidgetProps> }>();
-const emit = defineEmits<{ (ev: "updateProps", props: WidgetProps) }>();
+const props = defineProps<WidgetComponentProps<WidgetProps>>();
+const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
 
 const { widgetProps, configure } = useWidgetPropsManager(
 	name,
@@ -76,9 +77,11 @@ const logs = ref<
 	}[]
 >([]);
 
+const parser = new Parser();
+
 const run = async () => {
 	logs.value = [];
-	const aiscript = new AiScript(
+	const aiscript = new Interpreter(
 		createAiScriptEnv({
 			storageKey: "widget",
 			token: $i?.token,
@@ -121,11 +124,11 @@ const run = async () => {
 
 	let ast;
 	try {
-		ast = parse(widgetProps.script);
+		ast = parser.parse(widgetProps.script);
 	} catch (err) {
 		os.alert({
 			type: "error",
-			text: "Syntax error :(",
+			text: `Syntax error : ${err}`,
 		});
 		return;
 	}
@@ -134,7 +137,7 @@ const run = async () => {
 	} catch (err) {
 		os.alert({
 			type: "error",
-			text: err,
+			text: String(err),
 		});
 	}
 };
diff --git a/packages/client/src/widgets/button.vue b/packages/client/src/widgets/button.vue
index b9378e0ea2..5d2c8fa3d0 100644
--- a/packages/client/src/widgets/button.vue
+++ b/packages/client/src/widgets/button.vue
@@ -8,17 +8,17 @@
 
 <script lang="ts" setup>
 import { onMounted, onUnmounted, ref, watch } from "vue";
-import { AiScript, parse, utils } from "@syuilo/aiscript";
-import type { Widget, WidgetComponentExpose } from "./widget";
-import {
+import { Interpreter, Parser } from "@syuilo/aiscript";
+import { useWidgetPropsManager } from "./widget";
+import type {
 	WidgetComponentEmits,
+	WidgetComponentExpose,
 	WidgetComponentProps,
-	useWidgetPropsManager,
 } from "./widget";
+import { createAiScriptEnv } from "@/scripts/aiscript/api";
 import type { GetFormResultType } from "@/scripts/form";
 import * as os from "@/os";
-import { createAiScriptEnv } from "@/scripts/aiscript/api";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 import MkButton from "@/components/MkButton.vue";
 
 const name = "button";
@@ -41,11 +41,8 @@ const widgetPropsDef = {
 
 type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
 
-// 現時点ではvueの制限によりimportしたtypeをジェネリックに渡せない
-// const props = defineProps<WidgetComponentProps<WidgetProps>>();
-// const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
-const props = defineProps<{ widget?: Widget<WidgetProps> }>();
-const emit = defineEmits<{ (ev: "updateProps", props: WidgetProps) }>();
+const props = defineProps<WidgetComponentProps<WidgetProps>>();
+const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
 
 const { widgetProps, configure } = useWidgetPropsManager(
 	name,
@@ -54,8 +51,10 @@ const { widgetProps, configure } = useWidgetPropsManager(
 	emit,
 );
 
+const parser = new Parser();
+
 const run = async () => {
-	const aiscript = new AiScript(
+	const aiscript = new Interpreter(
 		createAiScriptEnv({
 			storageKey: "widget",
 			token: $i?.token,
@@ -81,11 +80,11 @@ const run = async () => {
 
 	let ast;
 	try {
-		ast = parse(widgetProps.script);
+		ast = parser.parse(widgetProps.script);
 	} catch (err) {
 		os.alert({
 			type: "error",
-			text: "Syntax error :(",
+			text: `Syntax error: ${err}`,
 		});
 		return;
 	}
@@ -94,7 +93,7 @@ const run = async () => {
 	} catch (err) {
 		os.alert({
 			type: "error",
-			text: err,
+			text: String(err),
 		});
 	}
 };
@@ -105,8 +104,3 @@ defineExpose<WidgetComponentExpose>({
 	id: props.widget ? props.widget.id : null,
 });
 </script>
-
-<style lang="scss" scoped>
-.mkw-button {
-}
-</style>
diff --git a/packages/client/src/widgets/calendar.vue b/packages/client/src/widgets/calendar.vue
index eb2ec6c410..b37970eb36 100644
--- a/packages/client/src/widgets/calendar.vue
+++ b/packages/client/src/widgets/calendar.vue
@@ -44,17 +44,13 @@
 </template>
 
 <script lang="ts" setup>
-import { onUnmounted, ref } from "vue";
+import { ref } from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import { i18n } from "@/i18n";
 import { useInterval } from "@/scripts/use-interval";
-import { $i } from "@/account";
+import { $i } from "@/reactiveAccount";
 
 const name = "calendar";
 
diff --git a/packages/client/src/widgets/clock.vue b/packages/client/src/widgets/clock.vue
index 93926e4a2b..6cdd520d98 100644
--- a/packages/client/src/widgets/clock.vue
+++ b/packages/client/src/widgets/clock.vue
@@ -49,11 +49,7 @@
 import { computed } from "vue";
 
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import MkContainer from "@/components/MkContainer.vue";
 import MkAnalogClock from "@/components/MkAnalogClock.vue";
diff --git a/packages/client/src/widgets/digital-clock.vue b/packages/client/src/widgets/digital-clock.vue
index 3d6f26db9a..b6e281d3d9 100644
--- a/packages/client/src/widgets/digital-clock.vue
+++ b/packages/client/src/widgets/digital-clock.vue
@@ -15,7 +15,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, onUnmounted, ref, watch } from "vue";
+import { computed } from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
 import {
 	WidgetComponentEmits,
diff --git a/packages/client/src/widgets/instance-cloud.vue b/packages/client/src/widgets/instance-cloud.vue
index deda3c961a..c3f53dc014 100644
--- a/packages/client/src/widgets/instance-cloud.vue
+++ b/packages/client/src/widgets/instance-cloud.vue
@@ -22,11 +22,7 @@
 <script lang="ts" setup>
 import { ref, shallowRef } from "vue";
 
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { Widget, WidgetComponentExpose } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import MkContainer from "@/components/MkContainer.vue";
diff --git a/packages/client/src/widgets/online-users.vue b/packages/client/src/widgets/online-users.vue
index 6293094e71..4a3662887e 100644
--- a/packages/client/src/widgets/online-users.vue
+++ b/packages/client/src/widgets/online-users.vue
@@ -20,13 +20,9 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted, onUnmounted, ref } from "vue";
+import { ref } from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import * as os from "@/os";
 import { useInterval } from "@/scripts/use-interval";
diff --git a/packages/client/src/widgets/post-form.vue b/packages/client/src/widgets/post-form.vue
index e76d6ba6f1..873a67a31b 100644
--- a/packages/client/src/widgets/post-form.vue
+++ b/packages/client/src/widgets/post-form.vue
@@ -8,13 +8,8 @@
 </template>
 
 <script lang="ts" setup>
-import {} from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import XPostForm from "@/components/MkPostForm.vue";
 
diff --git a/packages/client/src/widgets/server-info.vue b/packages/client/src/widgets/server-info.vue
index 7b2b63d2a6..5ee6f31cde 100644
--- a/packages/client/src/widgets/server-info.vue
+++ b/packages/client/src/widgets/server-info.vue
@@ -31,11 +31,7 @@
 
 <script lang="ts" setup>
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import { host } from "@/config";
 
@@ -48,12 +44,7 @@ type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
 const props = defineProps<{ widget?: Widget<WidgetProps> }>();
 const emit = defineEmits<{ (ev: "updateProps", props: WidgetProps) }>();
 
-const { widgetProps, configure } = useWidgetPropsManager(
-	name,
-	widgetPropsDef,
-	props,
-	emit,
-);
+const { configure } = useWidgetPropsManager(name, widgetPropsDef, props, emit);
 
 defineExpose<WidgetComponentExpose>({
 	name,
diff --git a/packages/client/src/widgets/slideshow.vue b/packages/client/src/widgets/slideshow.vue
index 70601466da..6a7ec6c59d 100644
--- a/packages/client/src/widgets/slideshow.vue
+++ b/packages/client/src/widgets/slideshow.vue
@@ -23,13 +23,9 @@
 </template>
 
 <script lang="ts" setup>
-import { nextTick, onMounted, onUnmounted, reactive, ref } from "vue";
+import { onMounted, ref } from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 import * as os from "@/os";
 import { useInterval } from "@/scripts/use-interval";
diff --git a/packages/client/src/widgets/timeline.vue b/packages/client/src/widgets/timeline.vue
index d3ab198be9..a51ff32c9b 100644
--- a/packages/client/src/widgets/timeline.vue
+++ b/packages/client/src/widgets/timeline.vue
@@ -35,8 +35,8 @@
 					widgetProps.src === "list"
 						? widgetProps.list.name
 						: widgetProps.src === "antenna"
-						? widgetProps.antenna.name
-						: i18n.t("_timelines." + widgetProps.src)
+						  ? widgetProps.antenna.name
+						  : i18n.t("_timelines." + widgetProps.src)
 				}}</span>
 				<i
 					:class="
@@ -57,8 +57,8 @@
 					widgetProps.src === 'list'
 						? `list:${widgetProps.list.id}`
 						: widgetProps.src === 'antenna'
-						? `antenna:${widgetProps.antenna.id}`
-						: widgetProps.src
+						  ? `antenna:${widgetProps.antenna.id}`
+						  : widgetProps.src
 				"
 				:src="widgetProps.src"
 				:list="widgetProps.list ? widgetProps.list.id : null"
diff --git a/packages/client/src/widgets/unix-clock.vue b/packages/client/src/widgets/unix-clock.vue
index 3d2a893187..ba35769347 100644
--- a/packages/client/src/widgets/unix-clock.vue
+++ b/packages/client/src/widgets/unix-clock.vue
@@ -19,11 +19,7 @@
 <script lang="ts" setup>
 import { onUnmounted, ref, watch } from "vue";
 import type { Widget, WidgetComponentExpose } from "./widget";
-import {
-	WidgetComponentEmits,
-	WidgetComponentProps,
-	useWidgetPropsManager,
-} from "./widget";
+import { useWidgetPropsManager } from "./widget";
 import type { GetFormResultType } from "@/scripts/form";
 
 const name = "unixClock";
diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json
index 2d292dbfb0..f9b6e6560e 100644
--- a/packages/client/tsconfig.json
+++ b/packages/client/tsconfig.json
@@ -32,15 +32,9 @@
 		"types": [
 			"vite/client",
 		],
-		"lib": [
-			"esnext",
-			"dom"
-		],
+		"lib": ["esnext", "dom"],
 		"jsx": "preserve"
 	},
 	"compileOnSave": false,
-	"include": [
-		"./**/*.ts",
-		"./**/*.vue"
-	]
+	"include": ["./**/*.ts", "./**/*.vue"]
 }
diff --git a/packages/firefish-js/.editorconfig b/packages/firefish-js/.editorconfig
deleted file mode 100644
index da178f0707..0000000000
--- a/packages/firefish-js/.editorconfig
+++ /dev/null
@@ -1,7 +0,0 @@
-root = true
-
-[*]
-indent_style = tab
-indent_size = 2
-charset = utf-8
-insert_final_newline = true
diff --git a/packages/firefish-js/CHANGELOG.md b/packages/firefish-js/CHANGELOG.md
deleted file mode 100644
index 88a5c24610..0000000000
--- a/packages/firefish-js/CHANGELOG.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# 0.0.14
-- remove needless Object.freeze()
-
-# 0.0.13
-- expose ChannelConnection and Channels types
-
-# 0.0.12
-- fix a bug that cannot connect to streaming
-
-# 0.0.11
-- update user type
-- add missing main stream types
-
-# 0.0.10
-- add consts
-
-# 0.0.9
-- add list of api permission
-- Update Note type
-
-# 0.0.8
-- add type definition for `messagingMessage` event to main stream channel
-- Update Note type
-
-# 0.0.7
-- Notificationsの型を修正
-- MessagingMessageの型を修正
-- UserLiteの型を修正
-- apiでネイティブfetchを格納する際に無名関数でラップするように
diff --git a/packages/firefish-js/LICENSE b/packages/firefish-js/LICENSE
index 11c1f9ce22..243af42d34 100644
--- a/packages/firefish-js/LICENSE
+++ b/packages/firefish-js/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2021-2022 syuilo and other contributors
+Copyright (c) 2021-2023 Kainoa Kanter, Firefish contributors, Syuilo, and misskey-js contributors
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/packages/firefish-js/README.md b/packages/firefish-js/README.md
index 24839275ab..8a298e2293 100644
--- a/packages/firefish-js/README.md
+++ b/packages/firefish-js/README.md
@@ -1,9 +1,9 @@
-# Firefish.js
+# Firefish-js
 
-Fork of firefish.js for Firefish
+## Firefish SDK for Node.js, Bun, and browsers
 
-https://www.npmjs.com/package/firefish-js
+![npm badge](https://img.shields.io/npm/dm/firefish-js?logo=npm&color=%23CB0000)
 
-To fully build, run `pnpm i && pnpm run render`.
+Fork of [misskey-js](https://www.npmjs.com/package/misskey-js)
 
-![Parody of the Javascript logo with "CK" instead of "JS"](https://codeberg.org/repo-avatars/80771-4d86135f67b9a460cdd1be9e91648e5f)
+<https://www.npmjs.com/package/firefish-js>
diff --git a/packages/firefish-js/api-extractor.json b/packages/firefish-js/api-extractor.json
deleted file mode 100644
index a95281a6d5..0000000000
--- a/packages/firefish-js/api-extractor.json
+++ /dev/null
@@ -1,364 +0,0 @@
-/**
- * Config file for API Extractor.  For more info, please visit: https://api-extractor.com
- */
-{
-  "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
-
-  /**
-   * Optionally specifies another JSON config file that this file extends from.  This provides a way for
-   * standard settings to be shared across multiple projects.
-   *
-   * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains
-   * the "extends" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be
-   * resolved using NodeJS require().
-   *
-   * SUPPORTED TOKENS: none
-   * DEFAULT VALUE: ""
-   */
-  // "extends": "./shared/api-extractor-base.json"
-  // "extends": "my-package/include/api-extractor-base.json"
-
-  /**
-   * Determines the "<projectFolder>" token that can be used with other config file settings.  The project folder
-   * typically contains the tsconfig.json and package.json config files, but the path is user-defined.
-   *
-   * The path is resolved relative to the folder of the config file that contains the setting.
-   *
-   * The default value for "projectFolder" is the token "<lookup>", which means the folder is determined by traversing
-   * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder
-   * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error
-   * will be reported.
-   *
-   * SUPPORTED TOKENS: <lookup>
-   * DEFAULT VALUE: "<lookup>"
-   */
-  // "projectFolder": "..",
-
-  /**
-   * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor
-   * analyzes the symbols exported by this module.
-   *
-   * The file extension must be ".d.ts" and not ".ts".
-   *
-   * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-   * prepend a folder token such as "<projectFolder>".
-   *
-   * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-   */
-  "mainEntryPointFilePath": "<projectFolder>/built/index.d.ts",
-
-  /**
-   * A list of NPM package names whose exports should be treated as part of this package.
-   *
-   * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1",
-   * and another NPM package "library2" is embedded in this bundle.  Some types from library2 may become part
-   * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly
-   * imports library2.  To avoid this, we can specify:
-   *
-   *   "bundledPackages": [ "library2" ],
-   *
-   * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been
-   * local files for library1.
-   */
-  "bundledPackages": [],
-
-  /**
-   * Determines how the TypeScript compiler engine will be invoked by API Extractor.
-   */
-  "compiler": {
-    /**
-     * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * Note: This setting will be ignored if "overrideTsconfig" is used.
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<projectFolder>/tsconfig.json"
-     */
-    // "tsconfigFilePath": "<projectFolder>/tsconfig.json",
-    /**
-     * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.
-     * The object must conform to the TypeScript tsconfig schema:
-     *
-     * http://json.schemastore.org/tsconfig
-     *
-     * If omitted, then the tsconfig.json file will be read from the "projectFolder".
-     *
-     * DEFAULT VALUE: no overrideTsconfig section
-     */
-    // "overrideTsconfig": {
-    //   . . .
-    // }
-    /**
-     * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended
-     * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when
-     * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses
-     * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.
-     *
-     * DEFAULT VALUE: false
-     */
-    // "skipLibCheck": true,
-  },
-
-  /**
-   * Configures how the API report file (*.api.md) will be generated.
-   */
-  "apiReport": {
-    /**
-     * (REQUIRED) Whether to generate an API report.
-     */
-    "enabled": true
-
-    /**
-     * The filename for the API report files.  It will be combined with "reportFolder" or "reportTempFolder" to produce
-     * a full file path.
-     *
-     * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/".
-     *
-     * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<unscopedPackageName>.api.md"
-     */
-    // "reportFileName": "<unscopedPackageName>.api.md",
-
-    /**
-     * Specifies the folder where the API report file is written.  The file name portion is determined by
-     * the "reportFileName" setting.
-     *
-     * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,
-     * e.g. for an API review.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<projectFolder>/etc/"
-     */
-    // "reportFolder": "<projectFolder>/etc/",
-
-    /**
-     * Specifies the folder where the temporary report file is written.  The file name portion is determined by
-     * the "reportFileName" setting.
-     *
-     * After the temporary file is written to disk, it is compared with the file in the "reportFolder".
-     * If they are different, a production build will fail.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<projectFolder>/temp/"
-     */
-    // "reportTempFolder": "<projectFolder>/temp/"
-  },
-
-  /**
-   * Configures how the doc model file (*.api.json) will be generated.
-   */
-  "docModel": {
-    /**
-     * (REQUIRED) Whether to generate a doc model file.
-     */
-    "enabled": true
-
-    /**
-     * The output path for the doc model file.  The file extension should be ".api.json".
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<projectFolder>/temp/<unscopedPackageName>.api.json"
-     */
-    // "apiJsonFilePath": "<projectFolder>/temp/<unscopedPackageName>.api.json"
-  },
-
-  /**
-   * Configures how the .d.ts rollup file will be generated.
-   */
-  "dtsRollup": {
-    /**
-     * (REQUIRED) Whether to generate the .d.ts rollup file.
-     */
-    "enabled": false
-
-    /**
-     * Specifies the output path for a .d.ts rollup file to be generated without any trimming.
-     * This file will include all declarations that are exported by the main entry point.
-     *
-     * If the path is an empty string, then this file will not be written.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<projectFolder>/dist/<unscopedPackageName>.d.ts"
-     */
-    // "untrimmedFilePath": "<projectFolder>/dist/<unscopedPackageName>.d.ts",
-
-    /**
-     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release.
-     * This file will include only declarations that are marked as "@public" or "@beta".
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: ""
-     */
-    // "betaTrimmedFilePath": "<projectFolder>/dist/<unscopedPackageName>-beta.d.ts",
-
-    /**
-     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release.
-     * This file will include only declarations that are marked as "@public".
-     *
-     * If the path is an empty string, then this file will not be written.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: ""
-     */
-    // "publicTrimmedFilePath": "<projectFolder>/dist/<unscopedPackageName>-public.d.ts",
-
-    /**
-     * When a declaration is trimmed, by default it will be replaced by a code comment such as
-     * "Excluded from this release type: exampleMember".  Set "omitTrimmingComments" to true to remove the
-     * declaration completely.
-     *
-     * DEFAULT VALUE: false
-     */
-    // "omitTrimmingComments": true
-  },
-
-  /**
-   * Configures how the tsdoc-metadata.json file will be generated.
-   */
-  "tsdocMetadata": {
-    /**
-     * Whether to generate the tsdoc-metadata.json file.
-     *
-     * DEFAULT VALUE: true
-     */
-    // "enabled": true,
-    /**
-     * Specifies where the TSDoc metadata file should be written.
-     *
-     * The path is resolved relative to the folder of the config file that contains the setting; to change this,
-     * prepend a folder token such as "<projectFolder>".
-     *
-     * The default value is "<lookup>", which causes the path to be automatically inferred from the "tsdocMetadata",
-     * "typings" or "main" fields of the project's package.json.  If none of these fields are set, the lookup
-     * falls back to "tsdoc-metadata.json" in the package folder.
-     *
-     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>
-     * DEFAULT VALUE: "<lookup>"
-     */
-    // "tsdocMetadataFilePath": "<projectFolder>/dist/tsdoc-metadata.json"
-  },
-
-  /**
-   * Specifies what type of newlines API Extractor should use when writing output files.  By default, the output files
-   * will be written with Windows-style newlines.  To use POSIX-style newlines, specify "lf" instead.
-   * To use the OS's default newline kind, specify "os".
-   *
-   * DEFAULT VALUE: "crlf"
-   */
-  // "newlineKind": "crlf",
-
-  /**
-   * Configures how API Extractor reports error and warning messages produced during analysis.
-   *
-   * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.
-   */
-  "messages": {
-    /**
-     * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing
-     * the input .d.ts files.
-     *
-     * TypeScript message identifiers start with "TS" followed by an integer.  For example: "TS2551"
-     *
-     * DEFAULT VALUE:  A single "default" entry with logLevel=warning.
-     */
-    "compilerMessageReporting": {
-      /**
-       * Configures the default routing for messages that don't match an explicit rule in this table.
-       */
-      "default": {
-        /**
-         * Specifies whether the message should be written to the the tool's output log.  Note that
-         * the "addToApiReportFile" property may supersede this option.
-         *
-         * Possible values: "error", "warning", "none"
-         *
-         * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail
-         * and return a nonzero exit code.  For a non-production build (e.g. when "api-extractor run" includes
-         * the "--local" option), the warning is displayed but the build will not fail.
-         *
-         * DEFAULT VALUE: "warning"
-         */
-        "logLevel": "warning"
-
-        /**
-         * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),
-         * then the message will be written inside that file; otherwise, the message is instead logged according to
-         * the "logLevel" option.
-         *
-         * DEFAULT VALUE: false
-         */
-        // "addToApiReportFile": false
-      }
-
-      // "TS2551": {
-      //   "logLevel": "warning",
-      //   "addToApiReportFile": true
-      // },
-      //
-      // . . .
-    },
-
-    /**
-     * Configures handling of messages reported by API Extractor during its analysis.
-     *
-     * API Extractor message identifiers start with "ae-".  For example: "ae-extra-release-tag"
-     *
-     * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings
-     */
-    "extractorMessageReporting": {
-      "default": {
-        "logLevel": "none"
-        // "addToApiReportFile": false
-      }
-
-      // "ae-extra-release-tag": {
-      //   "logLevel": "warning",
-      //   "addToApiReportFile": true
-      // },
-      //
-      // . . .
-    },
-
-    /**
-     * Configures handling of messages reported by the TSDoc parser when analyzing code comments.
-     *
-     * TSDoc message identifiers start with "tsdoc-".  For example: "tsdoc-link-tag-unescaped-text"
-     *
-     * DEFAULT VALUE:  A single "default" entry with logLevel=warning.
-     */
-    "tsdocMessageReporting": {
-      "default": {
-        "logLevel": "warning"
-        // "addToApiReportFile": false
-      }
-
-      // "tsdoc-link-tag-unescaped-text": {
-      //   "logLevel": "warning",
-      //   "addToApiReportFile": true
-      // },
-      //
-      // . . .
-    }
-  }
-}
diff --git a/packages/firefish-js/bun.lockb b/packages/firefish-js/bun.lockb
new file mode 100755
index 0000000000..96788d2325
Binary files /dev/null and b/packages/firefish-js/bun.lockb differ
diff --git a/packages/firefish-js/codecov.yml b/packages/firefish-js/codecov.yml
deleted file mode 100644
index 5242987213..0000000000
--- a/packages/firefish-js/codecov.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-codecov:
-  token: d55e1270-f20a-4727-aa05-2bd57793315a
diff --git a/packages/firefish-js/etc/firefish-js.api.json b/packages/firefish-js/etc/firefish-js.api.json
deleted file mode 100644
index 8cb56a2d70..0000000000
--- a/packages/firefish-js/etc/firefish-js.api.json
+++ /dev/null
@@ -1,9814 +0,0 @@
-{
-	"metadata": {
-		"toolPackage": "@microsoft/api-extractor",
-		"toolVersion": "7.36.0",
-		"schemaVersion": 1011,
-		"oldestForwardsCompatibleVersion": 1001,
-		"tsdocConfig": {
-			"$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json",
-			"noStandardTags": true,
-			"tagDefinitions": [
-				{
-					"tagName": "@alpha",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@beta",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@defaultValue",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@decorator",
-					"syntaxKind": "block",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@deprecated",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@eventProperty",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@example",
-					"syntaxKind": "block",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@experimental",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@inheritDoc",
-					"syntaxKind": "inline"
-				},
-				{
-					"tagName": "@internal",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@label",
-					"syntaxKind": "inline"
-				},
-				{
-					"tagName": "@link",
-					"syntaxKind": "inline",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@override",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@packageDocumentation",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@param",
-					"syntaxKind": "block",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@privateRemarks",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@public",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@readonly",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@remarks",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@returns",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@sealed",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@see",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@throws",
-					"syntaxKind": "block",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@typeParam",
-					"syntaxKind": "block",
-					"allowMultiple": true
-				},
-				{
-					"tagName": "@virtual",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@betaDocumentation",
-					"syntaxKind": "modifier"
-				},
-				{
-					"tagName": "@internalRemarks",
-					"syntaxKind": "block"
-				},
-				{
-					"tagName": "@preapproved",
-					"syntaxKind": "modifier"
-				}
-			],
-			"supportForTags": {
-				"@alpha": true,
-				"@beta": true,
-				"@defaultValue": true,
-				"@decorator": true,
-				"@deprecated": true,
-				"@eventProperty": true,
-				"@example": true,
-				"@experimental": true,
-				"@inheritDoc": true,
-				"@internal": true,
-				"@label": true,
-				"@link": true,
-				"@override": true,
-				"@packageDocumentation": true,
-				"@param": true,
-				"@privateRemarks": true,
-				"@public": true,
-				"@readonly": true,
-				"@remarks": true,
-				"@returns": true,
-				"@sealed": true,
-				"@see": true,
-				"@throws": true,
-				"@typeParam": true,
-				"@virtual": true,
-				"@betaDocumentation": true,
-				"@internalRemarks": true,
-				"@preapproved": true
-			},
-			"reportUnsupportedHtmlElements": false
-		}
-	},
-	"kind": "Package",
-	"canonicalReference": "firefish-js!",
-	"docComment": "",
-	"name": "firefish-js",
-	"preserveMemberOrder": false,
-	"members": [
-		{
-			"kind": "EntryPoint",
-			"canonicalReference": "firefish-js!",
-			"name": "",
-			"preserveMemberOrder": false,
-			"members": [
-				{
-					"kind": "TypeAlias",
-					"canonicalReference": "firefish-js!Acct:type",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "export declare type Acct = "
-						},
-						{
-							"kind": "Content",
-							"text": "{\n\tusername: string;\n\thost: string | null;\n}"
-						},
-						{
-							"kind": "Content",
-							"text": ";"
-						}
-					],
-					"fileUrlPath": "src/acct.ts",
-					"releaseTag": "Public",
-					"name": "Acct",
-					"typeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Namespace",
-					"canonicalReference": "firefish-js!api:namespace",
-					"docComment": "",
-					"excerptTokens": [],
-					"fileUrlPath": "src/index.ts",
-					"releaseTag": "None",
-					"name": "api",
-					"preserveMemberOrder": false,
-					"members": [
-						{
-							"kind": "Class",
-							"canonicalReference": "firefish-js!api.APIClient:class",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare class APIClient "
-								}
-							],
-							"fileUrlPath": "src/api.ts",
-							"releaseTag": "Public",
-							"isAbstract": false,
-							"name": "APIClient",
-							"preserveMemberOrder": false,
-							"members": [
-								{
-									"kind": "Constructor",
-									"canonicalReference": "firefish-js!api.APIClient:constructor(1)",
-									"docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n",
-									"excerptTokens": [
-										{
-											"kind": "Content",
-											"text": "constructor(opts: "
-										},
-										{
-											"kind": "Content",
-											"text": "{\n\t\torigin: "
-										},
-										{
-											"kind": "Reference",
-											"text": "APIClient",
-											"canonicalReference": "firefish-js!api.APIClient:class"
-										},
-										{
-											"kind": "Content",
-											"text": "[\"origin\"];\n\t\tcredential?: "
-										},
-										{
-											"kind": "Reference",
-											"text": "APIClient",
-											"canonicalReference": "firefish-js!api.APIClient:class"
-										},
-										{
-											"kind": "Content",
-											"text": "[\"credential\"];\n\t\tfetch?: "
-										},
-										{
-											"kind": "Reference",
-											"text": "APIClient",
-											"canonicalReference": "firefish-js!api.APIClient:class"
-										},
-										{
-											"kind": "Content",
-											"text": "[\"fetch\"] | null | undefined;\n\t}"
-										},
-										{
-											"kind": "Content",
-											"text": ");"
-										}
-									],
-									"releaseTag": "Public",
-									"isProtected": false,
-									"overloadIndex": 1,
-									"parameters": [
-										{
-											"parameterName": "opts",
-											"parameterTypeTokenRange": {
-												"startIndex": 1,
-												"endIndex": 8
-											},
-											"isOptional": false
-										}
-									]
-								},
-								{
-									"kind": "Property",
-									"canonicalReference": "firefish-js!api.APIClient#credential:member",
-									"docComment": "",
-									"excerptTokens": [
-										{
-											"kind": "Content",
-											"text": "credential: "
-										},
-										{
-											"kind": "Content",
-											"text": "string | null | undefined"
-										},
-										{
-											"kind": "Content",
-											"text": ";"
-										}
-									],
-									"isReadonly": false,
-									"isOptional": false,
-									"releaseTag": "Public",
-									"name": "credential",
-									"propertyTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isStatic": false,
-									"isProtected": false,
-									"isAbstract": false
-								},
-								{
-									"kind": "Property",
-									"canonicalReference": "firefish-js!api.APIClient#fetch:member",
-									"docComment": "",
-									"excerptTokens": [
-										{
-											"kind": "Content",
-											"text": "fetch: "
-										},
-										{
-											"kind": "Reference",
-											"text": "FetchLike",
-											"canonicalReference": "firefish-js!api.FetchLike:type"
-										},
-										{
-											"kind": "Content",
-											"text": ";"
-										}
-									],
-									"isReadonly": false,
-									"isOptional": false,
-									"releaseTag": "Public",
-									"name": "fetch",
-									"propertyTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isStatic": false,
-									"isProtected": false,
-									"isAbstract": false
-								},
-								{
-									"kind": "Property",
-									"canonicalReference": "firefish-js!api.APIClient#origin:member",
-									"docComment": "",
-									"excerptTokens": [
-										{
-											"kind": "Content",
-											"text": "origin: "
-										},
-										{
-											"kind": "Content",
-											"text": "string"
-										},
-										{
-											"kind": "Content",
-											"text": ";"
-										}
-									],
-									"isReadonly": false,
-									"isOptional": false,
-									"releaseTag": "Public",
-									"name": "origin",
-									"propertyTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isStatic": false,
-									"isProtected": false,
-									"isAbstract": false
-								},
-								{
-									"kind": "Method",
-									"canonicalReference": "firefish-js!api.APIClient#request:member(1)",
-									"docComment": "",
-									"excerptTokens": [
-										{
-											"kind": "Content",
-											"text": "request<E extends "
-										},
-										{
-											"kind": "Content",
-											"text": "keyof "
-										},
-										{
-											"kind": "Reference",
-											"text": "Endpoints",
-											"canonicalReference": "firefish-js!Endpoints:type"
-										},
-										{
-											"kind": "Content",
-											"text": ", P extends "
-										},
-										{
-											"kind": "Reference",
-											"text": "Endpoints",
-											"canonicalReference": "firefish-js!Endpoints:type"
-										},
-										{
-											"kind": "Content",
-											"text": "[E][\"req\"]"
-										},
-										{
-											"kind": "Content",
-											"text": ">(\n\t\tendpoint: "
-										},
-										{
-											"kind": "Content",
-											"text": "E"
-										},
-										{
-											"kind": "Content",
-											"text": ",\n\t\tparams?: "
-										},
-										{
-											"kind": "Content",
-											"text": "P"
-										},
-										{
-											"kind": "Content",
-											"text": ",\n\t\tcredential?: "
-										},
-										{
-											"kind": "Content",
-											"text": "string | null | undefined"
-										},
-										{
-											"kind": "Content",
-											"text": ",\n\t): "
-										},
-										{
-											"kind": "Reference",
-											"text": "Promise",
-											"canonicalReference": "!Promise:interface"
-										},
-										{
-											"kind": "Content",
-											"text": "<\n\t\t"
-										},
-										{
-											"kind": "Reference",
-											"text": "Endpoints",
-											"canonicalReference": "firefish-js!Endpoints:type"
-										},
-										{
-											"kind": "Content",
-											"text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 0> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 0>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 1> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 1>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 2> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 2>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 3> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 3>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 4> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 4>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 5> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 5>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 6> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 6>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 7> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 7>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 8> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 8>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "IsCaseMatched",
-											"canonicalReference": "firefish-js!~IsCaseMatched:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 9> extends true\n\t\t\t\t? "
-										},
-										{
-											"kind": "Reference",
-											"text": "GetCaseResult",
-											"canonicalReference": "firefish-js!~GetCaseResult:type"
-										},
-										{
-											"kind": "Content",
-											"text": "<E, P, 9>\n\t\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "Endpoints",
-											"canonicalReference": "firefish-js!Endpoints:type"
-										},
-										{
-											"kind": "Content",
-											"text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: "
-										},
-										{
-											"kind": "Reference",
-											"text": "Endpoints",
-											"canonicalReference": "firefish-js!Endpoints:type"
-										},
-										{
-											"kind": "Content",
-											"text": "[E][\"res\"]\n\t>"
-										},
-										{
-											"kind": "Content",
-											"text": ";"
-										}
-									],
-									"typeParameters": [
-										{
-											"typeParameterName": "E",
-											"constraintTokenRange": {
-												"startIndex": 1,
-												"endIndex": 3
-											},
-											"defaultTypeTokenRange": {
-												"startIndex": 0,
-												"endIndex": 0
-											}
-										},
-										{
-											"typeParameterName": "P",
-											"constraintTokenRange": {
-												"startIndex": 4,
-												"endIndex": 6
-											},
-											"defaultTypeTokenRange": {
-												"startIndex": 0,
-												"endIndex": 0
-											}
-										}
-									],
-									"isStatic": false,
-									"returnTypeTokenRange": {
-										"startIndex": 13,
-										"endIndex": 61
-									},
-									"releaseTag": "Public",
-									"isProtected": false,
-									"overloadIndex": 1,
-									"parameters": [
-										{
-											"parameterName": "endpoint",
-											"parameterTypeTokenRange": {
-												"startIndex": 7,
-												"endIndex": 8
-											},
-											"isOptional": false
-										},
-										{
-											"parameterName": "params",
-											"parameterTypeTokenRange": {
-												"startIndex": 9,
-												"endIndex": 10
-											},
-											"isOptional": true
-										},
-										{
-											"parameterName": "credential",
-											"parameterTypeTokenRange": {
-												"startIndex": 11,
-												"endIndex": 12
-											},
-											"isOptional": true
-										}
-									],
-									"isOptional": false,
-									"isAbstract": false,
-									"name": "request"
-								}
-							],
-							"implementsTokenRanges": []
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!api.APIError:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type APIError = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/api.ts",
-							"releaseTag": "Public",
-							"name": "APIError",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 4
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!api.FetchLike:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type FetchLike = "
-								},
-								{
-									"kind": "Content",
-									"text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "RequestCredentials",
-									"canonicalReference": "!RequestCredentials:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\tcache?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "RequestCache",
-									"canonicalReference": "!RequestCache:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t},\n) => "
-								},
-								{
-									"kind": "Reference",
-									"text": "Promise",
-									"canonicalReference": "!Promise:interface"
-								},
-								{
-									"kind": "Content",
-									"text": "<{\n\tstatus: number;\n\tjson(): "
-								},
-								{
-									"kind": "Reference",
-									"text": "Promise",
-									"canonicalReference": "!Promise:interface"
-								},
-								{
-									"kind": "Content",
-									"text": "<any>;\n}>"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/api.ts",
-							"releaseTag": "Public",
-							"name": "FetchLike",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 10
-							}
-						},
-						{
-							"kind": "Function",
-							"canonicalReference": "firefish-js!api.isAPIError:function(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare function isAPIError(reason: "
-								},
-								{
-									"kind": "Content",
-									"text": "any"
-								},
-								{
-									"kind": "Content",
-									"text": "): "
-								},
-								{
-									"kind": "Reference",
-									"text": "reason",
-									"canonicalReference": "firefish-js!~reason"
-								},
-								{
-									"kind": "Content",
-									"text": " is "
-								},
-								{
-									"kind": "Reference",
-									"text": "APIError",
-									"canonicalReference": "firefish-js!api.APIError:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/api.ts",
-							"returnTypeTokenRange": {
-								"startIndex": 3,
-								"endIndex": 6
-							},
-							"releaseTag": "Public",
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "reason",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								}
-							],
-							"name": "isAPIError"
-						}
-					]
-				},
-				{
-					"kind": "Class",
-					"canonicalReference": "firefish-js!ChannelConnection:class",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "export declare abstract class Connection<\n\tChannel extends "
-						},
-						{
-							"kind": "Reference",
-							"text": "AnyOf",
-							"canonicalReference": "firefish-js!~AnyOf:type"
-						},
-						{
-							"kind": "Content",
-							"text": "<"
-						},
-						{
-							"kind": "Reference",
-							"text": "Channels",
-							"canonicalReference": "firefish-js!Channels:type"
-						},
-						{
-							"kind": "Content",
-							"text": ">"
-						},
-						{
-							"kind": "Content",
-							"text": " = "
-						},
-						{
-							"kind": "Content",
-							"text": "any"
-						},
-						{
-							"kind": "Content",
-							"text": ",\n> extends "
-						},
-						{
-							"kind": "Reference",
-							"text": "EventEmitter",
-							"canonicalReference": "eventemitter3!EventEmitter.EventEmitter"
-						},
-						{
-							"kind": "Content",
-							"text": "<Channel[\"events\"]>"
-						},
-						{
-							"kind": "Content",
-							"text": " "
-						}
-					],
-					"fileUrlPath": "src/streaming.ts",
-					"releaseTag": "Public",
-					"typeParameters": [
-						{
-							"typeParameterName": "Channel",
-							"constraintTokenRange": {
-								"startIndex": 1,
-								"endIndex": 5
-							},
-							"defaultTypeTokenRange": {
-								"startIndex": 6,
-								"endIndex": 7
-							}
-						}
-					],
-					"isAbstract": true,
-					"name": "ChannelConnection",
-					"preserveMemberOrder": false,
-					"members": [
-						{
-							"kind": "Constructor",
-							"canonicalReference": "firefish-js!ChannelConnection:constructor(1)",
-							"docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "constructor(stream: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Stream",
-									"canonicalReference": "firefish-js!Stream:class"
-								},
-								{
-									"kind": "Content",
-									"text": ", channel: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ", name?: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ");"
-								}
-							],
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "stream",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "channel",
-									"parameterTypeTokenRange": {
-										"startIndex": 3,
-										"endIndex": 4
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "name",
-									"parameterTypeTokenRange": {
-										"startIndex": 5,
-										"endIndex": 6
-									},
-									"isOptional": true
-								}
-							]
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#channel:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "channel: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "channel",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": false
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!ChannelConnection#dispose:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "abstract dispose(): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [],
-							"isOptional": false,
-							"isAbstract": true,
-							"name": "dispose"
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#id:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "abstract id: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "id",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": true
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#inCount:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "inCount: "
-								},
-								{
-									"kind": "Content",
-									"text": "number"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "inCount",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": false
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#name:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "name?: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": true,
-							"releaseTag": "Public",
-							"name": "name",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": false
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#outCount:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "outCount: "
-								},
-								{
-									"kind": "Content",
-									"text": "number"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "outCount",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": false
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!ChannelConnection#send:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "send<T extends "
-								},
-								{
-									"kind": "Content",
-									"text": "keyof Channel[\"receives\"]"
-								},
-								{
-									"kind": "Content",
-									"text": ">(\n\t\ttype: "
-								},
-								{
-									"kind": "Content",
-									"text": "T"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t\tbody: "
-								},
-								{
-									"kind": "Content",
-									"text": "Channel[\"receives\"][T]"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"typeParameters": [
-								{
-									"typeParameterName": "T",
-									"constraintTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"defaultTypeTokenRange": {
-										"startIndex": 0,
-										"endIndex": 0
-									}
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 7,
-								"endIndex": 8
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "type",
-									"parameterTypeTokenRange": {
-										"startIndex": 3,
-										"endIndex": 4
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "body",
-									"parameterTypeTokenRange": {
-										"startIndex": 5,
-										"endIndex": 6
-									},
-									"isOptional": false
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "send"
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!ChannelConnection#stream:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "protected stream: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Stream",
-									"canonicalReference": "firefish-js!Stream:class"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "stream",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": true,
-							"isAbstract": false
-						}
-					],
-					"extendsTokenRange": {
-						"startIndex": 8,
-						"endIndex": 10
-					},
-					"implementsTokenRanges": []
-				},
-				{
-					"kind": "TypeAlias",
-					"canonicalReference": "firefish-js!Channels:type",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "export declare type Channels = "
-						},
-						{
-							"kind": "Content",
-							"text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tmention: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\treply: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\trenote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tfollow: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tfollowed: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tunfollow: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tmeUpdated: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MeDetailed",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tpageEvent: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "PageEvent",
-							"canonicalReference": "firefish-js!entities.PageEvent:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tunreadMention: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FIXME",
-							"canonicalReference": "firefish-js!~FIXME:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tsignin: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FIXME",
-							"canonicalReference": "firefish-js!~FIXME:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\treadAntenna: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tgroup?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserGroup",
-							"canonicalReference": "firefish-js!entities.UserGroup:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t\tdeleted: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"]) => void;\n\t\t\tread: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FIXME",
-							"canonicalReference": "firefish-js!~FIXME:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FIXME",
-							"canonicalReference": "firefish-js!~FIXME:type"
-						},
-						{
-							"kind": "Content",
-							"text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}"
-						},
-						{
-							"kind": "Content",
-							"text": ";"
-						}
-					],
-					"fileUrlPath": "src/streaming.types.ts",
-					"releaseTag": "Public",
-					"name": "Channels",
-					"typeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 76
-					}
-				},
-				{
-					"kind": "TypeAlias",
-					"canonicalReference": "firefish-js!Endpoints:type",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "export declare type Endpoints = "
-						},
-						{
-							"kind": "Content",
-							"text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Ad",
-							"canonicalReference": "firefish-js!entities.Ad:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Announcement",
-							"canonicalReference": "firefish-js!entities.Announcement:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Announcement",
-							"canonicalReference": "firefish-js!entities.Announcement:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Announcement",
-							"canonicalReference": "firefish-js!entities.Announcement:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Announcement",
-							"canonicalReference": "firefish-js!entities.Announcement:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Antenna",
-							"canonicalReference": "firefish-js!entities.Antenna:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Record",
-							"canonicalReference": "!Record:type"
-						},
-						{
-							"kind": "Content",
-							"text": "<string, any>;\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\t  }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\t  };\n\t};\n\t\"app/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "App",
-							"canonicalReference": "firefish-js!entities.App:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "App",
-							"canonicalReference": "firefish-js!entities.App:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "App",
-							"canonicalReference": "firefish-js!entities.App:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "AuthSession",
-							"canonicalReference": "firefish-js!entities.AuthSession:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Blocking",
-							"canonicalReference": "firefish-js!entities.Blocking:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Blocking",
-							"canonicalReference": "firefish-js!entities.Blocking:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Blocking",
-							"canonicalReference": "firefish-js!entities.Blocking:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Clip",
-							"canonicalReference": "firefish-js!entities.Clip:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\tdrive: {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\ttype?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tfolderId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFolder",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FollowingFolloweePopulated",
-							"canonicalReference": "firefish-js!entities.FollowingFolloweePopulated:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FollowingFolloweePopulated",
-							"canonicalReference": "firefish-js!entities.FollowingFolloweePopulated:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Instance",
-							"canonicalReference": "firefish-js!entities.Instance:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Instance",
-							"canonicalReference": "firefish-js!entities.Instance:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FollowRequest",
-							"canonicalReference": "firefish-js!entities.FollowRequest:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "GalleryPost",
-							"canonicalReference": "firefish-js!entities.GalleryPost:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\ti: {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteFavorite",
-							"canonicalReference": "firefish-js!entities.NoteFavorite:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteFavorite",
-							"canonicalReference": "firefish-js!entities.NoteFavorite:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteFavorite",
-							"canonicalReference": "firefish-js!entities.NoteFavorite:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/move\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"type\"][];\n\t\t\texcludeTypes?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"type\"][];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MeDetailed",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Record",
-							"canonicalReference": "!Record:type"
-						},
-						{
-							"kind": "Content",
-							"text": "<string, any>;\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DateString",
-							"canonicalReference": "firefish-js!entities.DateString:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Record",
-							"canonicalReference": "!Record:type"
-						},
-						{
-							"kind": "Content",
-							"text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Signin",
-							"canonicalReference": "firefish-js!entities.Signin:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Signin",
-							"canonicalReference": "firefish-js!entities.Signin:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Signin",
-							"canonicalReference": "firefish-js!entities.Signin:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MeDetailed",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MeDetailed",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tbannerId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MeDetailed",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tgroupId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserGroup",
-							"canonicalReference": "firefish-js!entities.UserGroup:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tgroupId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserGroup",
-							"canonicalReference": "firefish-js!entities.UserGroup:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "DriveFile",
-							"canonicalReference": "firefish-js!entities.DriveFile:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "MessagingMessage",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t"
-						},
-						{
-							"kind": "Reference",
-							"text": "DetailedInstanceMetadata",
-							"canonicalReference": "firefish-js!entities.DetailedInstanceMetadata:type"
-						},
-						{
-							"kind": "Content",
-							"text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t"
-						},
-						{
-							"kind": "Reference",
-							"text": "LiteInstanceMetadata",
-							"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type"
-						},
-						{
-							"kind": "Content",
-							"text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t"
-						},
-						{
-							"kind": "Reference",
-							"text": "LiteInstanceMetadata",
-							"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type"
-						},
-						{
-							"kind": "Content",
-							"text": " | "
-						},
-						{
-							"kind": "Reference",
-							"text": "DetailedInstanceMetadata",
-							"canonicalReference": "firefish-js!entities.DetailedInstanceMetadata:type"
-						},
-						{
-							"kind": "Content",
-							"text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: "
-						},
-						{
-							"kind": "Reference",
-							"text": "LiteInstanceMetadata",
-							"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteSubmitReq",
-							"canonicalReference": "firefish-js!~NoteSubmitReq:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: {\n\t\t\tcreatedNote: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteSubmitReq",
-							"canonicalReference": "firefish-js!~NoteSubmitReq:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: {\n\t\t\tcreatedNote: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoteReaction",
-							"canonicalReference": "firefish-js!entities.NoteReaction:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Notification",
-							"canonicalReference": "firefish-js!entities.Notification_2:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Page",
-							"canonicalReference": "firefish-js!entities.Page:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"room/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\tstats: {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Stats",
-							"canonicalReference": "firefish-js!entities.Stats:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"server-info\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "ServerInfo",
-							"canonicalReference": "firefish-js!entities.ServerInfo:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserSorting",
-							"canonicalReference": "firefish-js!entities.UserSorting:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\torigin?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "OriginType",
-							"canonicalReference": "firefish-js!entities.OriginType:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tusername?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"username\"];\n\t\t\thost?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FollowingFollowerPopulated",
-							"canonicalReference": "firefish-js!entities.FollowingFollowerPopulated:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tusername?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"username\"];\n\t\t\thost?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Following",
-							"canonicalReference": "firefish-js!entities.Following:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "FollowingFolloweePopulated",
-							"canonicalReference": "firefish-js!entities.FollowingFolloweePopulated:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserGroup",
-							"canonicalReference": "firefish-js!entities.UserGroup:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "NoParams",
-							"canonicalReference": "firefish-js!~NoParams:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserList",
-							"canonicalReference": "firefish-js!entities.UserList:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tuntilId?: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "Note",
-							"canonicalReference": "firefish-js!entities.Note:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/search\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| "
-						},
-						{
-							"kind": "Reference",
-							"text": "ShowUserReq",
-							"canonicalReference": "firefish-js!~ShowUserReq:type"
-						},
-						{
-							"kind": "Content",
-							"text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"][];\n\t\t\t  };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: "
-						},
-						{
-							"kind": "Reference",
-							"text": "User",
-							"canonicalReference": "firefish-js!entities.User:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t"
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: "
-						},
-						{
-							"kind": "Reference",
-							"text": "UserDetailed",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t\tres: "
-						},
-						{
-							"kind": "Reference",
-							"text": "TODO",
-							"canonicalReference": "firefish-js!~TODO:type"
-						},
-						{
-							"kind": "Content",
-							"text": ";\n\t};\n}"
-						},
-						{
-							"kind": "Content",
-							"text": ";"
-						}
-					],
-					"fileUrlPath": "src/api.types.ts",
-					"releaseTag": "Public",
-					"name": "Endpoints",
-					"typeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 1158
-					}
-				},
-				{
-					"kind": "Namespace",
-					"canonicalReference": "firefish-js!entities:namespace",
-					"docComment": "",
-					"excerptTokens": [],
-					"fileUrlPath": "src/index.ts",
-					"releaseTag": "None",
-					"name": "entities",
-					"preserveMemberOrder": false,
-					"members": [
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Ad:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Ad = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Ad",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Announcement:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Announcement = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tupdatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Announcement",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Antenna:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Antenna = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tuserGroupId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Antenna",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 10
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.App:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type App = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "App",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.AuthSession:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type AuthSession = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tapp: "
-								},
-								{
-									"kind": "Reference",
-									"text": "App",
-									"canonicalReference": "firefish-js!entities.App:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\ttoken: string;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "AuthSession",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 6
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Blocking:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Blocking = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tblockeeId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tblockee: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserDetailed",
-									"canonicalReference": "firefish-js!entities.UserDetailed:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Blocking",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 10
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Channel:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Channel = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Channel",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 4
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Clip:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Clip = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Clip",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.CustomEmoji:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type CustomEmoji = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "CustomEmoji",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.DateString:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type DateString = "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "DateString",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.DetailedInstanceMetadata:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type DetailedInstanceMetadata = "
-								},
-								{
-									"kind": "Reference",
-									"text": "LiteInstanceMetadata",
-									"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type"
-								},
-								{
-									"kind": "Content",
-									"text": " & {\n\tfeatures: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "DetailedInstanceMetadata",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 5
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.DriveFile:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type DriveFile = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "DriveFile",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.DriveFolder:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type DriveFolder = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "DriveFolder",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Following:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Following = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tfollowerId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tfolloweeId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Following",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 10
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.FollowingFolloweePopulated:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type FollowingFolloweePopulated = "
-								},
-								{
-									"kind": "Reference",
-									"text": "Following",
-									"canonicalReference": "firefish-js!entities.Following:type"
-								},
-								{
-									"kind": "Content",
-									"text": " & {\n\tfollowee: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserDetailed",
-									"canonicalReference": "firefish-js!entities.UserDetailed:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "FollowingFolloweePopulated",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 5
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.FollowingFollowerPopulated:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type FollowingFollowerPopulated = "
-								},
-								{
-									"kind": "Reference",
-									"text": "Following",
-									"canonicalReference": "firefish-js!entities.Following:type"
-								},
-								{
-									"kind": "Content",
-									"text": " & {\n\tfollower: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserDetailed",
-									"canonicalReference": "firefish-js!entities.UserDetailed:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "FollowingFollowerPopulated",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 5
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.FollowRequest:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type FollowRequest = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tfollower: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tfollowee: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "FollowRequest",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.GalleryPost:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type GalleryPost = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "GalleryPost",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.ID:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type ID = "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "ID",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Instance:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Instance = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcaughtAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tlastCommunicatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Instance",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 14
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.InstanceMetadata:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type InstanceMetadata =\n\t"
-								},
-								{
-									"kind": "Content",
-									"text": "| "
-								},
-								{
-									"kind": "Reference",
-									"text": "LiteInstanceMetadata",
-									"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type"
-								},
-								{
-									"kind": "Content",
-									"text": "\n\t| "
-								},
-								{
-									"kind": "Reference",
-									"text": "DetailedInstanceMetadata",
-									"canonicalReference": "firefish-js!entities.DetailedInstanceMetadata:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "InstanceMetadata",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 5
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.LiteInstanceMetadata:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type LiteInstanceMetadata = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: "
-								},
-								{
-									"kind": "Reference",
-									"text": "CustomEmoji",
-									"canonicalReference": "firefish-js!entities.CustomEmoji:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[];\n\tads: {\n\t\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "LiteInstanceMetadata",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 6
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.MeDetailed:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type MeDetailed = "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserDetailed",
-									"canonicalReference": "firefish-js!entities.UserDetailed:type"
-								},
-								{
-									"kind": "Content",
-									"text": " & {\n\tavatarId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tbannerId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>;\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "MeDetailed",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 9
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.MessagingMessage:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type MessagingMessage = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tfile: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tfileId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"][];\n\ttext: string | null;\n\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\trecipient?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\trecipientId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"] | null;\n\tgroup?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserGroup",
-									"canonicalReference": "firefish-js!entities.UserGroup:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tgroupId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserGroup",
-									"canonicalReference": "firefish-js!entities.UserGroup:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"] | null;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "MessagingMessage",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 24
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Note:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Note = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\treply?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\treplyId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\trenote?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\trenoteId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tfiles: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[];\n\tfileIds: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Channel",
-									"canonicalReference": "firefish-js!entities.Channel:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, number>;\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tisHidden?: boolean;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Note",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 32
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.NoteFavorite:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type NoteFavorite = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tnoteId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "NoteFavorite",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 10
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.NoteReaction:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type NoteReaction = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserLite",
-									"canonicalReference": "firefish-js!entities.UserLite:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\ttype: string;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "NoteReaction",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Notification:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Notification = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t\t\tnote: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t  }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t  }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t  }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t  }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserGroup",
-									"canonicalReference": "firefish-js!entities.UserGroup:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\t\t\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\t  }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t  }\n)"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Notification",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 60
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.OriginType:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type OriginType = "
-								},
-								{
-									"kind": "Content",
-									"text": "\"combined\" | \"local\" | \"remote\""
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "OriginType",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Page:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Page = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tupdatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcontent: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>[];\n\tvariables: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"] | null;\n\teyeCatchingImage: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DriveFile",
-									"canonicalReference": "firefish-js!entities.DriveFile:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Page",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 20
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.PageEvent:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type PageEvent = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tpageId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Page",
-									"canonicalReference": "firefish-js!entities.Page:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"];\n\tuser: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "PageEvent",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.ServerInfo:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type ServerInfo = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "ServerInfo",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Signin:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Signin = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tip: string;\n\theaders: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Record",
-									"canonicalReference": "!Record:type"
-								},
-								{
-									"kind": "Content",
-									"text": "<string, any>;\n\tsuccess: boolean;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Signin",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.Stats:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type Stats = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "Stats",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.User:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type User = "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserLite",
-									"canonicalReference": "firefish-js!entities.UserLite:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserDetailed",
-									"canonicalReference": "firefish-js!entities.UserDetailed:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "User",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 4
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.UserDetailed:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type UserDetailed = "
-								},
-								{
-									"kind": "Reference",
-									"text": "UserLite",
-									"canonicalReference": "firefish-js!entities.UserLite:type"
-								},
-								{
-									"kind": "Content",
-									"text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[];\n\tpinnedNotes: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Note",
-									"canonicalReference": "firefish-js!entities.Note:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[];\n\tpinnedPage: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Page",
-									"canonicalReference": "firefish-js!entities.Page:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": " | null;\n\turi: string | null;\n\turl: string | null;\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "UserDetailed",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 15
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.UserGroup:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type UserGroup = "
-								},
-								{
-									"kind": "Reference",
-									"text": "TODO",
-									"canonicalReference": "firefish-js!~TODO_2:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "UserGroup",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.UserList:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type UserList = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tcreatedAt: "
-								},
-								{
-									"kind": "Reference",
-									"text": "DateString",
-									"canonicalReference": "firefish-js!entities.DateString:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tname: string;\n\tuserIds: "
-								},
-								{
-									"kind": "Reference",
-									"text": "User",
-									"canonicalReference": "firefish-js!entities.User:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"id\"][];\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "UserList",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 8
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.UserLite:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type UserLite = "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\tid: "
-								},
-								{
-									"kind": "Reference",
-									"text": "ID",
-									"canonicalReference": "firefish-js!entities.ID:type"
-								},
-								{
-									"kind": "Content",
-									"text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"name\"];\n\t\tsoftwareName: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"softwareName\"];\n\t\tsoftwareVersion: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"softwareVersion\"];\n\t\ticonUrl: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"iconUrl\"];\n\t\tfaviconUrl: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"faviconUrl\"];\n\t\tthemeColor: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Instance",
-									"canonicalReference": "firefish-js!entities.Instance:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[\"themeColor\"];\n\t};\n}"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "UserLite",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 16
-							}
-						},
-						{
-							"kind": "TypeAlias",
-							"canonicalReference": "firefish-js!entities.UserSorting:type",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "export declare type UserSorting =\n\t"
-								},
-								{
-									"kind": "Content",
-									"text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\""
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"fileUrlPath": "src/entities.ts",
-							"releaseTag": "Public",
-							"name": "UserSorting",
-							"typeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							}
-						}
-					]
-				},
-				{
-					"kind": "Variable",
-					"canonicalReference": "firefish-js!ffVisibility:var",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "ffVisibility: "
-						},
-						{
-							"kind": "Content",
-							"text": "readonly [\"public\", \"followers\", \"private\"]"
-						}
-					],
-					"fileUrlPath": "src/index.ts",
-					"isReadonly": true,
-					"releaseTag": "Public",
-					"name": "ffVisibility",
-					"variableTypeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Variable",
-					"canonicalReference": "firefish-js!mutedNoteReasons:var",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "mutedNoteReasons: "
-						},
-						{
-							"kind": "Content",
-							"text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]"
-						}
-					],
-					"fileUrlPath": "src/index.ts",
-					"isReadonly": true,
-					"releaseTag": "Public",
-					"name": "mutedNoteReasons",
-					"variableTypeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Variable",
-					"canonicalReference": "firefish-js!noteVisibilities:var",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "noteVisibilities: "
-						},
-						{
-							"kind": "Content",
-							"text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]"
-						}
-					],
-					"fileUrlPath": "src/index.ts",
-					"isReadonly": true,
-					"releaseTag": "Public",
-					"name": "noteVisibilities",
-					"variableTypeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Variable",
-					"canonicalReference": "firefish-js!notificationTypes:var",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "notificationTypes: "
-						},
-						{
-							"kind": "Content",
-							"text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]"
-						}
-					],
-					"fileUrlPath": "src/index.ts",
-					"isReadonly": true,
-					"releaseTag": "Public",
-					"name": "notificationTypes",
-					"variableTypeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Variable",
-					"canonicalReference": "firefish-js!permissions:var",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "permissions: "
-						},
-						{
-							"kind": "Content",
-							"text": "string[]"
-						}
-					],
-					"fileUrlPath": "src/index.ts",
-					"isReadonly": true,
-					"releaseTag": "Public",
-					"name": "permissions",
-					"variableTypeTokenRange": {
-						"startIndex": 1,
-						"endIndex": 2
-					}
-				},
-				{
-					"kind": "Class",
-					"canonicalReference": "firefish-js!Stream:class",
-					"docComment": "",
-					"excerptTokens": [
-						{
-							"kind": "Content",
-							"text": "export default class Stream extends "
-						},
-						{
-							"kind": "Reference",
-							"text": "EventEmitter",
-							"canonicalReference": "eventemitter3!EventEmitter.EventEmitter"
-						},
-						{
-							"kind": "Content",
-							"text": "<"
-						},
-						{
-							"kind": "Reference",
-							"text": "StreamEvents",
-							"canonicalReference": "firefish-js!~StreamEvents:type"
-						},
-						{
-							"kind": "Content",
-							"text": ">"
-						},
-						{
-							"kind": "Content",
-							"text": " "
-						}
-					],
-					"fileUrlPath": "src/streaming.ts",
-					"releaseTag": "Public",
-					"isAbstract": false,
-					"name": "Stream",
-					"preserveMemberOrder": false,
-					"members": [
-						{
-							"kind": "Constructor",
-							"canonicalReference": "firefish-js!Stream:constructor(1)",
-							"docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "constructor(\n\t\torigin: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t\tuser: "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\t\t\ttoken: string;\n\t\t} | null"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t\toptions?: "
-								},
-								{
-									"kind": "Content",
-									"text": "{\n\t\t\tWebSocket?: any;\n\t\t}"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t);"
-								}
-							],
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "origin",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "user",
-									"parameterTypeTokenRange": {
-										"startIndex": 3,
-										"endIndex": 4
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "options",
-									"parameterTypeTokenRange": {
-										"startIndex": 5,
-										"endIndex": 6
-									},
-									"isOptional": true
-								}
-							]
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#close:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "close(): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "close"
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#disconnectToChannel:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "disconnectToChannel(connection: "
-								},
-								{
-									"kind": "Reference",
-									"text": "NonSharedConnection",
-									"canonicalReference": "firefish-js!~NonSharedConnection:class"
-								},
-								{
-									"kind": "Content",
-									"text": "): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 3,
-								"endIndex": 4
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "connection",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "disconnectToChannel"
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#removeSharedConnection:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "removeSharedConnection(connection: "
-								},
-								{
-									"kind": "Reference",
-									"text": "SharedConnection",
-									"canonicalReference": "firefish-js!~SharedConnection:class"
-								},
-								{
-									"kind": "Content",
-									"text": "): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 3,
-								"endIndex": 4
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "connection",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "removeSharedConnection"
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#removeSharedConnectionPool:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "removeSharedConnectionPool(pool: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Pool",
-									"canonicalReference": "firefish-js!~Pool:class"
-								},
-								{
-									"kind": "Content",
-									"text": "): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 3,
-								"endIndex": 4
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "pool",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "removeSharedConnectionPool"
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#send:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "send(typeOrPayload: "
-								},
-								{
-									"kind": "Content",
-									"text": "any"
-								},
-								{
-									"kind": "Content",
-									"text": ", payload?: "
-								},
-								{
-									"kind": "Content",
-									"text": "any"
-								},
-								{
-									"kind": "Content",
-									"text": "): "
-								},
-								{
-									"kind": "Content",
-									"text": "void"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 5,
-								"endIndex": 6
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "typeOrPayload",
-									"parameterTypeTokenRange": {
-										"startIndex": 1,
-										"endIndex": 2
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "payload",
-									"parameterTypeTokenRange": {
-										"startIndex": 3,
-										"endIndex": 4
-									},
-									"isOptional": true
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "send"
-						},
-						{
-							"kind": "Property",
-							"canonicalReference": "firefish-js!Stream#state:member",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "state: "
-								},
-								{
-									"kind": "Content",
-									"text": "\"initializing\" | \"reconnecting\" | \"connected\""
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"isReadonly": false,
-							"isOptional": false,
-							"releaseTag": "Public",
-							"name": "state",
-							"propertyTypeTokenRange": {
-								"startIndex": 1,
-								"endIndex": 2
-							},
-							"isStatic": false,
-							"isProtected": false,
-							"isAbstract": false
-						},
-						{
-							"kind": "Method",
-							"canonicalReference": "firefish-js!Stream#useChannel:member(1)",
-							"docComment": "",
-							"excerptTokens": [
-								{
-									"kind": "Content",
-									"text": "useChannel<C extends "
-								},
-								{
-									"kind": "Content",
-									"text": "keyof "
-								},
-								{
-									"kind": "Reference",
-									"text": "Channels",
-									"canonicalReference": "firefish-js!Channels:type"
-								},
-								{
-									"kind": "Content",
-									"text": ">(\n\t\tchannel: "
-								},
-								{
-									"kind": "Content",
-									"text": "C"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t\tparams?: "
-								},
-								{
-									"kind": "Reference",
-									"text": "Channels",
-									"canonicalReference": "firefish-js!Channels:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[C][\"params\"]"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t\tname?: "
-								},
-								{
-									"kind": "Content",
-									"text": "string"
-								},
-								{
-									"kind": "Content",
-									"text": ",\n\t): "
-								},
-								{
-									"kind": "Reference",
-									"text": "Connection",
-									"canonicalReference": "firefish-js!ChannelConnection:class"
-								},
-								{
-									"kind": "Content",
-									"text": "<"
-								},
-								{
-									"kind": "Reference",
-									"text": "Channels",
-									"canonicalReference": "firefish-js!Channels:type"
-								},
-								{
-									"kind": "Content",
-									"text": "[C]>"
-								},
-								{
-									"kind": "Content",
-									"text": ";"
-								}
-							],
-							"typeParameters": [
-								{
-									"typeParameterName": "C",
-									"constraintTokenRange": {
-										"startIndex": 1,
-										"endIndex": 3
-									},
-									"defaultTypeTokenRange": {
-										"startIndex": 0,
-										"endIndex": 0
-									}
-								}
-							],
-							"isStatic": false,
-							"returnTypeTokenRange": {
-								"startIndex": 11,
-								"endIndex": 15
-							},
-							"releaseTag": "Public",
-							"isProtected": false,
-							"overloadIndex": 1,
-							"parameters": [
-								{
-									"parameterName": "channel",
-									"parameterTypeTokenRange": {
-										"startIndex": 4,
-										"endIndex": 5
-									},
-									"isOptional": false
-								},
-								{
-									"parameterName": "params",
-									"parameterTypeTokenRange": {
-										"startIndex": 6,
-										"endIndex": 8
-									},
-									"isOptional": true
-								},
-								{
-									"parameterName": "name",
-									"parameterTypeTokenRange": {
-										"startIndex": 9,
-										"endIndex": 10
-									},
-									"isOptional": true
-								}
-							],
-							"isOptional": false,
-							"isAbstract": false,
-							"name": "useChannel"
-						}
-					],
-					"extendsTokenRange": {
-						"startIndex": 1,
-						"endIndex": 5
-					},
-					"implementsTokenRanges": []
-				}
-			]
-		}
-	]
-}
diff --git a/packages/firefish-js/etc/firefish-js.api.md b/packages/firefish-js/etc/firefish-js.api.md
deleted file mode 100644
index 08a001de27..0000000000
--- a/packages/firefish-js/etc/firefish-js.api.md
+++ /dev/null
@@ -1,2839 +0,0 @@
-## API Report File for "firefish-js"
-
-> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
-
-```ts
-
-import { EventEmitter } from 'eventemitter3';
-
-// @public (undocumented)
-export type Acct = {
-    	username: string;
-    	host: string | null;
-};
-
-// Warning: (ae-forgotten-export) The symbol "TODO_2" needs to be exported by the entry point index.d.ts
-//
-// @public (undocumented)
-type Ad = TODO_2;
-
-// @public (undocumented)
-type Announcement = {
-    	id: ID;
-    	createdAt: DateString;
-    	updatedAt: DateString | null;
-    	text: string;
-    	title: string;
-    	imageUrl: string | null;
-    	isRead?: boolean;
-};
-
-// @public (undocumented)
-type Antenna = {
-    	id: ID;
-    	createdAt: DateString;
-    	name: string;
-    	keywords: string[][];
-    	excludeKeywords: string[][];
-    	src: "home" | "all" | "users" | "list" | "group" | "instances";
-    	userListId: ID | null;
-    	userGroupId: ID | null;
-    	users: string[];
-    	instances: string[];
-    	caseSensitive: boolean;
-    	notify: boolean;
-    	withReplies: boolean;
-    	withFile: boolean;
-    	hasUnreadNote: boolean;
-};
-
-declare namespace api {
-    export {
-        isAPIError,
-        APIError,
-        FetchLike,
-        APIClient
-    }
-}
-export { api }
-
-// @public (undocumented)
-class APIClient {
-    	constructor(opts: {
-        		origin: APIClient["origin"];
-        		credential?: APIClient["credential"];
-        		fetch?: APIClient["fetch"] | null | undefined;
-        	});
-    	// (undocumented)
-    credential: string | null | undefined;
-    	// (undocumented)
-    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<E extends keyof Endpoints, P extends Endpoints[E]["req"]>(
-    		endpoint: E,
-    		params?: P,
-    		credential?: string | null | undefined,
-    	): Promise<
-    		Endpoints[E]["res"] extends {
-        			$switch: {
-            				$cases: [any, any][];
-            				$default: any;
-            			};
-        		}
-    			? IsCaseMatched<E, P, 0> extends true
-    				? GetCaseResult<E, P, 0>
-    				: IsCaseMatched<E, P, 1> extends true
-    				? GetCaseResult<E, P, 1>
-    				: IsCaseMatched<E, P, 2> extends true
-    				? GetCaseResult<E, P, 2>
-    				: IsCaseMatched<E, P, 3> extends true
-    				? GetCaseResult<E, P, 3>
-    				: IsCaseMatched<E, P, 4> extends true
-    				? GetCaseResult<E, P, 4>
-    				: IsCaseMatched<E, P, 5> extends true
-    				? GetCaseResult<E, P, 5>
-    				: IsCaseMatched<E, P, 6> extends true
-    				? GetCaseResult<E, P, 6>
-    				: IsCaseMatched<E, P, 7> extends true
-    				? GetCaseResult<E, P, 7>
-    				: IsCaseMatched<E, P, 8> extends true
-    				? GetCaseResult<E, P, 8>
-    				: IsCaseMatched<E, P, 9> extends true
-    				? GetCaseResult<E, P, 9>
-    				: Endpoints[E]["res"]["$switch"]["$default"]
-    			: Endpoints[E]["res"]
-    	>;
-}
-
-// @public (undocumented)
-type APIError = {
-    	id: string;
-    	code: string;
-    	message: string;
-    	kind: "client" | "server";
-    	info: Record<string, any>;
-};
-
-// @public (undocumented)
-type App = TODO_2;
-
-// @public (undocumented)
-type AuthSession = {
-    	id: ID;
-    	app: App;
-    	token: string;
-};
-
-// @public (undocumented)
-type Blocking = {
-    	id: ID;
-    	createdAt: DateString;
-    	blockeeId: User["id"];
-    	blockee: UserDetailed;
-};
-
-// @public (undocumented)
-type Channel = {
-    	id: ID;
-};
-
-// Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts
-//
-// @public (undocumented)
-export abstract class ChannelConnection<
-	Channel extends AnyOf<Channels> = any,
-> extends EventEmitter<Channel["events"]> {
-    	constructor(stream: Stream, channel: string, name?: string);
-    	// (undocumented)
-    channel: string;
-    	// (undocumented)
-    abstract dispose(): void;
-    	// (undocumented)
-    abstract id: string;
-    	// (undocumented)
-    inCount: number;
-    	// (undocumented)
-    name?: string;
-    	// (undocumented)
-    outCount: number;
-    	// (undocumented)
-    send<T extends keyof Channel["receives"]>(
-    		type: T,
-    		body: Channel["receives"][T],
-    	): void;
-    	// (undocumented)
-    protected stream: Stream;
-}
-
-// @public (undocumented)
-export type Channels = {
-    	main: {
-        		params: null;
-        		events: {
-            			notification: (payload: Notification_2) => void;
-            			mention: (payload: Note) => void;
-            			reply: (payload: Note) => void;
-            			renote: (payload: Note) => void;
-            			follow: (payload: User) => void;
-            			followed: (payload: User) => void;
-            			unfollow: (payload: User) => void;
-            			meUpdated: (payload: MeDetailed) => void;
-            			pageEvent: (payload: PageEvent) => void;
-            			urlUploadFinished: (payload: {
-                				marker: string;
-                				file: DriveFile;
-                			}) => void;
-            			readAllNotifications: () => void;
-            			unreadNotification: (payload: Notification_2) => void;
-            			unreadMention: (payload: Note["id"]) => void;
-            			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;
-            			readAllChannels: () => void;
-            			unreadChannel: (payload: Note["id"]) => void;
-            			myTokenRegenerated: () => void;
-            			reversiNoInvites: () => void;
-            			reversiInvited: (payload: FIXME) => void;
-            			signin: (payload: FIXME) => void;
-            			registryUpdated: (payload: {
-                				scope?: string[];
-                				key: string;
-                				value: any | null;
-                			}) => void;
-            			driveFileCreated: (payload: DriveFile) => void;
-            			readAntenna: (payload: Antenna) => void;
-            		};
-        		receives: null;
-        	};
-    	homeTimeline: {
-        		params: null;
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		receives: null;
-        	};
-    	localTimeline: {
-        		params: null;
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		receives: null;
-        	};
-    	hybridTimeline: {
-        		params: null;
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		receives: null;
-        	};
-    	recommendedTimeline: {
-        		params: null;
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		receives: null;
-        	};
-    	globalTimeline: {
-        		params: null;
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		receives: null;
-        	};
-    	antenna: {
-        		params: {
-            			antennaId: Antenna["id"];
-            		};
-        		events: {
-            			note: (payload: Note) => void;
-            		};
-        		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: {
-            			stats: (payload: FIXME) => void;
-            		};
-        		receives: {
-            			requestLog: {
-                				id: string | number;
-                				length: number;
-                			};
-            		};
-        	};
-    	queueStats: {
-        		params: null;
-        		events: {
-            			stats: (payload: FIXME) => void;
-            		};
-        		receives: {
-            			requestLog: {
-                				id: string | number;
-                				length: number;
-                			};
-            		};
-        	};
-};
-
-// @public (undocumented)
-type Clip = TODO_2;
-
-// @public (undocumented)
-type CustomEmoji = {
-    	id: string;
-    	name: string;
-    	url: string;
-    	category: string;
-    	aliases: string[];
-};
-
-// @public (undocumented)
-type DateString = string;
-
-// @public (undocumented)
-type DetailedInstanceMetadata = LiteInstanceMetadata & {
-    	features: Record<string, any>;
-};
-
-// @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<string, any>;
-};
-
-// @public (undocumented)
-type DriveFolder = TODO_2;
-
-// @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/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: TODO;
-        		res: TODO;
-        	};
-    	"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/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;
-        	};
-    	"antennas/mark-read": {
-        		req: TODO;
-        		res: Antenna;
-        	};
-    	"ap/get": {
-        		req: {
-            			uri: string;
-            		};
-        		res: Record<string, any>;
-        	};
-    	"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: TODO;
-        		res: TODO;
-        	};
-    	"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"];
-            		};
-        		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: TODO;
-        		res: TODO;
-        	};
-    	"gallery/popular": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts/create": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts/delete": {
-        		req: {
-            			postId: GalleryPost["id"];
-            		};
-        		res: null;
-        	};
-    	"gallery/posts/like": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts/show": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts/unlike": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"gallery/posts/update": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"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/get-word-muted-notes-count": {
-        		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/known-as": {
-        		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<string, any>;
-        	};
-    	"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<
-        			string,
-        			"null" | "array" | "number" | "string" | "boolean" | "object"
-        		>;
-        	};
-    	"i/registry/keys": {
-        		req: {
-            			scope?: string[];
-            		};
-        		res: string[];
-        	};
-    	"i/registry/remove": {
-        		req: {
-            			key: string;
-            			scope?: string[];
-            		};
-        		res: null;
-        	};
-    	"i/registry/scopes": {
-        		req: NoParams;
-        		res: string[][];
-        	};
-    	"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;
-            			preventAiLearning?: boolean;
-            			isBot?: boolean;
-            			isCat?: boolean;
-            			injectFeaturedNote?: boolean;
-            			receiveAnnouncementEmail?: boolean;
-            			alwaysMarkNsfw?: boolean;
-            			mutedWords?: string[][];
-            			mutingNotificationTypes?: Notification_2["type"][];
-            			emailNotificationTypes?: 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/update-key": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"i/2fa/remove-key": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"i/2fa/unregister": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"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;
-        	};
-    	"renote-mute/create": {
-        		req: TODO;
-        		res: TODO;
-        	};
-    	"renote-mute/delete": {
-        		req: {
-            			userId: User["id"];
-            		};
-        		res: null;
-        	};
-    	"renote-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: NoteSubmitReq;
-        		res: {
-            			createdNote: Note;
-            		};
-        	};
-    	"notes/delete": {
-        		req: {
-            			noteId: Note["id"];
-            		};
-        		res: null;
-        	};
-    	"notes/edit": {
-        		req: NoteSubmitReq;
-        		res: {
-            			createdNote: Note;
-            		};
-        	};
-    	"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/recommended-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/mark-all-as-read": {
-        		req: NoParams;
-        		res: null;
-        	};
-    	"notifications/read": {
-        		req: {
-            			notificationId: Notification_2["id"];
-            		};
-        		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;
-        	};
-    	stats: {
-        		req: NoParams;
-        		res: Stats;
-        	};
-    	"server-info": {
-        		req: NoParams;
-        		res: ServerInfo;
-        	};
-    	"latest-version": {
-        		req: NoParams;
-        		res: TODO;
-        	};
-    	"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/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;
-                			};
-            		};
-        	};
-    	"users/stats": {
-        		req: TODO;
-        		res: TODO;
-        	};
-};
-
-declare namespace entities {
-    export {
-        ID,
-        DateString,
-        User,
-        UserLite,
-        UserDetailed,
-        UserGroup,
-        UserList,
-        MeDetailed,
-        DriveFile,
-        DriveFolder,
-        GalleryPost,
-        Note,
-        NoteReaction,
-        Notification_2 as Notification,
-        MessagingMessage,
-        CustomEmoji,
-        LiteInstanceMetadata,
-        DetailedInstanceMetadata,
-        InstanceMetadata,
-        ServerInfo,
-        Stats,
-        Page,
-        PageEvent,
-        Announcement,
-        Antenna,
-        App,
-        AuthSession,
-        Ad,
-        Clip,
-        NoteFavorite,
-        FollowRequest,
-        Channel,
-        Following,
-        FollowingFolloweePopulated,
-        FollowingFollowerPopulated,
-        Blocking,
-        Instance,
-        Signin,
-        UserSorting,
-        OriginType
-    }
-}
-export { entities }
-
-// @public (undocumented)
-type FetchLike = (
-	input: string,
-	init?: {
-    		method?: string;
-    		body?: string;
-    		credentials?: RequestCredentials;
-    		cache?: RequestCache;
-    	},
-) => Promise<{
-    	status: number;
-    	json(): Promise<any>;
-}>;
-
-// @public (undocumented)
-export const ffVisibility: readonly ["public", "followers", "private"];
-
-// @public (undocumented)
-type Following = {
-    	id: ID;
-    	createdAt: DateString;
-    	followerId: User["id"];
-    	followeeId: User["id"];
-};
-
-// @public (undocumented)
-type FollowingFolloweePopulated = Following & {
-    	followee: UserDetailed;
-};
-
-// @public (undocumented)
-type FollowingFollowerPopulated = Following & {
-    	follower: UserDetailed;
-};
-
-// @public (undocumented)
-type FollowRequest = {
-    	id: ID;
-    	follower: User;
-    	followee: User;
-};
-
-// @public (undocumented)
-type GalleryPost = TODO_2;
-
-// @public (undocumented)
-type ID = string;
-
-// @public (undocumented)
-type Instance = {
-    	id: ID;
-    	caughtAt: 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;
-    	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;
-};
-
-// @public (undocumented)
-type InstanceMetadata =
-	| LiteInstanceMetadata
-	| DetailedInstanceMetadata;
-
-// @public (undocumented)
-function isAPIError(reason: any): reason is APIError;
-
-// @public (undocumented)
-type LiteInstanceMetadata = {
-    	maintainerName: string | null;
-    	maintainerEmail: string | null;
-    	version: string;
-    	name: string | null;
-    	uri: string;
-    	description: string | null;
-    	tosUrl: string | null;
-    	disableRegistration: boolean;
-    	disableLocalTimeline: boolean;
-    	disableRecommendedTimeline: boolean;
-    	disableGlobalTimeline: boolean;
-    	driveCapacityPerLocalUserMb: number;
-    	driveCapacityPerRemoteUserMb: number;
-    	enableHcaptcha: boolean;
-    	hcaptchaSiteKey: string | null;
-    	enableRecaptcha: boolean;
-    	recaptchaSiteKey: string | null;
-    	swPublickey: string | null;
-    	maxNoteTextLength: number;
-    	enableEmail: boolean;
-    	enableTwitterIntegration: boolean;
-    	enableGithubIntegration: boolean;
-    	enableDiscordIntegration: boolean;
-    	enableServiceWorker: boolean;
-    	emojis: CustomEmoji[];
-    	ads: {
-        		id: ID;
-        		ratio: number;
-        		place: string;
-        		url: string;
-        		imageUrl: string;
-        	}[];
-};
-
-// @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;
-    	hasUnreadChannel: boolean;
-    	hasUnreadMentions: boolean;
-    	hasUnreadMessagingMessage: boolean;
-    	hasUnreadNotification: boolean;
-    	hasUnreadSpecifiedNotes: boolean;
-    	hideOnlineStatus: boolean;
-    	injectFeaturedNote: boolean;
-    	integrations: Record<string, any>;
-    	isDeleted: boolean;
-    	isExplorable: boolean;
-    	mutedWords: string[][];
-    	mutingNotificationTypes: string[];
-    	noCrawle: boolean;
-    	preventAiLearning: boolean;
-    	receiveAnnouncementEmail: boolean;
-    	usePasswordLessLogin: boolean;
-    	[other: string]: any;
-};
-
-// @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;
-};
-
-// @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"][];
-    	localOnly?: boolean;
-    	channel?: Channel["id"];
-    	myReaction?: string;
-    	reactions: Record<string, number>;
-    	renoteCount: number;
-    	repliesCount: number;
-    	poll?: {
-        		expiresAt: DateString | null;
-        		multiple: boolean;
-        		choices: {
-            			isVoted: boolean;
-            			text: string;
-            			votes: number;
-            		}[];
-        	};
-    	emojis: {
-        		name: string;
-        		url: string;
-        	}[];
-    	uri?: string;
-    	url?: string;
-    	updatedAt?: DateString;
-    	isHidden?: boolean;
-};
-
-// @public (undocumented)
-type NoteFavorite = {
-    	id: ID;
-    	createdAt: DateString;
-    	noteId: Note["id"];
-    	note: Note;
-};
-
-// @public (undocumented)
-type NoteReaction = {
-    	id: ID;
-    	createdAt: DateString;
-    	user: UserLite;
-    	type: string;
-};
-
-// @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: "pollVote";
-    			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: "app";
-    			header?: string | null;
-    			body: string;
-    			icon?: string | null;
-    	  }
-);
-
-// @public (undocumented)
-export const notificationTypes: readonly [
-	"follow",
-	"mention",
-	"reply",
-	"renote",
-	"quote",
-	"reaction",
-	"pollVote",
-	"pollEnded",
-	"receiveFollowRequest",
-	"followRequestAccepted",
-	"groupInvited",
-	"app",
-];
-
-// @public (undocumented)
-type OriginType = "combined" | "local" | "remote";
-
-// @public (undocumented)
-type Page = {
-    	id: ID;
-    	createdAt: DateString;
-    	updatedAt: DateString;
-    	userId: User["id"];
-    	user: User;
-    	content: Record<string, any>[];
-    	variables: Record<string, any>[];
-    	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;
-};
-
-// @public (undocumented)
-type PageEvent = {
-    	pageId: Page["id"];
-    	event: string;
-    	var: any;
-    	userId: User["id"];
-    	user: User;
-};
-
-// @public (undocumented)
-export const permissions: string[];
-
-// @public (undocumented)
-type ServerInfo = {
-    	machine: string;
-    	cpu: {
-        		model: string;
-        		cores: number;
-        	};
-    	mem: {
-        		total: number;
-        	};
-    	fs: {
-        		total: number;
-        		used: number;
-        	};
-};
-
-// @public (undocumented)
-type Signin = {
-    	id: ID;
-    	createdAt: DateString;
-    	ip: string;
-    	headers: Record<string, any>;
-    	success: boolean;
-};
-
-// @public (undocumented)
-type Stats = {
-    	notesCount: number;
-    	originalNotesCount: number;
-    	usersCount: number;
-    	originalUsersCount: number;
-    	instances: number;
-    	driveUsageLocal: number;
-    	driveUsageRemote: number;
-};
-
-// Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts
-//
-// @public (undocumented)
-export class Stream extends EventEmitter<StreamEvents> {
-    	constructor(
-    		origin: string,
-    		user: {
-        			token: string;
-        		} | null,
-    		options?: {
-        			WebSocket?: any;
-        		},
-    	);
-    	// (undocumented)
-    close(): void;
-    	// Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts
-    //
-    // (undocumented)
-    disconnectToChannel(connection: NonSharedConnection): void;
-    	// Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts
-    //
-    // (undocumented)
-    removeSharedConnection(connection: SharedConnection): void;
-    	// Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts
-    //
-    // (undocumented)
-    removeSharedConnectionPool(pool: Pool): void;
-    	// (undocumented)
-    send(typeOrPayload: any, payload?: any): void;
-    	// (undocumented)
-    state: "initializing" | "reconnecting" | "connected";
-    	// (undocumented)
-    useChannel<C extends keyof Channels>(
-    		channel: C,
-    		params?: Channels[C]["params"],
-    		name?: string,
-    	): ChannelConnection<Channels[C]>;
-    	}
-
-// @public (undocumented)
-type User = UserLite | UserDetailed;
-
-// @public (undocumented)
-type UserDetailed = UserLite & {
-    	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;
-        	}[];
-    	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;
-    	isRenoteMuted: boolean;
-    	isSilenced: boolean;
-    	isSuspended: boolean;
-    	lang: string | null;
-    	lastFetchedAt?: DateString;
-    	location: string | null;
-    	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;
-};
-
-// @public (undocumented)
-type UserGroup = TODO_2;
-
-// @public (undocumented)
-type UserList = {
-    	id: ID;
-    	createdAt: DateString;
-    	name: string;
-    	userIds: User["id"][];
-};
-
-// @public (undocumented)
-type UserLite = {
-    	id: ID;
-    	username: string;
-    	host: string | null;
-    	name: string;
-    	onlineStatus: "online" | "active" | "offline" | "unknown";
-    	avatarUrl: string;
-    	avatarBlurhash: string;
-    	alsoKnownAs: string[];
-    	movedToUri: any;
-    	emojis: {
-        		name: string;
-        		url: string;
-        	}[];
-    	instance?: {
-        		name: Instance["name"];
-        		softwareName: Instance["softwareName"];
-        		softwareVersion: Instance["softwareVersion"];
-        		iconUrl: Instance["iconUrl"];
-        		faviconUrl: Instance["faviconUrl"];
-        		themeColor: Instance["themeColor"];
-        	};
-};
-
-// @public (undocumented)
-type UserSorting =
-	| "+follower"
-	| "-follower"
-	| "+createdAt"
-	| "-createdAt"
-	| "+updatedAt"
-	| "-updatedAt";
-
-// Warnings were encountered during analysis:
-//
-// src/api.types.ts:80:37 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:83:28 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:853:5 - (ae-forgotten-export) The symbol "NoteSubmitReq" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:1094:3 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts
-// src/streaming.types.ts:56:18 - (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/firefish-js/markdown/firefish-js.acct.md b/packages/firefish-js/markdown/firefish-js.acct.md
deleted file mode 100644
index 6779aed150..0000000000
--- a/packages/firefish-js/markdown/firefish-js.acct.md
+++ /dev/null
@@ -1,14 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Acct](./firefish-js.acct.md)
-
-## Acct type
-
-**Signature:**
-
-```typescript
-export declare type Acct = {
-	username: string;
-	host: string | null;
-};
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient._constructor_.md b/packages/firefish-js/markdown/firefish-js.api.apiclient._constructor_.md
deleted file mode 100644
index f9af10bc40..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient._constructor_.md
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md) &gt; [(constructor)](./firefish-js.api.apiclient._constructor_.md)
-
-## api.APIClient.(constructor)
-
-Constructs a new instance of the `APIClient` class
-
-**Signature:**
-
-```typescript
-constructor(opts: {
-		origin: APIClient["origin"];
-		credential?: APIClient["credential"];
-		fetch?: APIClient["fetch"] | null | undefined;
-	});
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  opts | { origin: [APIClient](./firefish-js.api.apiclient.md)<!-- -->\["origin"\]; credential?: [APIClient](./firefish-js.api.apiclient.md)<!-- -->\["credential"\]; fetch?: [APIClient](./firefish-js.api.apiclient.md)<!-- -->\["fetch"\] \| null \| undefined; } |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient.credential.md b/packages/firefish-js/markdown/firefish-js.api.apiclient.credential.md
deleted file mode 100644
index 323203aac1..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient.credential.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md) &gt; [credential](./firefish-js.api.apiclient.credential.md)
-
-## api.APIClient.credential property
-
-**Signature:**
-
-```typescript
-credential: string | null | undefined;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient.fetch.md b/packages/firefish-js/markdown/firefish-js.api.apiclient.fetch.md
deleted file mode 100644
index ee2ad9b8de..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient.fetch.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md) &gt; [fetch](./firefish-js.api.apiclient.fetch.md)
-
-## api.APIClient.fetch property
-
-**Signature:**
-
-```typescript
-fetch: FetchLike;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient.md b/packages/firefish-js/markdown/firefish-js.api.apiclient.md
deleted file mode 100644
index 077e8f2957..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient.md
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md)
-
-## api.APIClient class
-
-**Signature:**
-
-```typescript
-export declare class APIClient 
-```
-
-## Constructors
-
-|  Constructor | Modifiers | Description |
-|  --- | --- | --- |
-|  [(constructor)(opts)](./firefish-js.api.apiclient._constructor_.md) |  | Constructs a new instance of the <code>APIClient</code> class |
-
-## Properties
-
-|  Property | Modifiers | Type | Description |
-|  --- | --- | --- | --- |
-|  [credential](./firefish-js.api.apiclient.credential.md) |  | string \| null \| undefined |  |
-|  [fetch](./firefish-js.api.apiclient.fetch.md) |  | [FetchLike](./firefish-js.api.fetchlike.md) |  |
-|  [origin](./firefish-js.api.apiclient.origin.md) |  | string |  |
-
-## Methods
-
-|  Method | Modifiers | Description |
-|  --- | --- | --- |
-|  [request(endpoint, params, credential)](./firefish-js.api.apiclient.request.md) |  |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient.origin.md b/packages/firefish-js/markdown/firefish-js.api.apiclient.origin.md
deleted file mode 100644
index 74eff2e1fd..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient.origin.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md) &gt; [origin](./firefish-js.api.apiclient.origin.md)
-
-## api.APIClient.origin property
-
-**Signature:**
-
-```typescript
-origin: string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.apiclient.request.md b/packages/firefish-js/markdown/firefish-js.api.apiclient.request.md
deleted file mode 100644
index 1d387fb33e..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apiclient.request.md
+++ /dev/null
@@ -1,57 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIClient](./firefish-js.api.apiclient.md) &gt; [request](./firefish-js.api.apiclient.request.md)
-
-## api.APIClient.request() method
-
-**Signature:**
-
-```typescript
-request<E extends keyof Endpoints, P extends Endpoints[E]["req"]>(
-		endpoint: E,
-		params?: P,
-		credential?: string | null | undefined,
-	): Promise<
-		Endpoints[E]["res"] extends {
-			$switch: {
-				$cases: [any, any][];
-				$default: any;
-			};
-		}
-			? IsCaseMatched<E, P, 0> extends true
-				? GetCaseResult<E, P, 0>
-				: IsCaseMatched<E, P, 1> extends true
-				? GetCaseResult<E, P, 1>
-				: IsCaseMatched<E, P, 2> extends true
-				? GetCaseResult<E, P, 2>
-				: IsCaseMatched<E, P, 3> extends true
-				? GetCaseResult<E, P, 3>
-				: IsCaseMatched<E, P, 4> extends true
-				? GetCaseResult<E, P, 4>
-				: IsCaseMatched<E, P, 5> extends true
-				? GetCaseResult<E, P, 5>
-				: IsCaseMatched<E, P, 6> extends true
-				? GetCaseResult<E, P, 6>
-				: IsCaseMatched<E, P, 7> extends true
-				? GetCaseResult<E, P, 7>
-				: IsCaseMatched<E, P, 8> extends true
-				? GetCaseResult<E, P, 8>
-				: IsCaseMatched<E, P, 9> extends true
-				? GetCaseResult<E, P, 9>
-				: Endpoints[E]["res"]["$switch"]["$default"]
-			: Endpoints[E]["res"]
-	>;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  endpoint | E |  |
-|  params | P | _(Optional)_ |
-|  credential | string \| null \| undefined | _(Optional)_ |
-
-**Returns:**
-
-Promise&lt; [Endpoints](./firefish-js.endpoints.md)<!-- -->\[E\]\["res"\] extends { $switch: { $cases: \[any, any\]\[\]; $default: any; }; } ? IsCaseMatched&lt;E, P, 0&gt; extends true ? GetCaseResult&lt;E, P, 0&gt; : IsCaseMatched&lt;E, P, 1&gt; extends true ? GetCaseResult&lt;E, P, 1&gt; : IsCaseMatched&lt;E, P, 2&gt; extends true ? GetCaseResult&lt;E, P, 2&gt; : IsCaseMatched&lt;E, P, 3&gt; extends true ? GetCaseResult&lt;E, P, 3&gt; : IsCaseMatched&lt;E, P, 4&gt; extends true ? GetCaseResult&lt;E, P, 4&gt; : IsCaseMatched&lt;E, P, 5&gt; extends true ? GetCaseResult&lt;E, P, 5&gt; : IsCaseMatched&lt;E, P, 6&gt; extends true ? GetCaseResult&lt;E, P, 6&gt; : IsCaseMatched&lt;E, P, 7&gt; extends true ? GetCaseResult&lt;E, P, 7&gt; : IsCaseMatched&lt;E, P, 8&gt; extends true ? GetCaseResult&lt;E, P, 8&gt; : IsCaseMatched&lt;E, P, 9&gt; extends true ? GetCaseResult&lt;E, P, 9&gt; : [Endpoints](./firefish-js.endpoints.md)<!-- -->\[E\]\["res"\]\["$switch"\]\["$default"\] : [Endpoints](./firefish-js.endpoints.md)<!-- -->\[E\]\["res"\] &gt;
-
diff --git a/packages/firefish-js/markdown/firefish-js.api.apierror.md b/packages/firefish-js/markdown/firefish-js.api.apierror.md
deleted file mode 100644
index 7eb3bb2d80..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.apierror.md
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [APIError](./firefish-js.api.apierror.md)
-
-## api.APIError type
-
-**Signature:**
-
-```typescript
-export declare type APIError = {
-	id: string;
-	code: string;
-	message: string;
-	kind: "client" | "server";
-	info: Record<string, any>;
-};
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.fetchlike.md b/packages/firefish-js/markdown/firefish-js.api.fetchlike.md
deleted file mode 100644
index 8edc80de29..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.fetchlike.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [FetchLike](./firefish-js.api.fetchlike.md)
-
-## api.FetchLike type
-
-**Signature:**
-
-```typescript
-export declare type FetchLike = (
-	input: string,
-	init?: {
-		method?: string;
-		body?: string;
-		credentials?: RequestCredentials;
-		cache?: RequestCache;
-	},
-) => Promise<{
-	status: number;
-	json(): Promise<any>;
-}>;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.api.isapierror.md b/packages/firefish-js/markdown/firefish-js.api.isapierror.md
deleted file mode 100644
index ea31e0c9fb..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.isapierror.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md) &gt; [isAPIError](./firefish-js.api.isapierror.md)
-
-## api.isAPIError() function
-
-**Signature:**
-
-```typescript
-export declare function isAPIError(reason: any): reason is APIError;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  reason | any |  |
-
-**Returns:**
-
-reason is [APIError](./firefish-js.api.apierror.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.api.md b/packages/firefish-js/markdown/firefish-js.api.md
deleted file mode 100644
index c0dbed5355..0000000000
--- a/packages/firefish-js/markdown/firefish-js.api.md
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [api](./firefish-js.api.md)
-
-## api namespace
-
-## Classes
-
-|  Class | Description |
-|  --- | --- |
-|  [APIClient](./firefish-js.api.apiclient.md) |  |
-
-## Functions
-
-|  Function | Description |
-|  --- | --- |
-|  [isAPIError(reason)](./firefish-js.api.isapierror.md) |  |
-
-## Type Aliases
-
-|  Type Alias | Description |
-|  --- | --- |
-|  [APIError](./firefish-js.api.apierror.md) |  |
-|  [FetchLike](./firefish-js.api.fetchlike.md) |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection._constructor_.md b/packages/firefish-js/markdown/firefish-js.channelconnection._constructor_.md
deleted file mode 100644
index 4705c06275..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection._constructor_.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [(constructor)](./firefish-js.channelconnection._constructor_.md)
-
-## ChannelConnection.(constructor)
-
-Constructs a new instance of the `Connection` class
-
-**Signature:**
-
-```typescript
-constructor(stream: Stream, channel: string, name?: string);
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  stream | [Stream](./firefish-js.stream.md) |  |
-|  channel | string |  |
-|  name | string | _(Optional)_ |
-
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.channel.md b/packages/firefish-js/markdown/firefish-js.channelconnection.channel.md
deleted file mode 100644
index 71569bac51..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.channel.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [channel](./firefish-js.channelconnection.channel.md)
-
-## ChannelConnection.channel property
-
-**Signature:**
-
-```typescript
-channel: string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.dispose.md b/packages/firefish-js/markdown/firefish-js.channelconnection.dispose.md
deleted file mode 100644
index d968d4ad98..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.dispose.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [dispose](./firefish-js.channelconnection.dispose.md)
-
-## ChannelConnection.dispose() method
-
-**Signature:**
-
-```typescript
-abstract dispose(): void;
-```
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.id.md b/packages/firefish-js/markdown/firefish-js.channelconnection.id.md
deleted file mode 100644
index 1f4f9896f4..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.id.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [id](./firefish-js.channelconnection.id.md)
-
-## ChannelConnection.id property
-
-**Signature:**
-
-```typescript
-abstract id: string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.incount.md b/packages/firefish-js/markdown/firefish-js.channelconnection.incount.md
deleted file mode 100644
index e53cecf6fd..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.incount.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [inCount](./firefish-js.channelconnection.incount.md)
-
-## ChannelConnection.inCount property
-
-**Signature:**
-
-```typescript
-inCount: number;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.md b/packages/firefish-js/markdown/firefish-js.channelconnection.md
deleted file mode 100644
index 68e77916e6..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.md
+++ /dev/null
@@ -1,39 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md)
-
-## ChannelConnection class
-
-**Signature:**
-
-```typescript
-export declare abstract class Connection<
-	Channel extends AnyOf<Channels> = any,
-> extends EventEmitter<Channel["events"]> 
-```
-**Extends:** EventEmitter&lt;Channel\["events"\]&gt;
-
-## Constructors
-
-|  Constructor | Modifiers | Description |
-|  --- | --- | --- |
-|  [(constructor)(stream, channel, name)](./firefish-js.channelconnection._constructor_.md) |  | Constructs a new instance of the <code>Connection</code> class |
-
-## Properties
-
-|  Property | Modifiers | Type | Description |
-|  --- | --- | --- | --- |
-|  [channel](./firefish-js.channelconnection.channel.md) |  | string |  |
-|  [id](./firefish-js.channelconnection.id.md) | <code>abstract</code> | string |  |
-|  [inCount](./firefish-js.channelconnection.incount.md) |  | number |  |
-|  [name?](./firefish-js.channelconnection.name.md) |  | string | _(Optional)_ |
-|  [outCount](./firefish-js.channelconnection.outcount.md) |  | number |  |
-|  [stream](./firefish-js.channelconnection.stream.md) | <code>protected</code> | [Stream](./firefish-js.stream.md) |  |
-
-## Methods
-
-|  Method | Modifiers | Description |
-|  --- | --- | --- |
-|  [dispose()](./firefish-js.channelconnection.dispose.md) | <code>abstract</code> |  |
-|  [send(type, body)](./firefish-js.channelconnection.send.md) |  |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.name.md b/packages/firefish-js/markdown/firefish-js.channelconnection.name.md
deleted file mode 100644
index 77acd5ea58..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.name.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [name](./firefish-js.channelconnection.name.md)
-
-## ChannelConnection.name property
-
-**Signature:**
-
-```typescript
-name?: string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.outcount.md b/packages/firefish-js/markdown/firefish-js.channelconnection.outcount.md
deleted file mode 100644
index ec79be6339..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.outcount.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [outCount](./firefish-js.channelconnection.outcount.md)
-
-## ChannelConnection.outCount property
-
-**Signature:**
-
-```typescript
-outCount: number;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.send.md b/packages/firefish-js/markdown/firefish-js.channelconnection.send.md
deleted file mode 100644
index 75b869e866..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.send.md
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [send](./firefish-js.channelconnection.send.md)
-
-## ChannelConnection.send() method
-
-**Signature:**
-
-```typescript
-send<T extends keyof Channel["receives"]>(
-		type: T,
-		body: Channel["receives"][T],
-	): void;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  type | T |  |
-|  body | Channel\["receives"\]\[T\] |  |
-
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.channelconnection.stream.md b/packages/firefish-js/markdown/firefish-js.channelconnection.stream.md
deleted file mode 100644
index a36829797d..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channelconnection.stream.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ChannelConnection](./firefish-js.channelconnection.md) &gt; [stream](./firefish-js.channelconnection.stream.md)
-
-## ChannelConnection.stream property
-
-**Signature:**
-
-```typescript
-protected stream: Stream;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.channels.md b/packages/firefish-js/markdown/firefish-js.channels.md
deleted file mode 100644
index 555047e3e0..0000000000
--- a/packages/firefish-js/markdown/firefish-js.channels.md
+++ /dev/null
@@ -1,143 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Channels](./firefish-js.channels.md)
-
-## Channels type
-
-**Signature:**
-
-```typescript
-export declare type Channels = {
-	main: {
-		params: null;
-		events: {
-			notification: (payload: Notification) => void;
-			mention: (payload: Note) => void;
-			reply: (payload: Note) => void;
-			renote: (payload: Note) => void;
-			follow: (payload: User) => void;
-			followed: (payload: User) => void;
-			unfollow: (payload: User) => void;
-			meUpdated: (payload: MeDetailed) => void;
-			pageEvent: (payload: PageEvent) => void;
-			urlUploadFinished: (payload: {
-				marker: string;
-				file: DriveFile;
-			}) => void;
-			readAllNotifications: () => void;
-			unreadNotification: (payload: Notification) => void;
-			unreadMention: (payload: Note["id"]) => void;
-			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;
-			readAllChannels: () => void;
-			unreadChannel: (payload: Note["id"]) => void;
-			myTokenRegenerated: () => void;
-			reversiNoInvites: () => void;
-			reversiInvited: (payload: FIXME) => void;
-			signin: (payload: FIXME) => void;
-			registryUpdated: (payload: {
-				scope?: string[];
-				key: string;
-				value: any | null;
-			}) => void;
-			driveFileCreated: (payload: DriveFile) => void;
-			readAntenna: (payload: Antenna) => void;
-		};
-		receives: null;
-	};
-	homeTimeline: {
-		params: null;
-		events: {
-			note: (payload: Note) => void;
-		};
-		receives: null;
-	};
-	localTimeline: {
-		params: null;
-		events: {
-			note: (payload: Note) => void;
-		};
-		receives: null;
-	};
-	hybridTimeline: {
-		params: null;
-		events: {
-			note: (payload: Note) => void;
-		};
-		receives: null;
-	};
-	recommendedTimeline: {
-		params: null;
-		events: {
-			note: (payload: Note) => void;
-		};
-		receives: null;
-	};
-	globalTimeline: {
-		params: null;
-		events: {
-			note: (payload: Note) => void;
-		};
-		receives: null;
-	};
-	antenna: {
-		params: {
-			antennaId: Antenna["id"];
-		};
-		events: {
-			note: (payload: Note) => void;
-		};
-		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: {
-			stats: (payload: FIXME) => void;
-		};
-		receives: {
-			requestLog: {
-				id: string | number;
-				length: number;
-			};
-		};
-	};
-	queueStats: {
-		params: null;
-		events: {
-			stats: (payload: FIXME) => void;
-		};
-		receives: {
-			requestLog: {
-				id: string | number;
-				length: number;
-			};
-		};
-	};
-};
-```
-**References:** [Note](./firefish-js.entities.note.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [MeDetailed](./firefish-js.entities.medetailed.md)<!-- -->, [PageEvent](./firefish-js.entities.pageevent.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)<!-- -->, [MessagingMessage](./firefish-js.entities.messagingmessage.md)<!-- -->, [Antenna](./firefish-js.entities.antenna.md)<!-- -->, [UserGroup](./firefish-js.entities.usergroup.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.endpoints.md b/packages/firefish-js/markdown/firefish-js.endpoints.md
deleted file mode 100644
index 4d2162d571..0000000000
--- a/packages/firefish-js/markdown/firefish-js.endpoints.md
+++ /dev/null
@@ -1,1911 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Endpoints](./firefish-js.endpoints.md)
-
-## Endpoints type
-
-**Signature:**
-
-```typescript
-export declare type Endpoints = {
-	"admin/abuse-user-reports": {
-		req: TODO;
-		res: TODO;
-	};
-	"admin/delete-all-files-of-a-user": {
-		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: TODO;
-		res: TODO;
-	};
-	"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/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;
-	};
-	"antennas/mark-read": {
-		req: TODO;
-		res: Antenna;
-	};
-	"ap/get": {
-		req: {
-			uri: string;
-		};
-		res: Record<string, any>;
-	};
-	"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: TODO;
-		res: TODO;
-	};
-	"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"];
-		};
-		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: TODO;
-		res: TODO;
-	};
-	"gallery/popular": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts/create": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts/delete": {
-		req: {
-			postId: GalleryPost["id"];
-		};
-		res: null;
-	};
-	"gallery/posts/like": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts/show": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts/unlike": {
-		req: TODO;
-		res: TODO;
-	};
-	"gallery/posts/update": {
-		req: TODO;
-		res: TODO;
-	};
-	"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/get-word-muted-notes-count": {
-		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/known-as": {
-		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<string, any>;
-	};
-	"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<
-			string,
-			"null" | "array" | "number" | "string" | "boolean" | "object"
-		>;
-	};
-	"i/registry/keys": {
-		req: {
-			scope?: string[];
-		};
-		res: string[];
-	};
-	"i/registry/remove": {
-		req: {
-			key: string;
-			scope?: string[];
-		};
-		res: null;
-	};
-	"i/registry/scopes": {
-		req: NoParams;
-		res: string[][];
-	};
-	"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;
-			preventAiLearning?: boolean;
-			isBot?: boolean;
-			isCat?: boolean;
-			injectFeaturedNote?: boolean;
-			receiveAnnouncementEmail?: boolean;
-			alwaysMarkNsfw?: boolean;
-			mutedWords?: string[][];
-			mutingNotificationTypes?: Notification["type"][];
-			emailNotificationTypes?: 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/update-key": {
-		req: TODO;
-		res: TODO;
-	};
-	"i/2fa/remove-key": {
-		req: TODO;
-		res: TODO;
-	};
-	"i/2fa/unregister": {
-		req: TODO;
-		res: TODO;
-	};
-	"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;
-	};
-	"renote-mute/create": {
-		req: TODO;
-		res: TODO;
-	};
-	"renote-mute/delete": {
-		req: {
-			userId: User["id"];
-		};
-		res: null;
-	};
-	"renote-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: NoteSubmitReq;
-		res: {
-			createdNote: Note;
-		};
-	};
-	"notes/delete": {
-		req: {
-			noteId: Note["id"];
-		};
-		res: null;
-	};
-	"notes/edit": {
-		req: NoteSubmitReq;
-		res: {
-			createdNote: Note;
-		};
-	};
-	"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/recommended-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/mark-all-as-read": {
-		req: NoParams;
-		res: null;
-	};
-	"notifications/read": {
-		req: {
-			notificationId: Notification["id"];
-		};
-		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;
-	};
-	stats: {
-		req: NoParams;
-		res: Stats;
-	};
-	"server-info": {
-		req: NoParams;
-		res: ServerInfo;
-	};
-	"latest-version": {
-		req: NoParams;
-		res: TODO;
-	};
-	"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/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;
-			};
-		};
-	};
-	"users/stats": {
-		req: TODO;
-		res: TODO;
-	};
-};
-```
-**References:** [User](./firefish-js.entities.user.md)<!-- -->, [Ad](./firefish-js.entities.ad.md)<!-- -->, [Announcement](./firefish-js.entities.announcement.md)<!-- -->, [Antenna](./firefish-js.entities.antenna.md)<!-- -->, [Note](./firefish-js.entities.note.md)<!-- -->, [UserDetailed](./firefish-js.entities.userdetailed.md)<!-- -->, [App](./firefish-js.entities.app.md)<!-- -->, [AuthSession](./firefish-js.entities.authsession.md)<!-- -->, [Blocking](./firefish-js.entities.blocking.md)<!-- -->, [Clip](./firefish-js.entities.clip.md)<!-- -->, [DriveFolder](./firefish-js.entities.drivefolder.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)<!-- -->, [Following](./firefish-js.entities.following.md)<!-- -->, [FollowingFolloweePopulated](./firefish-js.entities.followingfolloweepopulated.md)<!-- -->, [Instance](./firefish-js.entities.instance.md)<!-- -->, [FollowRequest](./firefish-js.entities.followrequest.md)<!-- -->, [GalleryPost](./firefish-js.entities.gallerypost.md)<!-- -->, [NoteFavorite](./firefish-js.entities.notefavorite.md)<!-- -->, [MeDetailed](./firefish-js.entities.medetailed.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [Signin](./firefish-js.entities.signin.md)<!-- -->, [MessagingMessage](./firefish-js.entities.messagingmessage.md)<!-- -->, [UserGroup](./firefish-js.entities.usergroup.md)<!-- -->, [DetailedInstanceMetadata](./firefish-js.entities.detailedinstancemetadata.md)<!-- -->, [LiteInstanceMetadata](./firefish-js.entities.liteinstancemetadata.md)<!-- -->, [NoteReaction](./firefish-js.entities.notereaction.md)<!-- -->, [UserList](./firefish-js.entities.userlist.md)<!-- -->, [Page](./firefish-js.entities.page.md)<!-- -->, [Stats](./firefish-js.entities.stats.md)<!-- -->, [ServerInfo](./firefish-js.entities.serverinfo.md)<!-- -->, [UserSorting](./firefish-js.entities.usersorting.md)<!-- -->, [OriginType](./firefish-js.entities.origintype.md)<!-- -->, [FollowingFollowerPopulated](./firefish-js.entities.followingfollowerpopulated.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.ad.md b/packages/firefish-js/markdown/firefish-js.entities.ad.md
deleted file mode 100644
index 9b3ef29e12..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.ad.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Ad](./firefish-js.entities.ad.md)
-
-## entities.Ad type
-
-**Signature:**
-
-```typescript
-export declare type Ad = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.announcement.md b/packages/firefish-js/markdown/firefish-js.entities.announcement.md
deleted file mode 100644
index fba76c2279..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.announcement.md
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Announcement](./firefish-js.entities.announcement.md)
-
-## entities.Announcement type
-
-**Signature:**
-
-```typescript
-export declare type Announcement = {
-	id: ID;
-	createdAt: DateString;
-	updatedAt: DateString | null;
-	text: string;
-	title: string;
-	imageUrl: string | null;
-	isRead?: boolean;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.antenna.md b/packages/firefish-js/markdown/firefish-js.entities.antenna.md
deleted file mode 100644
index c92eca8496..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.antenna.md
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Antenna](./firefish-js.entities.antenna.md)
-
-## entities.Antenna type
-
-**Signature:**
-
-```typescript
-export declare type Antenna = {
-	id: ID;
-	createdAt: DateString;
-	name: string;
-	keywords: string[][];
-	excludeKeywords: string[][];
-	src: "home" | "all" | "users" | "list" | "group" | "instances";
-	userListId: ID | null;
-	userGroupId: ID | null;
-	users: string[];
-	instances: string[];
-	caseSensitive: boolean;
-	notify: boolean;
-	withReplies: boolean;
-	withFile: boolean;
-	hasUnreadNote: boolean;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.app.md b/packages/firefish-js/markdown/firefish-js.entities.app.md
deleted file mode 100644
index bef377f53b..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.app.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [App](./firefish-js.entities.app.md)
-
-## entities.App type
-
-**Signature:**
-
-```typescript
-export declare type App = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.authsession.md b/packages/firefish-js/markdown/firefish-js.entities.authsession.md
deleted file mode 100644
index d43848ac31..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.authsession.md
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [AuthSession](./firefish-js.entities.authsession.md)
-
-## entities.AuthSession type
-
-**Signature:**
-
-```typescript
-export declare type AuthSession = {
-	id: ID;
-	app: App;
-	token: string;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [App](./firefish-js.entities.app.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.blocking.md b/packages/firefish-js/markdown/firefish-js.entities.blocking.md
deleted file mode 100644
index 189692fb92..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.blocking.md
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Blocking](./firefish-js.entities.blocking.md)
-
-## entities.Blocking type
-
-**Signature:**
-
-```typescript
-export declare type Blocking = {
-	id: ID;
-	createdAt: DateString;
-	blockeeId: User["id"];
-	blockee: UserDetailed;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [UserDetailed](./firefish-js.entities.userdetailed.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.channel.md b/packages/firefish-js/markdown/firefish-js.entities.channel.md
deleted file mode 100644
index 002716f8e3..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.channel.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Channel](./firefish-js.entities.channel.md)
-
-## entities.Channel type
-
-**Signature:**
-
-```typescript
-export declare type Channel = {
-	id: ID;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.clip.md b/packages/firefish-js/markdown/firefish-js.entities.clip.md
deleted file mode 100644
index 41979bc70a..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.clip.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Clip](./firefish-js.entities.clip.md)
-
-## entities.Clip type
-
-**Signature:**
-
-```typescript
-export declare type Clip = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.customemoji.md b/packages/firefish-js/markdown/firefish-js.entities.customemoji.md
deleted file mode 100644
index 4a0b1925b0..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.customemoji.md
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [CustomEmoji](./firefish-js.entities.customemoji.md)
-
-## entities.CustomEmoji type
-
-**Signature:**
-
-```typescript
-export declare type CustomEmoji = {
-	id: string;
-	name: string;
-	url: string;
-	category: string;
-	aliases: string[];
-};
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.datestring.md b/packages/firefish-js/markdown/firefish-js.entities.datestring.md
deleted file mode 100644
index 39a9873e56..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.datestring.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [DateString](./firefish-js.entities.datestring.md)
-
-## entities.DateString type
-
-**Signature:**
-
-```typescript
-export declare type DateString = string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.detailedinstancemetadata.md b/packages/firefish-js/markdown/firefish-js.entities.detailedinstancemetadata.md
deleted file mode 100644
index 7629502d39..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.detailedinstancemetadata.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [DetailedInstanceMetadata](./firefish-js.entities.detailedinstancemetadata.md)
-
-## entities.DetailedInstanceMetadata type
-
-**Signature:**
-
-```typescript
-export declare type DetailedInstanceMetadata = LiteInstanceMetadata & {
-	features: Record<string, any>;
-};
-```
-**References:** [LiteInstanceMetadata](./firefish-js.entities.liteinstancemetadata.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.drivefile.md b/packages/firefish-js/markdown/firefish-js.entities.drivefile.md
deleted file mode 100644
index 1393b5c63b..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.drivefile.md
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [DriveFile](./firefish-js.entities.drivefile.md)
-
-## entities.DriveFile type
-
-**Signature:**
-
-```typescript
-export declare 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<string, any>;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.drivefolder.md b/packages/firefish-js/markdown/firefish-js.entities.drivefolder.md
deleted file mode 100644
index dbbefb1205..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.drivefolder.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [DriveFolder](./firefish-js.entities.drivefolder.md)
-
-## entities.DriveFolder type
-
-**Signature:**
-
-```typescript
-export declare type DriveFolder = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.following.md b/packages/firefish-js/markdown/firefish-js.entities.following.md
deleted file mode 100644
index f5423fb876..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.following.md
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Following](./firefish-js.entities.following.md)
-
-## entities.Following type
-
-**Signature:**
-
-```typescript
-export declare type Following = {
-	id: ID;
-	createdAt: DateString;
-	followerId: User["id"];
-	followeeId: User["id"];
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.followingfolloweepopulated.md b/packages/firefish-js/markdown/firefish-js.entities.followingfolloweepopulated.md
deleted file mode 100644
index 85ed36bf4b..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.followingfolloweepopulated.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [FollowingFolloweePopulated](./firefish-js.entities.followingfolloweepopulated.md)
-
-## entities.FollowingFolloweePopulated type
-
-**Signature:**
-
-```typescript
-export declare type FollowingFolloweePopulated = Following & {
-	followee: UserDetailed;
-};
-```
-**References:** [Following](./firefish-js.entities.following.md)<!-- -->, [UserDetailed](./firefish-js.entities.userdetailed.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.followingfollowerpopulated.md b/packages/firefish-js/markdown/firefish-js.entities.followingfollowerpopulated.md
deleted file mode 100644
index 50d28b5984..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.followingfollowerpopulated.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [FollowingFollowerPopulated](./firefish-js.entities.followingfollowerpopulated.md)
-
-## entities.FollowingFollowerPopulated type
-
-**Signature:**
-
-```typescript
-export declare type FollowingFollowerPopulated = Following & {
-	follower: UserDetailed;
-};
-```
-**References:** [Following](./firefish-js.entities.following.md)<!-- -->, [UserDetailed](./firefish-js.entities.userdetailed.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.followrequest.md b/packages/firefish-js/markdown/firefish-js.entities.followrequest.md
deleted file mode 100644
index 8fbd54b1c0..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.followrequest.md
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [FollowRequest](./firefish-js.entities.followrequest.md)
-
-## entities.FollowRequest type
-
-**Signature:**
-
-```typescript
-export declare type FollowRequest = {
-	id: ID;
-	follower: User;
-	followee: User;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [User](./firefish-js.entities.user.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.gallerypost.md b/packages/firefish-js/markdown/firefish-js.entities.gallerypost.md
deleted file mode 100644
index 057366a8e4..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.gallerypost.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [GalleryPost](./firefish-js.entities.gallerypost.md)
-
-## entities.GalleryPost type
-
-**Signature:**
-
-```typescript
-export declare type GalleryPost = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.id.md b/packages/firefish-js/markdown/firefish-js.entities.id.md
deleted file mode 100644
index 4cc166f980..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.id.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [ID](./firefish-js.entities.id.md)
-
-## entities.ID type
-
-**Signature:**
-
-```typescript
-export declare type ID = string;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.instance.md b/packages/firefish-js/markdown/firefish-js.entities.instance.md
deleted file mode 100644
index 6b78533b0f..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.instance.md
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Instance](./firefish-js.entities.instance.md)
-
-## entities.Instance type
-
-**Signature:**
-
-```typescript
-export declare type Instance = {
-	id: ID;
-	caughtAt: 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;
-	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;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.instancemetadata.md b/packages/firefish-js/markdown/firefish-js.entities.instancemetadata.md
deleted file mode 100644
index c7e6f8a44d..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.instancemetadata.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [InstanceMetadata](./firefish-js.entities.instancemetadata.md)
-
-## entities.InstanceMetadata type
-
-**Signature:**
-
-```typescript
-export declare type InstanceMetadata =
-	| LiteInstanceMetadata
-	| DetailedInstanceMetadata;
-```
-**References:** [LiteInstanceMetadata](./firefish-js.entities.liteinstancemetadata.md)<!-- -->, [DetailedInstanceMetadata](./firefish-js.entities.detailedinstancemetadata.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.liteinstancemetadata.md b/packages/firefish-js/markdown/firefish-js.entities.liteinstancemetadata.md
deleted file mode 100644
index f1af7e7b35..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.liteinstancemetadata.md
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [LiteInstanceMetadata](./firefish-js.entities.liteinstancemetadata.md)
-
-## entities.LiteInstanceMetadata type
-
-**Signature:**
-
-```typescript
-export declare type LiteInstanceMetadata = {
-	maintainerName: string | null;
-	maintainerEmail: string | null;
-	version: string;
-	name: string | null;
-	uri: string;
-	description: string | null;
-	tosUrl: string | null;
-	disableRegistration: boolean;
-	disableLocalTimeline: boolean;
-	disableRecommendedTimeline: boolean;
-	disableGlobalTimeline: boolean;
-	driveCapacityPerLocalUserMb: number;
-	driveCapacityPerRemoteUserMb: number;
-	enableHcaptcha: boolean;
-	hcaptchaSiteKey: string | null;
-	enableRecaptcha: boolean;
-	recaptchaSiteKey: string | null;
-	swPublickey: string | null;
-	maxNoteTextLength: number;
-	enableEmail: boolean;
-	enableTwitterIntegration: boolean;
-	enableGithubIntegration: boolean;
-	enableDiscordIntegration: boolean;
-	enableServiceWorker: boolean;
-	emojis: CustomEmoji[];
-	ads: {
-		id: ID;
-		ratio: number;
-		place: string;
-		url: string;
-		imageUrl: string;
-	}[];
-};
-```
-**References:** [CustomEmoji](./firefish-js.entities.customemoji.md)<!-- -->, [ID](./firefish-js.entities.id.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.md b/packages/firefish-js/markdown/firefish-js.entities.md
deleted file mode 100644
index 260bb8a8a1..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.md
+++ /dev/null
@@ -1,51 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md)
-
-## entities namespace
-
-## Type Aliases
-
-|  Type Alias | Description |
-|  --- | --- |
-|  [Ad](./firefish-js.entities.ad.md) |  |
-|  [Announcement](./firefish-js.entities.announcement.md) |  |
-|  [Antenna](./firefish-js.entities.antenna.md) |  |
-|  [App](./firefish-js.entities.app.md) |  |
-|  [AuthSession](./firefish-js.entities.authsession.md) |  |
-|  [Blocking](./firefish-js.entities.blocking.md) |  |
-|  [Channel](./firefish-js.entities.channel.md) |  |
-|  [Clip](./firefish-js.entities.clip.md) |  |
-|  [CustomEmoji](./firefish-js.entities.customemoji.md) |  |
-|  [DateString](./firefish-js.entities.datestring.md) |  |
-|  [DetailedInstanceMetadata](./firefish-js.entities.detailedinstancemetadata.md) |  |
-|  [DriveFile](./firefish-js.entities.drivefile.md) |  |
-|  [DriveFolder](./firefish-js.entities.drivefolder.md) |  |
-|  [Following](./firefish-js.entities.following.md) |  |
-|  [FollowingFolloweePopulated](./firefish-js.entities.followingfolloweepopulated.md) |  |
-|  [FollowingFollowerPopulated](./firefish-js.entities.followingfollowerpopulated.md) |  |
-|  [FollowRequest](./firefish-js.entities.followrequest.md) |  |
-|  [GalleryPost](./firefish-js.entities.gallerypost.md) |  |
-|  [ID](./firefish-js.entities.id.md) |  |
-|  [Instance](./firefish-js.entities.instance.md) |  |
-|  [InstanceMetadata](./firefish-js.entities.instancemetadata.md) |  |
-|  [LiteInstanceMetadata](./firefish-js.entities.liteinstancemetadata.md) |  |
-|  [MeDetailed](./firefish-js.entities.medetailed.md) |  |
-|  [MessagingMessage](./firefish-js.entities.messagingmessage.md) |  |
-|  [Note](./firefish-js.entities.note.md) |  |
-|  [NoteFavorite](./firefish-js.entities.notefavorite.md) |  |
-|  [NoteReaction](./firefish-js.entities.notereaction.md) |  |
-|  [Notification](./firefish-js.entities.notification.md) |  |
-|  [OriginType](./firefish-js.entities.origintype.md) |  |
-|  [Page](./firefish-js.entities.page.md) |  |
-|  [PageEvent](./firefish-js.entities.pageevent.md) |  |
-|  [ServerInfo](./firefish-js.entities.serverinfo.md) |  |
-|  [Signin](./firefish-js.entities.signin.md) |  |
-|  [Stats](./firefish-js.entities.stats.md) |  |
-|  [User](./firefish-js.entities.user.md) |  |
-|  [UserDetailed](./firefish-js.entities.userdetailed.md) |  |
-|  [UserGroup](./firefish-js.entities.usergroup.md) |  |
-|  [UserList](./firefish-js.entities.userlist.md) |  |
-|  [UserLite](./firefish-js.entities.userlite.md) |  |
-|  [UserSorting](./firefish-js.entities.usersorting.md) |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.medetailed.md b/packages/firefish-js/markdown/firefish-js.entities.medetailed.md
deleted file mode 100644
index 252f698e93..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.medetailed.md
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [MeDetailed](./firefish-js.entities.medetailed.md)
-
-## entities.MeDetailed type
-
-**Signature:**
-
-```typescript
-export declare type MeDetailed = UserDetailed & {
-	avatarId: DriveFile["id"];
-	bannerId: DriveFile["id"];
-	autoAcceptFollowed: boolean;
-	alwaysMarkNsfw: boolean;
-	carefulBot: boolean;
-	emailNotificationTypes: string[];
-	hasPendingReceivedFollowRequest: boolean;
-	hasUnreadAnnouncement: boolean;
-	hasUnreadAntenna: boolean;
-	hasUnreadChannel: boolean;
-	hasUnreadMentions: boolean;
-	hasUnreadMessagingMessage: boolean;
-	hasUnreadNotification: boolean;
-	hasUnreadSpecifiedNotes: boolean;
-	hideOnlineStatus: boolean;
-	injectFeaturedNote: boolean;
-	integrations: Record<string, any>;
-	isDeleted: boolean;
-	isExplorable: boolean;
-	mutedWords: string[][];
-	mutingNotificationTypes: string[];
-	noCrawle: boolean;
-	preventAiLearning: boolean;
-	receiveAnnouncementEmail: boolean;
-	usePasswordLessLogin: boolean;
-	[other: string]: any;
-};
-```
-**References:** [UserDetailed](./firefish-js.entities.userdetailed.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.messagingmessage.md b/packages/firefish-js/markdown/firefish-js.entities.messagingmessage.md
deleted file mode 100644
index 41869577ec..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.messagingmessage.md
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [MessagingMessage](./firefish-js.entities.messagingmessage.md)
-
-## entities.MessagingMessage type
-
-**Signature:**
-
-```typescript
-export declare 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;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [UserGroup](./firefish-js.entities.usergroup.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.note.md b/packages/firefish-js/markdown/firefish-js.entities.note.md
deleted file mode 100644
index 0d17b96c7d..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.note.md
+++ /dev/null
@@ -1,51 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Note](./firefish-js.entities.note.md)
-
-## entities.Note type
-
-**Signature:**
-
-```typescript
-export declare 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"][];
-	localOnly?: boolean;
-	channel?: Channel["id"];
-	myReaction?: string;
-	reactions: Record<string, number>;
-	renoteCount: number;
-	repliesCount: number;
-	poll?: {
-		expiresAt: DateString | null;
-		multiple: boolean;
-		choices: {
-			isVoted: boolean;
-			text: string;
-			votes: number;
-		}[];
-	};
-	emojis: {
-		name: string;
-		url: string;
-	}[];
-	uri?: string;
-	url?: string;
-	updatedAt?: DateString;
-	isHidden?: boolean;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [Note](./firefish-js.entities.note.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)<!-- -->, [Channel](./firefish-js.entities.channel.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.notefavorite.md b/packages/firefish-js/markdown/firefish-js.entities.notefavorite.md
deleted file mode 100644
index c5331fbbe0..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.notefavorite.md
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [NoteFavorite](./firefish-js.entities.notefavorite.md)
-
-## entities.NoteFavorite type
-
-**Signature:**
-
-```typescript
-export declare type NoteFavorite = {
-	id: ID;
-	createdAt: DateString;
-	noteId: Note["id"];
-	note: Note;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [Note](./firefish-js.entities.note.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.notereaction.md b/packages/firefish-js/markdown/firefish-js.entities.notereaction.md
deleted file mode 100644
index c17614e363..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.notereaction.md
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [NoteReaction](./firefish-js.entities.notereaction.md)
-
-## entities.NoteReaction type
-
-**Signature:**
-
-```typescript
-export declare type NoteReaction = {
-	id: ID;
-	createdAt: DateString;
-	user: UserLite;
-	type: string;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [UserLite](./firefish-js.entities.userlite.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.notification.md b/packages/firefish-js/markdown/firefish-js.entities.notification.md
deleted file mode 100644
index 700aed0f1c..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.notification.md
+++ /dev/null
@@ -1,82 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Notification](./firefish-js.entities.notification.md)
-
-## entities.Notification type
-
-**Signature:**
-
-```typescript
-export declare type Notification = {
-	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: "pollVote";
-			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: "app";
-			header?: string | null;
-			body: string;
-			icon?: string | null;
-	  }
-);
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [Note](./firefish-js.entities.note.md)<!-- -->, [UserGroup](./firefish-js.entities.usergroup.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.origintype.md b/packages/firefish-js/markdown/firefish-js.entities.origintype.md
deleted file mode 100644
index f0b6134189..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.origintype.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [OriginType](./firefish-js.entities.origintype.md)
-
-## entities.OriginType type
-
-**Signature:**
-
-```typescript
-export declare type OriginType = "combined" | "local" | "remote";
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.page.md b/packages/firefish-js/markdown/firefish-js.entities.page.md
deleted file mode 100644
index 92fddd7946..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.page.md
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Page](./firefish-js.entities.page.md)
-
-## entities.Page type
-
-**Signature:**
-
-```typescript
-export declare type Page = {
-	id: ID;
-	createdAt: DateString;
-	updatedAt: DateString;
-	userId: User["id"];
-	user: User;
-	content: Record<string, any>[];
-	variables: Record<string, any>[];
-	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;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)<!-- -->, [DriveFile](./firefish-js.entities.drivefile.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.pageevent.md b/packages/firefish-js/markdown/firefish-js.entities.pageevent.md
deleted file mode 100644
index 8ce209a3d2..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.pageevent.md
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [PageEvent](./firefish-js.entities.pageevent.md)
-
-## entities.PageEvent type
-
-**Signature:**
-
-```typescript
-export declare type PageEvent = {
-	pageId: Page["id"];
-	event: string;
-	var: any;
-	userId: User["id"];
-	user: User;
-};
-```
-**References:** [Page](./firefish-js.entities.page.md)<!-- -->, [User](./firefish-js.entities.user.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.serverinfo.md b/packages/firefish-js/markdown/firefish-js.entities.serverinfo.md
deleted file mode 100644
index 3c7e10980d..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.serverinfo.md
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [ServerInfo](./firefish-js.entities.serverinfo.md)
-
-## entities.ServerInfo type
-
-**Signature:**
-
-```typescript
-export declare type ServerInfo = {
-	machine: string;
-	cpu: {
-		model: string;
-		cores: number;
-	};
-	mem: {
-		total: number;
-	};
-	fs: {
-		total: number;
-		used: number;
-	};
-};
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.signin.md b/packages/firefish-js/markdown/firefish-js.entities.signin.md
deleted file mode 100644
index 8c67d7c083..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.signin.md
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Signin](./firefish-js.entities.signin.md)
-
-## entities.Signin type
-
-**Signature:**
-
-```typescript
-export declare type Signin = {
-	id: ID;
-	createdAt: DateString;
-	ip: string;
-	headers: Record<string, any>;
-	success: boolean;
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.stats.md b/packages/firefish-js/markdown/firefish-js.entities.stats.md
deleted file mode 100644
index 36cce7da7c..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.stats.md
+++ /dev/null
@@ -1,19 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [Stats](./firefish-js.entities.stats.md)
-
-## entities.Stats type
-
-**Signature:**
-
-```typescript
-export declare type Stats = {
-	notesCount: number;
-	originalNotesCount: number;
-	usersCount: number;
-	originalUsersCount: number;
-	instances: number;
-	driveUsageLocal: number;
-	driveUsageRemote: number;
-};
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.user.md b/packages/firefish-js/markdown/firefish-js.entities.user.md
deleted file mode 100644
index b3795a1355..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.user.md
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [User](./firefish-js.entities.user.md)
-
-## entities.User type
-
-**Signature:**
-
-```typescript
-export declare type User = UserLite | UserDetailed;
-```
-**References:** [UserLite](./firefish-js.entities.userlite.md)<!-- -->, [UserDetailed](./firefish-js.entities.userdetailed.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.userdetailed.md b/packages/firefish-js/markdown/firefish-js.entities.userdetailed.md
deleted file mode 100644
index 839f0105a5..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.userdetailed.md
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [UserDetailed](./firefish-js.entities.userdetailed.md)
-
-## entities.UserDetailed type
-
-**Signature:**
-
-```typescript
-export declare type UserDetailed = UserLite & {
-	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;
-	}[];
-	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;
-	isRenoteMuted: boolean;
-	isSilenced: boolean;
-	isSuspended: boolean;
-	lang: string | null;
-	lastFetchedAt?: DateString;
-	location: string | null;
-	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;
-};
-```
-**References:** [UserLite](./firefish-js.entities.userlite.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [ID](./firefish-js.entities.id.md)<!-- -->, [Note](./firefish-js.entities.note.md)<!-- -->, [Page](./firefish-js.entities.page.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.usergroup.md b/packages/firefish-js/markdown/firefish-js.entities.usergroup.md
deleted file mode 100644
index bffa8e9f01..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.usergroup.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [UserGroup](./firefish-js.entities.usergroup.md)
-
-## entities.UserGroup type
-
-**Signature:**
-
-```typescript
-export declare type UserGroup = TODO;
-```
diff --git a/packages/firefish-js/markdown/firefish-js.entities.userlist.md b/packages/firefish-js/markdown/firefish-js.entities.userlist.md
deleted file mode 100644
index d049f0899e..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.userlist.md
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [UserList](./firefish-js.entities.userlist.md)
-
-## entities.UserList type
-
-**Signature:**
-
-```typescript
-export declare type UserList = {
-	id: ID;
-	createdAt: DateString;
-	name: string;
-	userIds: User["id"][];
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [DateString](./firefish-js.entities.datestring.md)<!-- -->, [User](./firefish-js.entities.user.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.userlite.md b/packages/firefish-js/markdown/firefish-js.entities.userlite.md
deleted file mode 100644
index 0111a39a6a..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.userlite.md
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [UserLite](./firefish-js.entities.userlite.md)
-
-## entities.UserLite type
-
-**Signature:**
-
-```typescript
-export declare type UserLite = {
-	id: ID;
-	username: string;
-	host: string | null;
-	name: string;
-	onlineStatus: "online" | "active" | "offline" | "unknown";
-	avatarUrl: string;
-	avatarBlurhash: string;
-	alsoKnownAs: string[];
-	movedToUri: any;
-	emojis: {
-		name: string;
-		url: string;
-	}[];
-	instance?: {
-		name: Instance["name"];
-		softwareName: Instance["softwareName"];
-		softwareVersion: Instance["softwareVersion"];
-		iconUrl: Instance["iconUrl"];
-		faviconUrl: Instance["faviconUrl"];
-		themeColor: Instance["themeColor"];
-	};
-};
-```
-**References:** [ID](./firefish-js.entities.id.md)<!-- -->, [Instance](./firefish-js.entities.instance.md)
-
diff --git a/packages/firefish-js/markdown/firefish-js.entities.usersorting.md b/packages/firefish-js/markdown/firefish-js.entities.usersorting.md
deleted file mode 100644
index be9ebb81d1..0000000000
--- a/packages/firefish-js/markdown/firefish-js.entities.usersorting.md
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [entities](./firefish-js.entities.md) &gt; [UserSorting](./firefish-js.entities.usersorting.md)
-
-## entities.UserSorting type
-
-**Signature:**
-
-```typescript
-export declare type UserSorting =
-	| "+follower"
-	| "-follower"
-	| "+createdAt"
-	| "-createdAt"
-	| "+updatedAt"
-	| "-updatedAt";
-```
diff --git a/packages/firefish-js/markdown/firefish-js.ffvisibility.md b/packages/firefish-js/markdown/firefish-js.ffvisibility.md
deleted file mode 100644
index 9cee2dc387..0000000000
--- a/packages/firefish-js/markdown/firefish-js.ffvisibility.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [ffVisibility](./firefish-js.ffvisibility.md)
-
-## ffVisibility variable
-
-**Signature:**
-
-```typescript
-ffVisibility: readonly ["public", "followers", "private"]
-```
diff --git a/packages/firefish-js/markdown/firefish-js.md b/packages/firefish-js/markdown/firefish-js.md
deleted file mode 100644
index 03e0519189..0000000000
--- a/packages/firefish-js/markdown/firefish-js.md
+++ /dev/null
@@ -1,43 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md)
-
-## firefish-js package
-
-## Classes
-
-|  Class | Description |
-|  --- | --- |
-|  [Stream](./firefish-js.stream.md) |  |
-
-## Abstract Classes
-
-|  Abstract Class | Description |
-|  --- | --- |
-|  [ChannelConnection](./firefish-js.channelconnection.md) |  |
-
-## Namespaces
-
-|  Namespace | Description |
-|  --- | --- |
-|  [api](./firefish-js.api.md) |  |
-|  [entities](./firefish-js.entities.md) |  |
-
-## Variables
-
-|  Variable | Description |
-|  --- | --- |
-|  [ffVisibility](./firefish-js.ffvisibility.md) |  |
-|  [mutedNoteReasons](./firefish-js.mutednotereasons.md) |  |
-|  [noteVisibilities](./firefish-js.notevisibilities.md) |  |
-|  [notificationTypes](./firefish-js.notificationtypes.md) |  |
-|  [permissions](./firefish-js.permissions.md) |  |
-
-## Type Aliases
-
-|  Type Alias | Description |
-|  --- | --- |
-|  [Acct](./firefish-js.acct.md) |  |
-|  [Channels](./firefish-js.channels.md) |  |
-|  [Endpoints](./firefish-js.endpoints.md) |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.mutednotereasons.md b/packages/firefish-js/markdown/firefish-js.mutednotereasons.md
deleted file mode 100644
index 537d897ce6..0000000000
--- a/packages/firefish-js/markdown/firefish-js.mutednotereasons.md
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [mutedNoteReasons](./firefish-js.mutednotereasons.md)
-
-## mutedNoteReasons variable
-
-**Signature:**
-
-```typescript
-mutedNoteReasons: readonly [
-	"word",
-	"manual",
-	"spam",
-	"other",
-]
-```
diff --git a/packages/firefish-js/markdown/firefish-js.notevisibilities.md b/packages/firefish-js/markdown/firefish-js.notevisibilities.md
deleted file mode 100644
index c39e4075cc..0000000000
--- a/packages/firefish-js/markdown/firefish-js.notevisibilities.md
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [noteVisibilities](./firefish-js.notevisibilities.md)
-
-## noteVisibilities variable
-
-**Signature:**
-
-```typescript
-noteVisibilities: readonly [
-	"public",
-	"home",
-	"followers",
-	"specified",
-]
-```
diff --git a/packages/firefish-js/markdown/firefish-js.notificationtypes.md b/packages/firefish-js/markdown/firefish-js.notificationtypes.md
deleted file mode 100644
index 49ae568d52..0000000000
--- a/packages/firefish-js/markdown/firefish-js.notificationtypes.md
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [notificationTypes](./firefish-js.notificationtypes.md)
-
-## notificationTypes variable
-
-**Signature:**
-
-```typescript
-notificationTypes: readonly [
-	"follow",
-	"mention",
-	"reply",
-	"renote",
-	"quote",
-	"reaction",
-	"pollVote",
-	"pollEnded",
-	"receiveFollowRequest",
-	"followRequestAccepted",
-	"groupInvited",
-	"app",
-]
-```
diff --git a/packages/firefish-js/markdown/firefish-js.permissions.md b/packages/firefish-js/markdown/firefish-js.permissions.md
deleted file mode 100644
index 937a41de1e..0000000000
--- a/packages/firefish-js/markdown/firefish-js.permissions.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [permissions](./firefish-js.permissions.md)
-
-## permissions variable
-
-**Signature:**
-
-```typescript
-permissions: string[]
-```
diff --git a/packages/firefish-js/markdown/firefish-js.stream._constructor_.md b/packages/firefish-js/markdown/firefish-js.stream._constructor_.md
deleted file mode 100644
index 908972661d..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream._constructor_.md
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [(constructor)](./firefish-js.stream._constructor_.md)
-
-## Stream.(constructor)
-
-Constructs a new instance of the `Stream` class
-
-**Signature:**
-
-```typescript
-constructor(
-		origin: string,
-		user: {
-			token: string;
-		} | null,
-		options?: {
-			WebSocket?: any;
-		},
-	);
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  origin | string |  |
-|  user | { token: string; } \| null |  |
-|  options | { WebSocket?: any; } | _(Optional)_ |
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.close.md b/packages/firefish-js/markdown/firefish-js.stream.close.md
deleted file mode 100644
index c37d8c0459..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.close.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [close](./firefish-js.stream.close.md)
-
-## Stream.close() method
-
-**Signature:**
-
-```typescript
-close(): void;
-```
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.disconnecttochannel.md b/packages/firefish-js/markdown/firefish-js.stream.disconnecttochannel.md
deleted file mode 100644
index c3944ecc87..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.disconnecttochannel.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [disconnectToChannel](./firefish-js.stream.disconnecttochannel.md)
-
-## Stream.disconnectToChannel() method
-
-**Signature:**
-
-```typescript
-disconnectToChannel(connection: NonSharedConnection): void;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  connection | NonSharedConnection |  |
-
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.md b/packages/firefish-js/markdown/firefish-js.stream.md
deleted file mode 100644
index 91c8bb6508..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.md
+++ /dev/null
@@ -1,36 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md)
-
-## Stream class
-
-**Signature:**
-
-```typescript
-export default class Stream extends EventEmitter<StreamEvents> 
-```
-**Extends:** EventEmitter&lt;StreamEvents&gt;
-
-## Constructors
-
-|  Constructor | Modifiers | Description |
-|  --- | --- | --- |
-|  [(constructor)(origin, user, options)](./firefish-js.stream._constructor_.md) |  | Constructs a new instance of the <code>Stream</code> class |
-
-## Properties
-
-|  Property | Modifiers | Type | Description |
-|  --- | --- | --- | --- |
-|  [state](./firefish-js.stream.state.md) |  | "initializing" \| "reconnecting" \| "connected" |  |
-
-## Methods
-
-|  Method | Modifiers | Description |
-|  --- | --- | --- |
-|  [close()](./firefish-js.stream.close.md) |  |  |
-|  [disconnectToChannel(connection)](./firefish-js.stream.disconnecttochannel.md) |  |  |
-|  [removeSharedConnection(connection)](./firefish-js.stream.removesharedconnection.md) |  |  |
-|  [removeSharedConnectionPool(pool)](./firefish-js.stream.removesharedconnectionpool.md) |  |  |
-|  [send(typeOrPayload, payload)](./firefish-js.stream.send.md) |  |  |
-|  [useChannel(channel, params, name)](./firefish-js.stream.usechannel.md) |  |  |
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.removesharedconnection.md b/packages/firefish-js/markdown/firefish-js.stream.removesharedconnection.md
deleted file mode 100644
index cddf982fab..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.removesharedconnection.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [removeSharedConnection](./firefish-js.stream.removesharedconnection.md)
-
-## Stream.removeSharedConnection() method
-
-**Signature:**
-
-```typescript
-removeSharedConnection(connection: SharedConnection): void;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  connection | SharedConnection |  |
-
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.removesharedconnectionpool.md b/packages/firefish-js/markdown/firefish-js.stream.removesharedconnectionpool.md
deleted file mode 100644
index fd56dd287c..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.removesharedconnectionpool.md
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [removeSharedConnectionPool](./firefish-js.stream.removesharedconnectionpool.md)
-
-## Stream.removeSharedConnectionPool() method
-
-**Signature:**
-
-```typescript
-removeSharedConnectionPool(pool: Pool): void;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  pool | Pool |  |
-
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.send.md b/packages/firefish-js/markdown/firefish-js.stream.send.md
deleted file mode 100644
index 4defb4d187..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.send.md
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [send](./firefish-js.stream.send.md)
-
-## Stream.send() method
-
-**Signature:**
-
-```typescript
-send(typeOrPayload: any, payload?: any): void;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  typeOrPayload | any |  |
-|  payload | any | _(Optional)_ |
-
-**Returns:**
-
-void
-
diff --git a/packages/firefish-js/markdown/firefish-js.stream.state.md b/packages/firefish-js/markdown/firefish-js.stream.state.md
deleted file mode 100644
index 4ad898f878..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.state.md
+++ /dev/null
@@ -1,11 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [state](./firefish-js.stream.state.md)
-
-## Stream.state property
-
-**Signature:**
-
-```typescript
-state: "initializing" | "reconnecting" | "connected";
-```
diff --git a/packages/firefish-js/markdown/firefish-js.stream.usechannel.md b/packages/firefish-js/markdown/firefish-js.stream.usechannel.md
deleted file mode 100644
index 791ac17a35..0000000000
--- a/packages/firefish-js/markdown/firefish-js.stream.usechannel.md
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md) &gt; [firefish-js](./firefish-js.md) &gt; [Stream](./firefish-js.stream.md) &gt; [useChannel](./firefish-js.stream.usechannel.md)
-
-## Stream.useChannel() method
-
-**Signature:**
-
-```typescript
-useChannel<C extends keyof Channels>(
-		channel: C,
-		params?: Channels[C]["params"],
-		name?: string,
-	): Connection<Channels[C]>;
-```
-
-## Parameters
-
-|  Parameter | Type | Description |
-|  --- | --- | --- |
-|  channel | C |  |
-|  params | [Channels](./firefish-js.channels.md)<!-- -->\[C\]\["params"\] | _(Optional)_ |
-|  name | string | _(Optional)_ |
-
-**Returns:**
-
-[Connection](./firefish-js.channelconnection.md)<!-- -->&lt;[Channels](./firefish-js.channels.md)<!-- -->\[C\]&gt;
-
diff --git a/packages/firefish-js/markdown/index.md b/packages/firefish-js/markdown/index.md
deleted file mode 100644
index 0eebad9831..0000000000
--- a/packages/firefish-js/markdown/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
-<!-- Do not edit this file. It is automatically generated by API Documenter. -->
-
-[Home](./index.md)
-
-## API Reference
-
-## Packages
-
-|  Package | Description |
-|  --- | --- |
-|  [firefish-js](./firefish-js.md) |  |
-
diff --git a/packages/firefish-js/package.json b/packages/firefish-js/package.json
index a9e4e2ee9e..549730653f 100644
--- a/packages/firefish-js/package.json
+++ b/packages/firefish-js/package.json
@@ -1,19 +1,17 @@
 {
 	"name": "firefish-js",
-	"version": "0.0.24",
+	"version": "0.0.27",
 	"description": "Firefish SDK for JavaScript",
+	"homepage": "https://git.joinfirefish.org/firefish/firefish/-/tree/develop/packages/firefish-js",
 	"main": "./built/index.js",
 	"types": "./built/index.d.ts",
+	"license": "MIT",
 	"scripts": {
 		"build": "pnpm swc src -d built -D",
+		"build:types": "pnpm tsc --emitDeclarationOnly",
 		"build:debug": "pnpm swc src -d built -s -D",
-		"render": "pnpm run build && pnpm run api && pnpm run api-prod && cp temp/firefish-js.api.json etc/ && pnpm run api-doc",
-		"tsd": "tsc && tsd",
-		"api": "pnpm api-extractor run --local --verbose",
-		"api-prod": "pnpm api-extractor run --verbose",
-		"api-doc": "pnpm api-documenter markdown -i ./etc/",
-		"lint": "pnpm biome check --apply *.ts",
-		"format": "pnpm biome format --write **/*.ts",
+		"lint": "pnpm biome check --apply src",
+		"format": "pnpm biome format --write src",
 		"jest": "jest --coverage --detectOpenHandles",
 		"test": "pnpm jest && pnpm tsd"
 	},
@@ -22,28 +20,26 @@
 		"url": "https://git.joinfirefish.org/firefish/firefish.git"
 	},
 	"devDependencies": {
-		"@microsoft/api-extractor": "^7.36.0",
-		"@microsoft/api-documenter": "^7.22.21",
-		"@swc/cli": "^0.1.62",
+		"@swc/cli": "^0.1.63",
 		"@swc/core": "1.3.78",
-		"@types/jest": "^27.4.0",
-		"@types/node": "20.3.1",
-		"jest": "^27.4.5",
+		"@swc/types": "^0.1.5",
+		"@types/jest": "^29.5.8",
+		"@types/node": "20.9.0",
+		"jest": "^29.7.0",
 		"jest-fetch-mock": "^3.0.3",
-		"jest-websocket-mock": "^2.2.1",
-		"mock-socket": "^9.0.8",
-		"ts-jest": "^27.1.2",
-		"ts-node": "10.4.0",
-		"tsd": "^0.28.1",
-		"typescript": "5.1.3"
+		"jest-websocket-mock": "^2.5.0",
+		"mock-socket": "^9.3.1",
+		"ts-jest": "^29.1.1",
+		"ts-node": "10.9.1",
+		"tsd": "^0.29.0",
+		"typescript": "5.2.2"
 	},
 	"files": [
 		"built"
 	],
 	"dependencies": {
-		"eventemitter3": "^4.0.7",
-		"reconnecting-websocket": "^4.4.0",
-		"semver": "^7.3.8"
+		"eventemitter3": "^5.0.1",
+		"reconnecting": "^4.4.1"
 	},
 	"optionalDependencies": {
 		"@swc/core-android-arm64": "1.3.11"
diff --git a/packages/firefish-js/src/streaming.ts b/packages/firefish-js/src/streaming.ts
index 924e33a45c..4697acabd7 100644
--- a/packages/firefish-js/src/streaming.ts
+++ b/packages/firefish-js/src/streaming.ts
@@ -1,5 +1,5 @@
 import { EventEmitter } from "eventemitter3";
-import ReconnectingWebsocket from "reconnecting-websocket";
+import ReconnectingWebsocket from "reconnecting";
 import { BroadcastEvents, Channels } from "./streaming.types";
 
 function autobind(instance: any): void {
@@ -26,8 +26,10 @@ export function urlQuery(
 ): string {
 	const params = Object.entries(obj)
 		.filter(([, v]) => (Array.isArray(v) ? v.length : v !== undefined))
-		// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 		.reduce(
+			// rome-ignore lint/suspicious/noAssignInExpressions: <Used for key assigning>
+			// rome-ignore lint/style/noNonNullAssertion: <>
+			// rome-ignore lint/style/noCommaOperator: <>
 			(a, [k, v]) => ((a[k] = v!), a),
 			{} as Record<string, string | number | boolean>,
 		);
@@ -45,7 +47,7 @@ type StreamEvents = {
 } & BroadcastEvents;
 
 /**
- * Misskey stream connection
+ * Firefish stream connection
  */
 export default class Stream extends EventEmitter<StreamEvents> {
 	private stream: ReconnectingWebsocket;
@@ -81,7 +83,6 @@ export default class Stream extends EventEmitter<StreamEvents> {
 			`${wsOrigin}/streaming?${query}`,
 			"",
 			{
-				minReconnectionDelay: 1, // https://github.com/pladaria/reconnecting-websocket/issues/91
 				WebSocket: options.WebSocket,
 			},
 		);
diff --git a/packages/firefish-js/test/api.ts b/packages/firefish-js/test/api.test.ts
similarity index 100%
rename from packages/firefish-js/test/api.ts
rename to packages/firefish-js/test/api.test.ts
diff --git a/packages/firefish-js/test/streaming.ts b/packages/firefish-js/test/streaming.test.ts
similarity index 100%
rename from packages/firefish-js/test/streaming.ts
rename to packages/firefish-js/test/streaming.test.ts
diff --git a/packages/megalodon/package.json b/packages/megalodon/package.json
new file mode 100644
index 0000000000..3403b94b47
--- /dev/null
+++ b/packages/megalodon/package.json
@@ -0,0 +1,83 @@
+{
+  "name": "megalodon",
+  "private": true,
+  "main": "./lib/src/index.js",
+  "typings": "./lib/src/index.d.ts",
+  "scripts": {
+    "build": "tsc -p ./",
+		"build:debug": "pnpm run build",
+    "lint": "pnpm biome check **/*.ts --apply",
+		"format": "pnpm biome format --write src/**/*.ts",
+    "doc": "typedoc --out ../docs ./src",
+    "test": "NODE_ENV=test jest -u --maxWorkers=3"
+  },
+  "jest": {
+    "moduleFileExtensions": [
+      "ts",
+      "js"
+    ],
+    "moduleNameMapper": {
+      "^@/(.+)": "<rootDir>/src/$1",
+      "^~/(.+)": "<rootDir>/$1"
+    },
+    "testMatch": [
+      "**/test/**/*.spec.ts"
+    ],
+    "preset": "ts-jest/presets/default",
+    "transform": {
+      "^.+\\.(ts|tsx)$": "ts-jest"
+    },
+    "globals": {
+      "ts-jest": {
+        "tsconfig": "tsconfig.json"
+      }
+    },
+    "testEnvironment": "node"
+  },
+  "dependencies": {
+    "@types/oauth": "^0.9.0",
+    "@types/ws": "^8.5.4",
+    "axios": "1.2.2",
+    "dayjs": "^1.11.7",
+    "form-data": "^4.0.0",
+    "https-proxy-agent": "^5.0.1",
+    "oauth": "^0.10.0",
+    "object-assign-deep": "^0.4.0",
+    "parse-link-header": "^2.0.0",
+    "socks-proxy-agent": "^7.0.0",
+    "typescript": "4.9.4",
+    "uuid": "^9.0.0",
+    "ws": "8.12.0",
+    "async-lock": "1.4.0"
+  },
+  "devDependencies": {
+    "@types/core-js": "^2.5.0",
+    "@types/form-data": "^2.5.0",
+    "@types/jest": "^29.4.0",
+    "@types/object-assign-deep": "^0.4.0",
+    "@types/parse-link-header": "^2.0.0",
+    "@types/uuid": "^9.0.0",
+		"@types/node": "18.11.18",
+    "@typescript-eslint/eslint-plugin": "^5.49.0",
+    "@typescript-eslint/parser": "^5.49.0",
+    "@types/async-lock": "1.4.0",
+    "eslint": "^8.32.0",
+    "eslint-config-prettier": "^8.6.0",
+    "eslint-config-standard": "^16.0.3",
+    "eslint-plugin-import": "^2.27.5",
+    "eslint-plugin-node": "^11.0.0",
+    "eslint-plugin-prettier": "^4.2.1",
+    "eslint-plugin-promise": "^6.1.1",
+    "eslint-plugin-standard": "^5.0.0",
+    "jest": "^29.4.0",
+    "jest-worker": "^29.4.0",
+    "lodash": "^4.17.14",
+    "prettier": "^2.8.3",
+    "ts-jest": "^29.0.5",
+    "typedoc": "^0.23.24"
+  },
+  "directories": {
+    "lib": "lib",
+    "test": "test"
+  }
+}
diff --git a/packages/megalodon/src/axios.d.ts b/packages/megalodon/src/axios.d.ts
new file mode 100644
index 0000000000..f19fe38a2b
--- /dev/null
+++ b/packages/megalodon/src/axios.d.ts
@@ -0,0 +1 @@
+declare module "axios/lib/adapters/http";
diff --git a/packages/megalodon/src/cancel.ts b/packages/megalodon/src/cancel.ts
new file mode 100644
index 0000000000..f8e4729b8e
--- /dev/null
+++ b/packages/megalodon/src/cancel.ts
@@ -0,0 +1,13 @@
+export class RequestCanceledError extends Error {
+	public isCancel: boolean;
+
+	constructor(msg: string) {
+		super(msg);
+		this.isCancel = true;
+		Object.setPrototypeOf(this, RequestCanceledError);
+	}
+}
+
+export const isCancel = (value: any): boolean => {
+	return value && value.isCancel;
+};
diff --git a/packages/megalodon/src/converter.ts b/packages/megalodon/src/converter.ts
new file mode 100644
index 0000000000..93d669fa7d
--- /dev/null
+++ b/packages/megalodon/src/converter.ts
@@ -0,0 +1,3 @@
+import MisskeyAPI from "./misskey/api_client";
+
+export default MisskeyAPI.Converter;
diff --git a/packages/megalodon/src/default.ts b/packages/megalodon/src/default.ts
new file mode 100644
index 0000000000..45bce13e21
--- /dev/null
+++ b/packages/megalodon/src/default.ts
@@ -0,0 +1,3 @@
+export const NO_REDIRECT = "urn:ietf:wg:oauth:2.0:oob";
+export const DEFAULT_SCOPE = ["read", "write", "follow"];
+export const DEFAULT_UA = "megalodon";
diff --git a/packages/megalodon/src/entities/account.ts b/packages/megalodon/src/entities/account.ts
new file mode 100644
index 0000000000..06a85eb98e
--- /dev/null
+++ b/packages/megalodon/src/entities/account.ts
@@ -0,0 +1,27 @@
+/// <reference path="emoji.ts" />
+/// <reference path="source.ts" />
+/// <reference path="field.ts" />
+namespace Entity {
+	export type Account = {
+		id: string;
+		username: string;
+		acct: string;
+		display_name: string;
+		locked: boolean;
+		created_at: string;
+		followers_count: number;
+		following_count: number;
+		statuses_count: number;
+		note: string;
+		url: string;
+		avatar: string;
+		avatar_static: string;
+		header: string;
+		header_static: string;
+		emojis: Array<Emoji>;
+		moved: Account | null;
+		fields: Array<Field>;
+		bot: boolean | null;
+		source?: Source;
+	};
+}
diff --git a/packages/megalodon/src/entities/activity.ts b/packages/megalodon/src/entities/activity.ts
new file mode 100644
index 0000000000..6bc0b6d80e
--- /dev/null
+++ b/packages/megalodon/src/entities/activity.ts
@@ -0,0 +1,8 @@
+namespace Entity {
+	export type Activity = {
+		week: string;
+		statuses: string;
+		logins: string;
+		registrations: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/announcement.ts b/packages/megalodon/src/entities/announcement.ts
new file mode 100644
index 0000000000..7c79831634
--- /dev/null
+++ b/packages/megalodon/src/entities/announcement.ts
@@ -0,0 +1,34 @@
+/// <reference path="tag.ts" />
+/// <reference path="emoji.ts" />
+/// <reference path="reaction.ts" />
+
+namespace Entity {
+	export type Announcement = {
+		id: string;
+		content: string;
+		starts_at: string | null;
+		ends_at: string | null;
+		published: boolean;
+		all_day: boolean;
+		published_at: string;
+		updated_at: string;
+		read?: boolean;
+		mentions: Array<AnnouncementAccount>;
+		statuses: Array<AnnouncementStatus>;
+		tags: Array<Tag>;
+		emojis: Array<Emoji>;
+		reactions: Array<Reaction>;
+	};
+
+	export type AnnouncementAccount = {
+		id: string;
+		username: string;
+		url: string;
+		acct: string;
+	};
+
+	export type AnnouncementStatus = {
+		id: string;
+		url: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/application.ts b/packages/megalodon/src/entities/application.ts
new file mode 100644
index 0000000000..9b98b12772
--- /dev/null
+++ b/packages/megalodon/src/entities/application.ts
@@ -0,0 +1,7 @@
+namespace Entity {
+	export type Application = {
+		name: string;
+		website?: string | null;
+		vapid_key?: string | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/async_attachment.ts b/packages/megalodon/src/entities/async_attachment.ts
new file mode 100644
index 0000000000..9cc17acc5c
--- /dev/null
+++ b/packages/megalodon/src/entities/async_attachment.ts
@@ -0,0 +1,14 @@
+/// <reference path="attachment.ts" />
+namespace Entity {
+	export type AsyncAttachment = {
+		id: string;
+		type: "unknown" | "image" | "gifv" | "video" | "audio";
+		url: string | null;
+		remote_url: string | null;
+		preview_url: string;
+		text_url: string | null;
+		meta: Meta | null;
+		description: string | null;
+		blurhash: string | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/attachment.ts b/packages/megalodon/src/entities/attachment.ts
new file mode 100644
index 0000000000..082c79eddb
--- /dev/null
+++ b/packages/megalodon/src/entities/attachment.ts
@@ -0,0 +1,49 @@
+namespace Entity {
+	export type Sub = {
+		// For Image, Gifv, and Video
+		width?: number;
+		height?: number;
+		size?: string;
+		aspect?: number;
+
+		// For Gifv and Video
+		frame_rate?: string;
+
+		// For Audio, Gifv, and Video
+		duration?: number;
+		bitrate?: number;
+	};
+
+	export type Focus = {
+		x: number;
+		y: number;
+	};
+
+	export type Meta = {
+		original?: Sub;
+		small?: Sub;
+		focus?: Focus;
+		length?: string;
+		duration?: number;
+		fps?: number;
+		size?: string;
+		width?: number;
+		height?: number;
+		aspect?: number;
+		audio_encode?: string;
+		audio_bitrate?: string;
+		audio_channel?: string;
+	};
+
+	export type Attachment = {
+		id: string;
+		type: "unknown" | "image" | "gifv" | "video" | "audio";
+		url: string;
+		remote_url: string | null;
+		preview_url: string | null;
+		text_url: string | null;
+		meta: Meta | null;
+		description: string | null;
+		blurhash: string | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/card.ts b/packages/megalodon/src/entities/card.ts
new file mode 100644
index 0000000000..356d99aee4
--- /dev/null
+++ b/packages/megalodon/src/entities/card.ts
@@ -0,0 +1,16 @@
+namespace Entity {
+	export type Card = {
+		url: string;
+		title: string;
+		description: string;
+		type: "link" | "photo" | "video" | "rich";
+		image?: string;
+		author_name?: string;
+		author_url?: string;
+		provider_name?: string;
+		provider_url?: string;
+		html?: string;
+		width?: number;
+		height?: number;
+	};
+}
diff --git a/packages/megalodon/src/entities/context.ts b/packages/megalodon/src/entities/context.ts
new file mode 100644
index 0000000000..a794a7c5a8
--- /dev/null
+++ b/packages/megalodon/src/entities/context.ts
@@ -0,0 +1,8 @@
+/// <reference path="status.ts" />
+
+namespace Entity {
+	export type Context = {
+		ancestors: Array<Status>;
+		descendants: Array<Status>;
+	};
+}
diff --git a/packages/megalodon/src/entities/conversation.ts b/packages/megalodon/src/entities/conversation.ts
new file mode 100644
index 0000000000..2bdc196661
--- /dev/null
+++ b/packages/megalodon/src/entities/conversation.ts
@@ -0,0 +1,11 @@
+/// <reference path="account.ts" />
+/// <reference path="status.ts" />
+
+namespace Entity {
+	export type Conversation = {
+		id: string;
+		accounts: Array<Account>;
+		last_status: Status | null;
+		unread: boolean;
+	};
+}
diff --git a/packages/megalodon/src/entities/emoji.ts b/packages/megalodon/src/entities/emoji.ts
new file mode 100644
index 0000000000..10c32ab0bd
--- /dev/null
+++ b/packages/megalodon/src/entities/emoji.ts
@@ -0,0 +1,9 @@
+namespace Entity {
+	export type Emoji = {
+		shortcode: string;
+		static_url: string;
+		url: string;
+		visible_in_picker: boolean;
+		category: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/featured_tag.ts b/packages/megalodon/src/entities/featured_tag.ts
new file mode 100644
index 0000000000..fc9f8c69cc
--- /dev/null
+++ b/packages/megalodon/src/entities/featured_tag.ts
@@ -0,0 +1,8 @@
+namespace Entity {
+	export type FeaturedTag = {
+		id: string;
+		name: string;
+		statuses_count: number;
+		last_status_at: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/field.ts b/packages/megalodon/src/entities/field.ts
new file mode 100644
index 0000000000..de4b6b2b72
--- /dev/null
+++ b/packages/megalodon/src/entities/field.ts
@@ -0,0 +1,7 @@
+namespace Entity {
+	export type Field = {
+		name: string;
+		value: string;
+		verified_at: string | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/filter.ts b/packages/megalodon/src/entities/filter.ts
new file mode 100644
index 0000000000..55b7305cc3
--- /dev/null
+++ b/packages/megalodon/src/entities/filter.ts
@@ -0,0 +1,12 @@
+namespace Entity {
+	export type Filter = {
+		id: string;
+		phrase: string;
+		context: Array<FilterContext>;
+		expires_at: string | null;
+		irreversible: boolean;
+		whole_word: boolean;
+	};
+
+	export type FilterContext = string;
+}
diff --git a/packages/megalodon/src/entities/history.ts b/packages/megalodon/src/entities/history.ts
new file mode 100644
index 0000000000..4676357d69
--- /dev/null
+++ b/packages/megalodon/src/entities/history.ts
@@ -0,0 +1,7 @@
+namespace Entity {
+	export type History = {
+		day: string;
+		uses: number;
+		accounts: number;
+	};
+}
diff --git a/packages/megalodon/src/entities/identity_proof.ts b/packages/megalodon/src/entities/identity_proof.ts
new file mode 100644
index 0000000000..3b42e6f412
--- /dev/null
+++ b/packages/megalodon/src/entities/identity_proof.ts
@@ -0,0 +1,9 @@
+namespace Entity {
+	export type IdentityProof = {
+		provider: string;
+		provider_username: string;
+		updated_at: string;
+		proof_url: string;
+		profile_url: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/instance.ts b/packages/megalodon/src/entities/instance.ts
new file mode 100644
index 0000000000..9c0f572db4
--- /dev/null
+++ b/packages/megalodon/src/entities/instance.ts
@@ -0,0 +1,41 @@
+/// <reference path="account.ts" />
+/// <reference path="urls.ts" />
+/// <reference path="stats.ts" />
+
+namespace Entity {
+	export type Instance = {
+		uri: string;
+		title: string;
+		description: string;
+		email: string;
+		version: string;
+		thumbnail: string | null;
+		urls: URLs;
+		stats: Stats;
+		languages: Array<string>;
+		contact_account: Account | null;
+		max_toot_chars?: number;
+		registrations?: boolean;
+		configuration?: {
+			statuses: {
+				max_characters: number;
+				max_media_attachments: number;
+				characters_reserved_per_url: number;
+			};
+			media_attachments: {
+				supported_mime_types: Array<string>;
+				image_size_limit: number;
+				image_matrix_limit: number;
+				video_size_limit: number;
+				video_frame_limit: number;
+				video_matrix_limit: number;
+			};
+			polls: {
+				max_options: number;
+				max_characters_per_option: number;
+				min_expiration: number;
+				max_expiration: number;
+			};
+		};
+	};
+}
diff --git a/packages/megalodon/src/entities/list.ts b/packages/megalodon/src/entities/list.ts
new file mode 100644
index 0000000000..97e75286b2
--- /dev/null
+++ b/packages/megalodon/src/entities/list.ts
@@ -0,0 +1,6 @@
+namespace Entity {
+	export type List = {
+		id: string;
+		title: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/marker.ts b/packages/megalodon/src/entities/marker.ts
new file mode 100644
index 0000000000..7ee99282ca
--- /dev/null
+++ b/packages/megalodon/src/entities/marker.ts
@@ -0,0 +1,15 @@
+namespace Entity {
+	export type Marker = {
+		home?: {
+			last_read_id: string;
+			version: number;
+			updated_at: string;
+		};
+		notifications?: {
+			last_read_id: string;
+			version: number;
+			updated_at: string;
+			unread_count?: number;
+		};
+	};
+}
diff --git a/packages/megalodon/src/entities/mention.ts b/packages/megalodon/src/entities/mention.ts
new file mode 100644
index 0000000000..4fe36a6553
--- /dev/null
+++ b/packages/megalodon/src/entities/mention.ts
@@ -0,0 +1,8 @@
+namespace Entity {
+	export type Mention = {
+		id: string;
+		username: string;
+		url: string;
+		acct: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/notification.ts b/packages/megalodon/src/entities/notification.ts
new file mode 100644
index 0000000000..68eff3347e
--- /dev/null
+++ b/packages/megalodon/src/entities/notification.ts
@@ -0,0 +1,15 @@
+/// <reference path="account.ts" />
+/// <reference path="status.ts" />
+
+namespace Entity {
+	export type Notification = {
+		account: Account;
+		created_at: string;
+		id: string;
+		status?: Status;
+		reaction?: Reaction;
+		type: NotificationType;
+	};
+
+	export type NotificationType = string;
+}
diff --git a/packages/megalodon/src/entities/poll.ts b/packages/megalodon/src/entities/poll.ts
new file mode 100644
index 0000000000..2539d68b20
--- /dev/null
+++ b/packages/megalodon/src/entities/poll.ts
@@ -0,0 +1,14 @@
+/// <reference path="poll_option.ts" />
+
+namespace Entity {
+	export type Poll = {
+		id: string;
+		expires_at: string | null;
+		expired: boolean;
+		multiple: boolean;
+		votes_count: number;
+		options: Array<PollOption>;
+		voted: boolean;
+		own_votes: Array<number>;
+	};
+}
diff --git a/packages/megalodon/src/entities/poll_option.ts b/packages/megalodon/src/entities/poll_option.ts
new file mode 100644
index 0000000000..e818a8607b
--- /dev/null
+++ b/packages/megalodon/src/entities/poll_option.ts
@@ -0,0 +1,6 @@
+namespace Entity {
+	export type PollOption = {
+		title: string;
+		votes_count: number | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/preferences.ts b/packages/megalodon/src/entities/preferences.ts
new file mode 100644
index 0000000000..7994dc568e
--- /dev/null
+++ b/packages/megalodon/src/entities/preferences.ts
@@ -0,0 +1,9 @@
+namespace Entity {
+	export type Preferences = {
+		"posting:default:visibility": "public" | "unlisted" | "private" | "direct";
+		"posting:default:sensitive": boolean;
+		"posting:default:language": string | null;
+		"reading:expand:media": "default" | "show_all" | "hide_all";
+		"reading:expand:spoilers": boolean;
+	};
+}
diff --git a/packages/megalodon/src/entities/push_subscription.ts b/packages/megalodon/src/entities/push_subscription.ts
new file mode 100644
index 0000000000..ad1146a242
--- /dev/null
+++ b/packages/megalodon/src/entities/push_subscription.ts
@@ -0,0 +1,16 @@
+namespace Entity {
+	export type Alerts = {
+		follow: boolean;
+		favourite: boolean;
+		mention: boolean;
+		reblog: boolean;
+		poll: boolean;
+	};
+
+	export type PushSubscription = {
+		id: string;
+		endpoint: string;
+		server_key: string;
+		alerts: Alerts;
+	};
+}
diff --git a/packages/megalodon/src/entities/reaction.ts b/packages/megalodon/src/entities/reaction.ts
new file mode 100644
index 0000000000..4edbec6a7d
--- /dev/null
+++ b/packages/megalodon/src/entities/reaction.ts
@@ -0,0 +1,12 @@
+/// <reference path="account.ts" />
+
+namespace Entity {
+	export type Reaction = {
+		count: number;
+		me: boolean;
+		name: string;
+		url?: string;
+		static_url?: string;
+		accounts?: Array<Account>;
+	};
+}
diff --git a/packages/megalodon/src/entities/relationship.ts b/packages/megalodon/src/entities/relationship.ts
new file mode 100644
index 0000000000..91802d5c88
--- /dev/null
+++ b/packages/megalodon/src/entities/relationship.ts
@@ -0,0 +1,17 @@
+namespace Entity {
+	export type Relationship = {
+		id: string;
+		following: boolean;
+		followed_by: boolean;
+		delivery_following?: boolean;
+		blocking: boolean;
+		blocked_by: boolean;
+		muting: boolean;
+		muting_notifications: boolean;
+		requested: boolean;
+		domain_blocking: boolean;
+		showing_reblogs: boolean;
+		endorsed: boolean;
+		notifying: boolean;
+	};
+}
diff --git a/packages/megalodon/src/entities/report.ts b/packages/megalodon/src/entities/report.ts
new file mode 100644
index 0000000000..6862a5fabe
--- /dev/null
+++ b/packages/megalodon/src/entities/report.ts
@@ -0,0 +1,9 @@
+namespace Entity {
+	export type Report = {
+		id: string;
+		action_taken: string;
+		comment: string;
+		account_id: string;
+		status_ids: Array<string>;
+	};
+}
diff --git a/packages/megalodon/src/entities/results.ts b/packages/megalodon/src/entities/results.ts
new file mode 100644
index 0000000000..4448e53350
--- /dev/null
+++ b/packages/megalodon/src/entities/results.ts
@@ -0,0 +1,11 @@
+/// <reference path="account.ts" />
+/// <reference path="status.ts" />
+/// <reference path="tag.ts" />
+
+namespace Entity {
+	export type Results = {
+		accounts: Array<Account>;
+		statuses: Array<Status>;
+		hashtags: Array<Tag>;
+	};
+}
diff --git a/packages/megalodon/src/entities/scheduled_status.ts b/packages/megalodon/src/entities/scheduled_status.ts
new file mode 100644
index 0000000000..78dfb8ed26
--- /dev/null
+++ b/packages/megalodon/src/entities/scheduled_status.ts
@@ -0,0 +1,10 @@
+/// <reference path="attachment.ts" />
+/// <reference path="status_params.ts" />
+namespace Entity {
+	export type ScheduledStatus = {
+		id: string;
+		scheduled_at: string;
+		params: StatusParams;
+		media_attachments: Array<Attachment>;
+	};
+}
diff --git a/packages/megalodon/src/entities/source.ts b/packages/megalodon/src/entities/source.ts
new file mode 100644
index 0000000000..913b02fda7
--- /dev/null
+++ b/packages/megalodon/src/entities/source.ts
@@ -0,0 +1,10 @@
+/// <reference path="field.ts" />
+namespace Entity {
+	export type Source = {
+		privacy: string | null;
+		sensitive: boolean | null;
+		language: string | null;
+		note: string;
+		fields: Array<Field>;
+	};
+}
diff --git a/packages/megalodon/src/entities/stats.ts b/packages/megalodon/src/entities/stats.ts
new file mode 100644
index 0000000000..6471df039a
--- /dev/null
+++ b/packages/megalodon/src/entities/stats.ts
@@ -0,0 +1,7 @@
+namespace Entity {
+	export type Stats = {
+		user_count: number;
+		status_count: number;
+		domain_count: number;
+	};
+}
diff --git a/packages/megalodon/src/entities/status.ts b/packages/megalodon/src/entities/status.ts
new file mode 100644
index 0000000000..f27f728b54
--- /dev/null
+++ b/packages/megalodon/src/entities/status.ts
@@ -0,0 +1,45 @@
+/// <reference path="account.ts" />
+/// <reference path="application.ts" />
+/// <reference path="mention.ts" />
+/// <reference path="tag.ts" />
+/// <reference path="attachment.ts" />
+/// <reference path="emoji.ts" />
+/// <reference path="card.ts" />
+/// <reference path="poll.ts" />
+/// <reference path="reaction.ts" />
+
+namespace Entity {
+	export type Status = {
+		id: string;
+		uri: string;
+		url: string;
+		account: Account;
+		in_reply_to_id: string | null;
+		in_reply_to_account_id: string | null;
+		reblog: Status | null;
+		content: string;
+		plain_content: string | null;
+		created_at: string;
+		emojis: Emoji[];
+		replies_count: number;
+		reblogs_count: number;
+		favourites_count: number;
+		reblogged: boolean | null;
+		favourited: boolean | null;
+		muted: boolean | null;
+		sensitive: boolean;
+		spoiler_text: string;
+		visibility: "public" | "unlisted" | "private" | "direct";
+		media_attachments: Array<Attachment>;
+		mentions: Array<Mention>;
+		tags: Array<Tag>;
+		card: Card | null;
+		poll: Poll | null;
+		application: Application | null;
+		language: string | null;
+		pinned: boolean | null;
+		reactions: Array<Reaction>;
+		quote: Status | null;
+		bookmarked: boolean;
+	};
+}
diff --git a/packages/megalodon/src/entities/status_edit.ts b/packages/megalodon/src/entities/status_edit.ts
new file mode 100644
index 0000000000..4040b4ff90
--- /dev/null
+++ b/packages/megalodon/src/entities/status_edit.ts
@@ -0,0 +1,23 @@
+/// <reference path="account.ts" />
+/// <reference path="application.ts" />
+/// <reference path="mention.ts" />
+/// <reference path="tag.ts" />
+/// <reference path="attachment.ts" />
+/// <reference path="emoji.ts" />
+/// <reference path="card.ts" />
+/// <reference path="poll.ts" />
+/// <reference path="reaction.ts" />
+
+namespace Entity {
+	export type StatusEdit = {
+		account: Account;
+		content: string;
+		plain_content: string | null;
+		created_at: string;
+		emojis: Emoji[];
+		sensitive: boolean;
+		spoiler_text: string;
+		media_attachments: Array<Attachment>;
+		poll: Poll | null;
+	};
+}
diff --git a/packages/megalodon/src/entities/status_params.ts b/packages/megalodon/src/entities/status_params.ts
new file mode 100644
index 0000000000..18908c01c1
--- /dev/null
+++ b/packages/megalodon/src/entities/status_params.ts
@@ -0,0 +1,12 @@
+namespace Entity {
+	export type StatusParams = {
+		text: string;
+		in_reply_to_id: string | null;
+		media_ids: Array<string> | null;
+		sensitive: boolean | null;
+		spoiler_text: string | null;
+		visibility: "public" | "unlisted" | "private" | "direct";
+		scheduled_at: string | null;
+		application_id: string;
+	};
+}
diff --git a/packages/megalodon/src/entities/tag.ts b/packages/megalodon/src/entities/tag.ts
new file mode 100644
index 0000000000..ccc88aece6
--- /dev/null
+++ b/packages/megalodon/src/entities/tag.ts
@@ -0,0 +1,10 @@
+/// <reference path="history.ts" />
+
+namespace Entity {
+	export type Tag = {
+		name: string;
+		url: string;
+		history: Array<History> | null;
+		following?: boolean;
+	};
+}
diff --git a/packages/megalodon/src/entities/token.ts b/packages/megalodon/src/entities/token.ts
new file mode 100644
index 0000000000..1583edafb1
--- /dev/null
+++ b/packages/megalodon/src/entities/token.ts
@@ -0,0 +1,8 @@
+namespace Entity {
+	export type Token = {
+		access_token: string;
+		token_type: string;
+		scope: string;
+		created_at: number;
+	};
+}
diff --git a/packages/megalodon/src/entities/urls.ts b/packages/megalodon/src/entities/urls.ts
new file mode 100644
index 0000000000..1ee9ed67c9
--- /dev/null
+++ b/packages/megalodon/src/entities/urls.ts
@@ -0,0 +1,5 @@
+namespace Entity {
+	export type URLs = {
+		streaming_api: string;
+	};
+}
diff --git a/packages/megalodon/src/entity.ts b/packages/megalodon/src/entity.ts
new file mode 100644
index 0000000000..b73d2b359b
--- /dev/null
+++ b/packages/megalodon/src/entity.ts
@@ -0,0 +1,38 @@
+/// <reference path="./entities/account.ts" />
+/// <reference path="./entities/activity.ts" />
+/// <reference path="./entities/announcement.ts" />
+/// <reference path="./entities/application.ts" />
+/// <reference path="./entities/async_attachment.ts" />
+/// <reference path="./entities/attachment.ts" />
+/// <reference path="./entities/card.ts" />
+/// <reference path="./entities/context.ts" />
+/// <reference path="./entities/conversation.ts" />
+/// <reference path="./entities/emoji.ts" />
+/// <reference path="./entities/featured_tag.ts" />
+/// <reference path="./entities/field.ts" />
+/// <reference path="./entities/filter.ts" />
+/// <reference path="./entities/history.ts" />
+/// <reference path="./entities/identity_proof.ts" />
+/// <reference path="./entities/instance.ts" />
+/// <reference path="./entities/list.ts" />
+/// <reference path="./entities/marker.ts" />
+/// <reference path="./entities/mention.ts" />
+/// <reference path="./entities/notification.ts" />
+/// <reference path="./entities/poll.ts" />
+/// <reference path="./entities/poll_option.ts" />
+/// <reference path="./entities/preferences.ts" />
+/// <reference path="./entities/push_subscription.ts" />
+/// <reference path="./entities/reaction.ts" />
+/// <reference path="./entities/relationship.ts" />
+/// <reference path="./entities/report.ts" />
+/// <reference path="./entities/results.ts" />
+/// <reference path="./entities/scheduled_status.ts" />
+/// <reference path="./entities/source.ts" />
+/// <reference path="./entities/stats.ts" />
+/// <reference path="./entities/status.ts" />
+/// <reference path="./entities/status_params.ts" />
+/// <reference path="./entities/tag.ts" />
+/// <reference path="./entities/token.ts" />
+/// <reference path="./entities/urls.ts" />
+
+export default Entity;
diff --git a/packages/megalodon/src/filter_context.ts b/packages/megalodon/src/filter_context.ts
new file mode 100644
index 0000000000..4c83cb15f2
--- /dev/null
+++ b/packages/megalodon/src/filter_context.ts
@@ -0,0 +1,11 @@
+import Entity from "./entity";
+
+namespace FilterContext {
+	export const Home: Entity.FilterContext = "home";
+	export const Notifications: Entity.FilterContext = "notifications";
+	export const Public: Entity.FilterContext = "public";
+	export const Thread: Entity.FilterContext = "thread";
+	export const Account: Entity.FilterContext = "account";
+}
+
+export default FilterContext;
diff --git a/packages/megalodon/src/index.ts b/packages/megalodon/src/index.ts
new file mode 100644
index 0000000000..758d3a46ad
--- /dev/null
+++ b/packages/megalodon/src/index.ts
@@ -0,0 +1,32 @@
+import Response from "./response";
+import OAuth from "./oauth";
+import { isCancel, RequestCanceledError } from "./cancel";
+import { ProxyConfig } from "./proxy_config";
+import generator, {
+	detector,
+	MegalodonInterface,
+	WebSocketInterface,
+} from "./megalodon";
+import Misskey from "./misskey";
+import Entity from "./entity";
+import NotificationType from "./notification";
+import FilterContext from "./filter_context";
+import Converter from "./converter";
+
+export {
+	Response,
+	OAuth,
+	RequestCanceledError,
+	isCancel,
+	ProxyConfig,
+	detector,
+	MegalodonInterface,
+	WebSocketInterface,
+	NotificationType,
+	FilterContext,
+	Misskey,
+	Entity,
+	Converter,
+};
+
+export default generator;
diff --git a/packages/megalodon/src/megalodon.ts b/packages/megalodon/src/megalodon.ts
new file mode 100644
index 0000000000..33a5790f67
--- /dev/null
+++ b/packages/megalodon/src/megalodon.ts
@@ -0,0 +1,1532 @@
+import Response from "./response";
+import OAuth from "./oauth";
+import proxyAgent, { ProxyConfig } from "./proxy_config";
+import Entity from "./entity";
+import axios, { AxiosRequestConfig } from "axios";
+import Misskey from "./misskey";
+import { DEFAULT_UA } from "./default";
+
+export interface WebSocketInterface {
+	start(): void;
+	stop(): void;
+	// EventEmitter
+	on(event: string | symbol, listener: (...args: any[]) => void): this;
+	once(event: string | symbol, listener: (...args: any[]) => void): this;
+	removeListener(
+		event: string | symbol,
+		listener: (...args: any[]) => void,
+	): this;
+	removeAllListeners(event?: string | symbol): this;
+}
+
+export interface MegalodonInterface {
+	/**
+	 * Cancel all requests in this instance.
+	 *
+	 * @return void
+	 */
+	cancel(): void;
+
+	/**
+	 * First, call createApp to get client_id and client_secret.
+	 * Next, call generateAuthUrl to get authorization url.
+	 * @param client_name Form Data, which is sent to /api/v1/apps
+	 * @param options Form Data, which is sent to /api/v1/apps. and properties should be **snake_case**
+	 */
+	registerApp(
+		client_name: string,
+		options: Partial<{
+			scopes: Array<string>;
+			redirect_uris: string;
+			website: string;
+		}>,
+	): Promise<OAuth.AppData>;
+
+	/**
+	 * Call /api/v1/apps
+	 *
+	 * Create an application.
+	 * @param client_name your application's name
+	 * @param options Form Data
+	 */
+	createApp(
+		client_name: string,
+		options: Partial<{
+			scopes: Array<string>;
+			redirect_uris: string;
+			website: string;
+		}>,
+	): Promise<OAuth.AppData>;
+
+	// ======================================
+	// apps
+	// ======================================
+	/**
+	 * GET /api/v1/apps/verify_credentials
+	 *
+	 * @return An Application
+	 */
+	verifyAppCredentials(): Promise<Response<Entity.Application>>;
+
+	// ======================================
+	// apps/oauth
+	// ======================================
+
+	/**
+	 * POST /oauth/token
+	 *
+	 * Fetch OAuth access token.
+	 * Get an access token based client_id and client_secret and authorization code.
+	 * @param client_id will be generated by #createApp or #registerApp
+	 * @param client_secret will be generated by #createApp or #registerApp
+	 * @param code will be generated by the link of #generateAuthUrl or #registerApp
+	 * @param redirect_uri must be the same uri as the time when you register your OAuth application
+	 */
+	fetchAccessToken(
+		client_id: string | null,
+		client_secret: string,
+		code: string,
+		redirect_uri?: string,
+	): Promise<OAuth.TokenData>;
+
+	/**
+	 * POST /oauth/token
+	 *
+	 * Refresh OAuth access token.
+	 * Send refresh token and get new access token.
+	 * @param client_id will be generated by #createApp or #registerApp
+	 * @param client_secret will be generated by #createApp or #registerApp
+	 * @param refresh_token will be get #fetchAccessToken
+	 */
+	refreshToken(
+		client_id: string,
+		client_secret: string,
+		refresh_token: string,
+	): Promise<OAuth.TokenData>;
+
+	/**
+	 * POST /oauth/revoke
+	 *
+	 * Revoke an OAuth token.
+	 * @param client_id will be generated by #createApp or #registerApp
+	 * @param client_secret will be generated by #createApp or #registerApp
+	 * @param token will be get #fetchAccessToken
+	 */
+	revokeToken(
+		client_id: string,
+		client_secret: string,
+		token: string,
+	): Promise<Response<{}>>;
+
+	// ======================================
+	// accounts
+	// ======================================
+	/**
+	 * POST /api/v1/accounts
+	 *
+	 * @param username Username for the account.
+	 * @param email Email for the account.
+	 * @param password Password for the account.
+	 * @param agreement Whether the user agrees to the local rules, terms, and policies.
+	 * @param locale The language of the confirmation email that will be sent
+	 * @param reason Text that will be reviewed by moderators if registrations require manual approval.
+	 * @return An account token.
+	 */
+	registerAccount(
+		username: string,
+		email: string,
+		password: string,
+		agreement: boolean,
+		locale: string,
+		reason?: string | null,
+	): Promise<Response<Entity.Token>>;
+	/**
+	 * GET /api/v1/accounts/verify_credentials
+	 *
+	 * @return Account.
+	 */
+	verifyAccountCredentials(): Promise<Response<Entity.Account>>;
+	/**
+	 * PATCH /api/v1/accounts/update_credentials
+	 *
+	 * @return An account.
+	 */
+	updateCredentials(options?: {
+		discoverable?: boolean;
+		bot?: boolean;
+		display_name?: string;
+		note?: string;
+		avatar?: string;
+		header?: string;
+		locked?: boolean;
+		source?: {
+			privacy?: string;
+			sensitive?: boolean;
+			language?: string;
+		};
+		fields_attributes?: Array<{ name: string; value: string }>;
+	}): Promise<Response<Entity.Account>>;
+	/**
+	 * GET /api/v1/accounts/:id
+	 *
+	 * @param id The account ID.
+	 * @return An account.
+	 */
+	getAccount(id: string): Promise<Response<Entity.Account>>;
+	/**
+   * GET /api/v1/accounts/:id/statuses
+   *
+   * @param id The account ID.
+
+   * @param options.limit Max number of results to return. Defaults to 20.
+   * @param options.max_id Return results older than ID.
+   * @param options.since_id Return results newer than ID but starting with most recent.
+   * @param options.min_id Return results newer than ID.
+   * @param options.pinned Return statuses which include pinned statuses.
+   * @param options.exclude_replies Return statuses which exclude replies.
+   * @param options.exclude_reblogs Return statuses which exclude reblogs.
+   * @param options.only_media Show only statuses with media attached? Defaults to false.
+   * @return Account's statuses.
+   */
+	getAccountStatuses(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			min_id?: string;
+			pinned?: boolean;
+			exclude_replies?: boolean;
+			exclude_reblogs?: boolean;
+			only_media?: boolean;
+		},
+	): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * GET /api/v1/pleroma/accounts/:id/favourites
+	 *
+	 * @param id Target account ID.
+	 * @param options.limit Max number of results to return.
+	 * @param options.max_id Return results order than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @return Array of statuses.
+	 */
+	getAccountFavourites(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * POST /api/v1/pleroma/accounts/:id/subscribe
+	 *
+	 * @param id Target account ID.
+	 * @return Relationship.
+	 */
+	subscribeAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/pleroma/accounts/:id/unsubscribe
+	 *
+	 * @param id Target account ID.
+	 * @return Relationship.
+	 */
+	unsubscribeAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * GET /api/v1/accounts/:id/followers
+	 *
+	 * @param id The account ID.
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @return The array of accounts.
+	 */
+	getAccountFollowers(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			get_all?: boolean;
+			sleep_ms?: number;
+		},
+	): Promise<Response<Array<Entity.Account>>>;
+
+	/**
+	 * GET /api/v1/accounts/:id/featured_tags
+	 *
+	 * @param id The account ID.
+	 * @return The array of accounts.
+	 */
+	getAccountFeaturedTags(
+		id: string,
+	): Promise<Response<Array<Entity.FeaturedTag>>>;
+
+	/**
+	 * GET /api/v1/accounts/:id/following
+	 *
+	 * @param id The account ID.
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @return The array of accounts.
+	 */
+	getAccountFollowing(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			get_all?: boolean;
+			sleep_ms?: number;
+		},
+	): Promise<Response<Array<Entity.Account>>>;
+	/**
+	 * GET /api/v1/accounts/:id/lists
+	 *
+	 * @param id The account ID.
+	 * @return The array of lists.
+	 */
+	getAccountLists(id: string): Promise<Response<Array<Entity.List>>>;
+	/**
+	 * GET /api/v1/accounts/:id/identity_proofs
+	 *
+	 * @param id The account ID.
+	 * @return Array of IdentityProof
+	 */
+	getIdentityProof(id: string): Promise<Response<Array<Entity.IdentityProof>>>;
+	/**
+	 * POST /api/v1/accounts/:id/follow
+	 *
+	 * @param id The account ID.
+	 * @param reblog Receive this account's reblogs in home timeline.
+	 * @return Relationship
+	 */
+	followAccount(
+		id: string,
+		options?: {
+			reblog?: boolean;
+		},
+	): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/unfollow
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	unfollowAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/block
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	blockAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/unblock
+	 *
+	 * @param id The account ID.
+	 * @return RElationship
+	 */
+	unblockAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/mute
+	 *
+	 * @param id The account ID.
+	 * @param notifications Mute notifications in addition to statuses.
+	 * @return Relationship
+	 */
+	muteAccount(
+		id: string,
+		notifications: boolean,
+	): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/unmute
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	unmuteAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/pin
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	pinAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/accounts/:id/unpin
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	unpinAccount(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * GET /api/v1/accounts/relationships
+	 *
+	 * @param id The account ID.
+	 * @return Relationship
+	 */
+	getRelationship(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * Get multiple relationships in one method
+	 *
+	 * @param ids Array of account IDs.
+	 * @return Array of Relationship.
+	 */
+	getRelationships(
+		ids: Array<string>,
+	): Promise<Response<Array<Entity.Relationship>>>;
+	/**
+	 * GET /api/v1/accounts/search
+	 *
+	 * @param q Search query.
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @return The array of accounts.
+	 */
+	searchAccount(
+		q: string,
+		options?: {
+			following?: boolean;
+			resolve?: boolean;
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>>;
+	// ======================================
+	// accounts/bookmarks
+	// ======================================
+	/**
+	 * GET /api/v1/bookmarks
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getBookmarks(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>>;
+	// ======================================
+	//  accounts/favourites
+	// ======================================
+	/**
+	 * GET /api/v1/favourites
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getFavourites(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>>;
+	// ======================================
+	// accounts/mutes
+	// ======================================
+	/**
+	 * GET /api/v1/mutes
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of accounts.
+	 */
+	getMutes(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Account>>>;
+	// ======================================
+	// accounts/blocks
+	// ======================================
+	/**
+	 * GET /api/v1/blocks
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of accounts.
+	 */
+	getBlocks(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Account>>>;
+	// ======================================
+	// accounts/domain_blocks
+	// ======================================
+	/**
+	 * GET /api/v1/domain_blocks
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of domain name.
+	 */
+	getDomainBlocks(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<string>>>;
+	/**
+	 * POST/api/v1/domain_blocks
+	 *
+	 * @param domain Domain to block.
+	 */
+	blockDomain(domain: string): Promise<Response<{}>>;
+	/**
+	 * DELETE /api/v1/domain_blocks
+	 *
+	 * @param domain Domain to unblock
+	 */
+	unblockDomain(domain: string): Promise<Response<{}>>;
+	// ======================================
+	// accounts/filters
+	// ======================================
+	/**
+	 * GET /api/v1/filters
+	 *
+	 * @return Array of filters.
+	 */
+	getFilters(): Promise<Response<Array<Entity.Filter>>>;
+	/**
+	 * GET /api/v1/filters/:id
+	 *
+	 * @param id The filter ID.
+	 * @return Filter.
+	 */
+	getFilter(id: string): Promise<Response<Entity.Filter>>;
+	/**
+	 * POST /api/v1/filters
+	 *
+	 * @param phrase Text to be filtered.
+	 * @param context Array of enumerable strings home, notifications, public, thread, account. At least one context must be specified.
+	 * @param options.irreversible Should the server irreversibly drop matching entities from home and notifications?
+	 * @param options.whole_word Consider word boundaries?
+	 * @param options.expires_in ISO 8601 Datetime for when the filter expires.
+	 * @return Filter
+	 */
+	createFilter(
+		phrase: string,
+		context: Array<Entity.FilterContext>,
+		options?: {
+			irreversible?: boolean;
+			whole_word?: boolean;
+			expires_in?: string;
+		},
+	): Promise<Response<Entity.Filter>>;
+	/**
+	 * PUT /api/v1/filters/:id
+	 *
+	 * @param id The filter ID.
+	 * @param phrase Text to be filtered.
+	 * @param context Array of enumerable strings home, notifications, public, thread, account. At least one context must be specified.
+	 * @param options.irreversible Should the server irreversibly drop matching entities from home and notifications?
+	 * @param options.whole_word Consider word boundaries?
+	 * @param options.expires_in ISO 8601 Datetime for when the filter expires.
+	 * @return Filter
+	 */
+	updateFilter(
+		id: string,
+		phrase: string,
+		context: Array<Entity.FilterContext>,
+		options?: {
+			irreversible?: boolean;
+			whole_word?: boolean;
+			expires_in?: string;
+		},
+	): Promise<Response<Entity.Filter>>;
+	/**
+	 * DELETE /api/v1/filters/:id
+	 *
+	 * @param id The filter ID.
+	 * @return Removed filter.
+	 */
+	deleteFilter(id: string): Promise<Response<Entity.Filter>>;
+	// ======================================
+	// accounts/reports
+	// ======================================
+	/**
+	 * POST /api/v1/reports
+	 *
+	 * @param account_id Target account ID.
+	 * @param comment Reason of the report.
+	 * @param options.status_ids Array of Statuses ids to attach to the report.
+	 * @param options.forward If the account is remote, should the report be forwarded to the remote admin?
+	 * @return Report
+	 */
+	report(
+		account_id: string,
+		comment: string,
+		options?: { status_ids?: Array<string>; forward?: boolean },
+	): Promise<Response<Entity.Report>>;
+	// ======================================
+	// accounts/follow_requests
+	// ======================================
+	/**
+	 * GET /api/v1/follow_requests
+	 *
+	 * @param limit Maximum number of results.
+	 * @return Array of account.
+	 */
+	getFollowRequests(limit?: number): Promise<Response<Array<Entity.Account>>>;
+	/**
+	 * POST /api/v1/follow_requests/:id/authorize
+	 *
+	 * @param id Target account ID.
+	 * @return Relationship.
+	 */
+	acceptFollowRequest(id: string): Promise<Response<Entity.Relationship>>;
+	/**
+	 * POST /api/v1/follow_requests/:id/reject
+	 *
+	 * @param id Target account ID.
+	 * @return Relationship.
+	 */
+	rejectFollowRequest(id: string): Promise<Response<Entity.Relationship>>;
+	// ======================================
+	// accounts/endorsements
+	// ======================================
+	/**
+	 * GET /api/v1/endorsements
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 40.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @return Array of accounts.
+	 */
+	getEndorsements(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+	}): Promise<Response<Array<Entity.Account>>>;
+	// ======================================
+	// accounts/featured_tags
+	// ======================================
+	/**
+	 * GET /api/v1/featured_tags
+	 *
+	 * @return Array of featured tag.
+	 */
+	getFeaturedTags(): Promise<Response<Array<Entity.FeaturedTag>>>;
+	/**
+	 * POST /api/v1/featured_tags
+	 *
+	 * @param name Target hashtag name.
+	 * @return FeaturedTag.
+	 */
+	createFeaturedTag(name: string): Promise<Response<Entity.FeaturedTag>>;
+	/**
+	 * DELETE /api/v1/featured_tags/:id
+	 *
+	 * @param id Target featured tag id.
+	 * @return Empty
+	 */
+	deleteFeaturedTag(id: string): Promise<Response<{}>>;
+	/**
+	 * GET /api/v1/featured_tags/suggestions
+	 *
+	 * @return Array of tag.
+	 */
+	getSuggestedTags(): Promise<Response<Array<Entity.Tag>>>;
+	// ======================================
+	// accounts/preferences
+	// ======================================
+	/**
+	 * GET /api/v1/preferences
+	 *
+	 * @return Preferences.
+	 */
+	getPreferences(): Promise<Response<Entity.Preferences>>;
+	// ======================================
+	// accounts/suggestions
+	// ======================================
+	/**
+	 * GET /api/v1/suggestions
+	 *
+	 * @param limit Maximum number of results.
+	 * @return Array of accounts.
+	 */
+	getSuggestions(limit?: number): Promise<Response<Array<Entity.Account>>>;
+	// ======================================
+	// accounts/tags
+	// ======================================
+	getFollowedTags(): Promise<Response<Array<Entity.Tag>>>;
+	/**
+	 * GET /api/v1/tags/:id
+	 *
+	 * @param id Target hashtag id.
+	 * @return Tag
+	 */
+	getTag(id: string): Promise<Response<Entity.Tag>>;
+	/**
+	 * POST /api/v1/tags/:id/follow
+	 *
+	 * @param id Target hashtag id.
+	 * @return Tag
+	 */
+	followTag(id: string): Promise<Response<Entity.Tag>>;
+	/**
+	 * POST /api/v1/tags/:id/unfollow
+	 *
+	 * @param id Target hashtag id.
+	 * @return Tag
+	 */
+	unfollowTag(id: string): Promise<Response<Entity.Tag>>;
+	// ======================================
+	// statuses
+	// ======================================
+	/**
+	 * POST /api/v1/statuses
+	 *
+	 * @param status Text content of status.
+	 * @param options.media_ids Array of Attachment ids.
+	 * @param options.poll Poll object.
+	 * @param options.in_reply_to_id ID of the status being replied to, if status is a reply.
+	 * @param options.sensitive Mark status and attached media as sensitive?
+	 * @param options.spoiler_text Text to be shown as a warning or subject before the actual content.
+	 * @param options.visibility Visibility of the posted status.
+	 * @param options.scheduled_at ISO 8601 Datetime at which to schedule a status.
+	 * @param options.language ISO 639 language code for this status.
+	 * @param options.quote_id ID of the status being quoted to, if status is a quote.
+	 * @return Status
+	 */
+	postStatus(
+		status: string,
+		options?: {
+			media_ids?: Array<string>;
+			poll?: {
+				options: Array<string>;
+				expires_in: number;
+				multiple?: boolean;
+				hide_totals?: boolean;
+			};
+			in_reply_to_id?: string;
+			sensitive?: boolean;
+			spoiler_text?: string;
+			visibility?: "public" | "unlisted" | "private" | "direct";
+			scheduled_at?: string;
+			language?: string;
+			quote_id?: string;
+		},
+	): Promise<Response<Entity.Status>>;
+	/**
+	 * GET /api/v1/statuses/:id
+	 *
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	getStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+     PUT /api/v1/statuses/:id
+     *
+     * @param id The target status id.
+     * @return Status
+   */
+	editStatus(
+		id: string,
+		options: {
+			status?: string;
+			spoiler_text?: string;
+			sensitive?: boolean;
+			media_ids?: Array<string>;
+			poll?: {
+				options?: Array<string>;
+				expires_in?: number;
+				multiple?: boolean;
+				hide_totals?: boolean;
+			};
+		},
+	): Promise<Response<Entity.Status>>;
+	/**
+	 * DELETE /api/v1/statuses/:id
+	 *
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	deleteStatus(id: string): Promise<Response<{}>>;
+	/**
+	 * GET /api/v1/statuses/:id/context
+	 *
+	 * Get parent and child statuses.
+	 * @param id The target status id.
+	 * @return Context
+	 */
+	getStatusContext(
+		id: string,
+		options?: { limit?: number; max_id?: string; since_id?: string },
+	): Promise<Response<Entity.Context>>;
+	/**
+	 * GET /api/v1/statuses/:id/history
+	 *
+	 * Get status edit history.
+	 * @param id The target status id.
+	 * @return StatusEdit
+	 */
+	getStatusHistory(id: string): Promise<Response<Array<Entity.StatusEdit>>>;
+	/**
+	 * GET /api/v1/statuses/:id/reblogged_by
+	 *
+	 * @param id The target status id.
+	 * @return Array of accounts.
+	 */
+	getStatusRebloggedBy(id: string): Promise<Response<Array<Entity.Account>>>;
+	/**
+	 * GET /api/v1/statuses/:id/favourited_by
+	 *
+	 * @param id The target status id.
+	 * @return Array of accounts.
+	 */
+	getStatusFavouritedBy(id: string): Promise<Response<Array<Entity.Account>>>;
+	/**
+	 * POST /api/v1/statuses/:id/favourite
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	favouriteStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unfavourite
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	unfavouriteStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/reblog
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	reblogStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unreblog
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	unreblogStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/bookmark
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	bookmarkStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unbookmark
+	 *
+	 * @param id The target status id.
+	 * @return Status.
+	 */
+	unbookmarkStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/mute
+	 *
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	muteStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unmute
+	 *
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	unmuteStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/pin
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	pinStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unpin
+	 *
+	 * @param id The target status id.
+	 * @return Status
+	 */
+	unpinStatus(id: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/react/:name
+	 * @param id The target status id.
+	 * @param name The name of the emoji reaction to add.
+	 * @return Status
+	 */
+	reactStatus(id: string, name: string): Promise<Response<Entity.Status>>;
+	/**
+	 * POST /api/v1/statuses/:id/unreact/:name
+	 *
+	 * @param id The target status id.
+	 * @param name The name of the emoji reaction to remove.
+	 * @return Status
+	 */
+	unreactStatus(id: string, name: string): Promise<Response<Entity.Status>>;
+	// ======================================
+	// statuses/media
+	// ======================================
+	/**
+	 * POST /api/v2/media
+	 *
+	 * @param file The file to be attached, using multipart form data.
+	 * @param options.description A plain-text description of the media.
+	 * @param options.focus Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0.
+	 * @return Attachment
+	 */
+	uploadMedia(
+		file: any,
+		options?: { description?: string; focus?: string },
+	): Promise<Response<Entity.Attachment | Entity.AsyncAttachment>>;
+	/**
+	 * GET /api/v1/media/:id
+	 *
+	 * @param id Target media ID.
+	 * @return Attachment
+	 */
+	getMedia(id: string): Promise<Response<Entity.Attachment>>;
+	/**
+	 * PUT /api/v1/media/:id
+	 *
+	 * @param id Target media ID.
+	 * @param options.file The file to be attached, using multipart form data.
+	 * @param options.description A plain-text description of the media.
+	 * @param options.focus Two floating points (x,y), comma-delimited, ranging from -1.0 to 1.0.
+	 * @param options.is_sensitive Whether the media is sensitive.
+	 * @return Attachment
+	 */
+	updateMedia(
+		id: string,
+		options?: {
+			file?: any;
+			description?: string;
+			focus?: string;
+			is_sensitive?: boolean;
+		},
+	): Promise<Response<Entity.Attachment>>;
+	// ======================================
+	// statuses/polls
+	// ======================================
+	/**
+	 * GET /api/v1/polls/:id
+	 *
+	 * @param id Target poll ID.
+	 * @return Poll
+	 */
+	getPoll(id: string): Promise<Response<Entity.Poll>>;
+	/**
+	 * POST /api/v1/polls/:id/votes
+	 *
+	 * @param id Target poll ID.
+	 * @param choices Array of own votes containing index for each option (starting from 0).
+	 * @return Poll
+	 */
+	votePoll(id: string, choices: Array<number>): Promise<Response<Entity.Poll>>;
+	// ======================================
+	// statuses/scheduled_statuses
+	// ======================================
+	/**
+	 * GET /api/v1/scheduled_statuses
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of scheduled statuses.
+	 */
+	getScheduledStatuses(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.ScheduledStatus>>>;
+	/**
+	 * GET /api/v1/scheduled_statuses/:id
+	 *
+	 * @param id Target status ID.
+	 * @return ScheduledStatus.
+	 */
+	getScheduledStatus(id: string): Promise<Response<Entity.ScheduledStatus>>;
+	/**
+	 * PUT /api/v1/scheduled_statuses/:id
+	 *
+	 * @param id Target scheduled status ID.
+	 * @param scheduled_at ISO 8601 Datetime at which the status will be published.
+	 * @return ScheduledStatus.
+	 */
+	scheduleStatus(
+		id: string,
+		scheduled_at?: string | null,
+	): Promise<Response<Entity.ScheduledStatus>>;
+	/**
+	 * DELETE /api/v1/scheduled_statuses/:id
+	 *
+	 * @param id Target scheduled status ID.
+	 */
+	cancelScheduledStatus(id: string): Promise<Response<{}>>;
+	// ======================================
+	// timelines
+	// ======================================
+	/**
+	 * GET /api/v1/timelines/public
+	 *
+	 * @param options.only_media Show only statuses with media attached? Defaults to false.
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getPublicTimeline(options?: {
+		only_media?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * GET /api/v1/timelines/public
+	 *
+	 * @param options.only_media Show only statuses with media attached? Defaults to false.
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getLocalTimeline(options?: {
+		only_media?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * GET /api/v1/timelines/tag/:hashtag
+	 *
+	 * @param hashtag Content of a #hashtag, not including # symbol.
+	 * @param options.local Show only local statuses? Defaults to false.
+	 * @param options.only_media Show only statuses with media attached? Defaults to false.
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getTagTimeline(
+		hashtag: string,
+		options?: {
+			local?: boolean;
+			only_media?: boolean;
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			min_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * GET /api/v1/timelines/home
+	 *
+	 * @param options.local Show only local statuses? Defaults to false.
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getHomeTimeline(options?: {
+		local?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>>;
+	/**
+	 * GET /api/v1/timelines/list/:list_id
+	 *
+	 * @param list_id Local ID of the list in the database.
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getListTimeline(
+		list_id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			min_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>>;
+	// ======================================
+	// timelines/conversations
+	// ======================================
+	/**
+	 * GET /api/v1/conversations
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of statuses.
+	 */
+	getConversationTimeline(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Conversation>>>;
+	/**
+	 * DELETE /api/v1/conversations/:id
+	 *
+	 * @param id Target conversation ID.
+	 */
+	deleteConversation(id: string): Promise<Response<{}>>;
+	/**
+	 * POST /api/v1/conversations/:id/read
+	 *
+	 * @param id Target conversation ID.
+	 * @return Conversation.
+	 */
+	readConversation(id: string): Promise<Response<Entity.Conversation>>;
+	// ======================================
+	// timelines/lists
+	// ======================================
+	/**
+	 * GET /api/v1/lists
+	 *
+	 * @return Array of lists.
+	 */
+	getLists(): Promise<Response<Array<Entity.List>>>;
+	/**
+	 * GET /api/v1/lists/:id
+	 *
+	 * @param id Target list ID.
+	 * @return List.
+	 */
+	getList(id: string): Promise<Response<Entity.List>>;
+	/**
+	 * POST /api/v1/lists
+	 *
+	 * @param title List name.
+	 * @return List.
+	 */
+	createList(title: string): Promise<Response<Entity.List>>;
+	/**
+	 * PUT /api/v1/lists/:id
+	 *
+	 * @param id Target list ID.
+	 * @param title New list name.
+	 * @return List.
+	 */
+	updateList(id: string, title: string): Promise<Response<Entity.List>>;
+	/**
+	 * DELETE /api/v1/lists/:id
+	 *
+	 * @param id Target list ID.
+	 */
+	deleteList(id: string): Promise<Response<{}>>;
+	/**
+	 * GET /api/v1/lists/:id/accounts
+	 *
+	 * @param id Target list ID.
+	 * @param options.limit Max number of results to return.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @return Array of accounts.
+	 */
+	getAccountsInList(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>>;
+	/**
+	 * POST /api/v1/lists/:id/accounts
+	 *
+	 * @param id Target list ID.
+	 * @param account_ids Array of account IDs to add to the list.
+	 */
+	addAccountsToList(
+		id: string,
+		account_ids: Array<string>,
+	): Promise<Response<{}>>;
+	/**
+	 * DELETE /api/v1/lists/:id/accounts
+	 *
+	 * @param id Target list ID.
+	 * @param account_ids Array of account IDs to add to the list.
+	 */
+	deleteAccountsFromList(
+		id: string,
+		account_ids: Array<string>,
+	): Promise<Response<{}>>;
+	// ======================================
+	// timelines/markers
+	// ======================================
+	/**
+	 * GET /api/v1/markers
+	 *
+	 * @param timelines Array of timeline names, String enum anyOf home, notifications.
+	 * @return Marker or empty object.
+	 */
+	getMarkers(timeline: Array<string>): Promise<Response<Entity.Marker | {}>>;
+	/**
+	 * POST /api/v1/markers
+	 *
+	 * @param options.home Marker position of the last read status ID in home timeline.
+	 * @param options.notifications Marker position of the last read notification ID in notifications.
+	 * @return Marker.
+	 */
+	saveMarkers(options?: {
+		home?: { last_read_id: string };
+		notifications?: { last_read_id: string };
+	}): Promise<Response<Entity.Marker>>;
+	// ======================================
+	// notifications
+	// ======================================
+	/**
+	 * GET /api/v1/notifications
+	 *
+	 * @param options.limit Max number of results to return. Defaults to 20.
+	 * @param options.max_id Return results older than ID.
+	 * @param options.since_id Return results newer than ID.
+	 * @param options.min_id Return results immediately newer than ID.
+	 * @param options.exclude_types Array of types to exclude.
+	 * @param options.account_id Return only notifications received from this account.
+	 * @return Array of notifications.
+	 */
+	getNotifications(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+		exclude_types?: Array<Entity.NotificationType>;
+		account_id?: string;
+	}): Promise<Response<Array<Entity.Notification>>>;
+	/**
+	 * GET /api/v1/notifications/:id
+	 *
+	 * @param id Target notification ID.
+	 * @return Notification.
+	 */
+	getNotification(id: string): Promise<Response<Entity.Notification>>;
+	/**
+	 * POST /api/v1/notifications/clear
+	 */
+	dismissNotifications(): Promise<Response<{}>>;
+	/**
+	 * POST /api/v1/notifications/:id/dismiss
+	 *
+	 * @param id Target notification ID.
+	 */
+	dismissNotification(id: string): Promise<Response<{}>>;
+	/**
+	 * POST /api/v1/pleroma/notifcations/read
+	 *
+	 * @param id A single notification ID to read
+	 * @param max_id Read all notifications up to this ID
+	 * @return Array of notifications
+	 */
+	readNotifications(options: { id?: string; max_id?: string }): Promise<
+		Response<Entity.Notification | Array<Entity.Notification>>
+	>;
+	// ======================================
+	// notifications/push
+	// ======================================
+	/**
+	 * POST /api/v1/push/subscription
+	 *
+	 * @param subscription[endpoint] Endpoint URL that is called when a notification event occurs.
+	 * @param subscription[keys][p256dh] User agent public key. Base64 encoded string of public key of ECDH key using prime256v1 curve.
+	 * @param subscription[keys] Auth secret. Base64 encoded string of 16 bytes of random data.
+	 * @param data[alerts][follow] Receive follow notifications?
+	 * @param data[alerts][favourite] Receive favourite notifications?
+	 * @param data[alerts][reblog] Receive reblog notifictaions?
+	 * @param data[alerts][mention] Receive mention notifications?
+	 * @param data[alerts][poll] Receive poll notifications?
+	 * @return PushSubscription.
+	 */
+	subscribePushNotification(
+		subscription: { endpoint: string; keys: { p256dh: string; auth: string } },
+		data?: {
+			alerts: {
+				follow?: boolean;
+				favourite?: boolean;
+				reblog?: boolean;
+				mention?: boolean;
+				poll?: boolean;
+			};
+		} | null,
+	): Promise<Response<Entity.PushSubscription>>;
+	/**
+	 * GET /api/v1/push/subscription
+	 *
+	 * @return PushSubscription.
+	 */
+	getPushSubscription(): Promise<Response<Entity.PushSubscription>>;
+	/**
+	 * PUT /api/v1/push/subscription
+	 *
+	 * @param data[alerts][follow] Receive follow notifications?
+	 * @param data[alerts][favourite] Receive favourite notifications?
+	 * @param data[alerts][reblog] Receive reblog notifictaions?
+	 * @param data[alerts][mention] Receive mention notifications?
+	 * @param data[alerts][poll] Receive poll notifications?
+	 * @return PushSubscription.
+	 */
+	updatePushSubscription(
+		data?: {
+			alerts: {
+				follow?: boolean;
+				favourite?: boolean;
+				reblog?: boolean;
+				mention?: boolean;
+				poll?: boolean;
+			};
+		} | null,
+	): Promise<Response<Entity.PushSubscription>>;
+	/**
+	 * DELETE /api/v1/push/subscription
+	 */
+	deletePushSubscription(): Promise<Response<{}>>;
+	// ======================================
+	// search
+	// ======================================
+	/**
+	 * GET /api/v2/search
+	 *
+	 * @param q The search query.
+	 * @param type Enum of search target.
+	 * @param options.limit Maximum number of results to load, per type. Defaults to 20. Max 40.
+	 * @param options.max_id Return results older than this id.
+	 * @param options.min_id Return results immediately newer than this id.
+	 * @param options.resolve Attempt WebFinger lookup. Defaults to false.
+	 * @param options.following Only include accounts that the user is following. Defaults to false.
+	 * @param options.account_id If provided, statuses returned will be authored only by this account.
+	 * @param options.exclude_unreviewed Filter out unreviewed tags? Defaults to false.
+	 * @return Results.
+	 */
+	search(
+		q: string,
+		type: "accounts" | "hashtags" | "statuses",
+		options?: {
+			limit?: number;
+			max_id?: string;
+			min_id?: string;
+			resolve?: boolean;
+			offset?: number;
+			following?: boolean;
+			account_id?: string;
+			exclude_unreviewed?: boolean;
+		},
+	): Promise<Response<Entity.Results>>;
+
+	// ======================================
+	// instance
+	// ======================================
+	/**
+	 * GET /api/v1/instance
+	 */
+	getInstance(): Promise<Response<Entity.Instance>>;
+
+	/**
+	 * GET /api/v1/instance/peers
+	 */
+	getInstancePeers(): Promise<Response<Array<string>>>;
+
+	/**
+	 * GET /api/v1/instance/activity
+	 */
+	getInstanceActivity(): Promise<Response<Array<Entity.Activity>>>;
+
+	// ======================================
+	// instance/trends
+	// ======================================
+	/**
+	 * GET /api/v1/trends
+	 *
+	 * @param limit Maximum number of results to return. Defaults to 10.
+	 */
+	getInstanceTrends(
+		limit?: number | null,
+	): Promise<Response<Array<Entity.Tag>>>;
+
+	// ======================================
+	// instance/directory
+	// ======================================
+	/**
+	 * GET /api/v1/directory
+	 *
+	 * @param options.limit How many accounts to load. Default 40.
+	 * @param options.offset How many accounts to skip before returning results. Default 0.
+	 * @param options.order Order of results.
+	 * @param options.local Only return local accounts.
+	 * @return Array of accounts.
+	 */
+	getInstanceDirectory(options?: {
+		limit?: number;
+		offset?: number;
+		order?: "active" | "new";
+		local?: boolean;
+	}): Promise<Response<Array<Entity.Account>>>;
+
+	// ======================================
+	// instance/custom_emojis
+	// ======================================
+	/**
+	 * GET /api/v1/custom_emojis
+	 *
+	 * @return Array of emojis.
+	 */
+	getInstanceCustomEmojis(): Promise<Response<Array<Entity.Emoji>>>;
+
+	// ======================================
+	// instance/announcements
+	// ======================================
+	/**
+	 * GET /api/v1/announcements
+	 *
+	 * @param with_dismissed Include announcements dismissed by the user. Defaults to false.
+	 * @return Array of announcements.
+	 */
+	getInstanceAnnouncements(
+		with_dismissed?: boolean | null,
+	): Promise<Response<Array<Entity.Announcement>>>;
+
+	/**
+	 * POST /api/v1/announcements/:id/dismiss
+	 */
+	dismissInstanceAnnouncement(id: string): Promise<Response<{}>>;
+
+	// ======================================
+	// Emoji reactions
+	// ======================================
+	createEmojiReaction(
+		id: string,
+		emoji: string,
+	): Promise<Response<Entity.Status>>;
+	deleteEmojiReaction(
+		id: string,
+		emoji: string,
+	): Promise<Response<Entity.Status>>;
+	getEmojiReactions(id: string): Promise<Response<Array<Entity.Reaction>>>;
+	getEmojiReaction(
+		id: string,
+		emoji: string,
+	): Promise<Response<Entity.Reaction>>;
+
+	// ======================================
+	// WebSocket
+	// ======================================
+	userSocket(): WebSocketInterface;
+	publicSocket(): WebSocketInterface;
+	localSocket(): WebSocketInterface;
+	tagSocket(tag: string): WebSocketInterface;
+	listSocket(list_id: string): WebSocketInterface;
+	directSocket(): WebSocketInterface;
+}
+
+export class NoImplementedError extends Error {
+	constructor(err?: string) {
+		super(err);
+
+		this.name = new.target.name;
+		Object.setPrototypeOf(this, new.target.prototype);
+	}
+}
+
+export class ArgumentError extends Error {
+	constructor(err?: string) {
+		super(err);
+
+		this.name = new.target.name;
+		Object.setPrototypeOf(this, new.target.prototype);
+	}
+}
+
+export class UnexpectedError extends Error {
+	constructor(err?: string) {
+		super(err);
+
+		this.name = new.target.name;
+		Object.setPrototypeOf(this, new.target.prototype);
+	}
+}
+
+type Instance = {
+	title: string;
+	uri: string;
+	urls: {
+		streaming_api: string;
+	};
+	version: string;
+};
+
+/**
+ * Detect SNS type.
+ * Now support Mastodon, Pleroma and Pixelfed.
+ *
+ * @param url Base URL of SNS.
+ * @param proxyConfig Proxy setting, or set false if don't use proxy.
+ * @return SNS name.
+ */
+export const detector = async (
+	url: string,
+	proxyConfig: ProxyConfig | false = false,
+): Promise<"mastodon" | "pleroma" | "misskey"> => {
+	let options: AxiosRequestConfig = {
+		headers: {
+			"User-Agent": DEFAULT_UA,
+		},
+	};
+	if (proxyConfig) {
+		options = Object.assign(options, {
+			httpsAgent: proxyAgent(proxyConfig),
+		});
+	}
+	try {
+		const res = await axios.get<Instance>(url + "/api/v1/instance", options);
+		if (res.data.version.includes("Pleroma")) {
+			return "pleroma";
+		} else {
+			return "mastodon";
+		}
+	} catch (err) {
+		await axios.post<{}>(url + "/api/meta", {}, options);
+		return "misskey";
+	}
+};
+
+/**
+ * Get client for each SNS according to megalodon interface.
+ *
+ * @param baseUrl hostname or base URL.
+ * @param accessToken access token from OAuth2 authorization
+ * @param userAgent UserAgent is specified in header on request.
+ * @param proxyConfig Proxy setting, or set false if don't use proxy.
+ * @return Client instance for each SNS you specified.
+ */
+const generator = (
+	baseUrl: string,
+	accessToken: string | null = null,
+	userAgent: string | null = null,
+	proxyConfig: ProxyConfig | false = false,
+): MegalodonInterface =>
+	new Misskey(baseUrl, accessToken, userAgent, proxyConfig);
+
+export default generator;
diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts
new file mode 100644
index 0000000000..25922a2ffc
--- /dev/null
+++ b/packages/megalodon/src/misskey.ts
@@ -0,0 +1,3436 @@
+import FormData from "form-data";
+import AsyncLock from "async-lock";
+
+import MisskeyAPI from "./misskey/api_client";
+import { DEFAULT_UA } from "./default";
+import { ProxyConfig } from "./proxy_config";
+import OAuth from "./oauth";
+import Response from "./response";
+import Entity from "./entity";
+import {
+	MegalodonInterface,
+	WebSocketInterface,
+	NoImplementedError,
+	ArgumentError,
+	UnexpectedError,
+} from "./megalodon";
+import MegalodonEntity from "@/entity";
+import fs from "node:fs";
+import MisskeyNotificationType from "./misskey/notification";
+
+type AccountCache = {
+	locks: AsyncLock;
+	accounts: Entity.Account[];
+};
+
+export default class Misskey implements MegalodonInterface {
+	public client: MisskeyAPI.Interface;
+	public converter: MisskeyAPI.Converter;
+	public baseUrl: string;
+	public proxyConfig: ProxyConfig | false;
+
+	/**
+	 * @param baseUrl hostname or base URL
+	 * @param accessToken access token from OAuth2 authorization
+	 * @param userAgent UserAgent is specified in header on request.
+	 * @param proxyConfig Proxy setting, or set false if don't use proxy.
+	 */
+	constructor(
+		baseUrl: string,
+		accessToken: string | null = null,
+		userAgent: string | null = DEFAULT_UA,
+		proxyConfig: ProxyConfig | false = false,
+	) {
+		let token = "";
+		if (accessToken) {
+			token = accessToken;
+		}
+		let agent: string = DEFAULT_UA;
+		if (userAgent) {
+			agent = userAgent;
+		}
+		this.converter = new MisskeyAPI.Converter(baseUrl);
+		this.client = new MisskeyAPI.Client(
+			baseUrl,
+			token,
+			agent,
+			proxyConfig,
+			this.converter,
+		);
+		this.baseUrl = baseUrl;
+		this.proxyConfig = proxyConfig;
+	}
+
+	private baseUrlToHost(baseUrl: string): string {
+		return baseUrl.replace("https://", "");
+	}
+
+	public cancel(): void {
+		return this.client.cancel();
+	}
+
+	public async registerApp(
+		client_name: string,
+		options: Partial<{
+			scopes: Array<string>;
+			redirect_uris: string;
+			website: string;
+		}> = {
+			scopes: MisskeyAPI.DEFAULT_SCOPE,
+			redirect_uris: this.baseUrl,
+		},
+	): Promise<OAuth.AppData> {
+		return this.createApp(client_name, options).then(async (appData) => {
+			return this.generateAuthUrlAndToken(appData.client_secret).then(
+				(session) => {
+					appData.url = session.url;
+					appData.session_token = session.token;
+					return appData;
+				},
+			);
+		});
+	}
+
+	/**
+	 * POST /api/app/create
+	 *
+	 * Create an application.
+	 * @param client_name Your application's name.
+	 * @param options Form data.
+	 */
+	public async createApp(
+		client_name: string,
+		options: Partial<{
+			scopes: Array<string>;
+			redirect_uris: string;
+			website: string;
+		}> = {
+			scopes: MisskeyAPI.DEFAULT_SCOPE,
+			redirect_uris: this.baseUrl,
+		},
+	): Promise<OAuth.AppData> {
+		const redirect_uris = options.redirect_uris || this.baseUrl;
+		const scopes = options.scopes || MisskeyAPI.DEFAULT_SCOPE;
+
+		const params: {
+			name: string;
+			description: string;
+			permission: Array<string>;
+			callbackUrl: string;
+		} = {
+			name: client_name,
+			description: "",
+			permission: scopes,
+			callbackUrl: redirect_uris,
+		};
+
+		/**
+     * The response is:
+     {
+       "id": "xxxxxxxxxx",
+       "name": "string",
+       "callbackUrl": "string",
+       "permission": [
+         "string"
+       ],
+       "secret": "string"
+     }
+    */
+		return this.client
+			.post<MisskeyAPI.Entity.App>("/api/app/create", params)
+			.then((res: Response<MisskeyAPI.Entity.App>) => {
+				const appData: OAuth.AppDataFromServer = {
+					id: res.data.id,
+					name: res.data.name,
+					website: null,
+					redirect_uri: res.data.callbackUrl,
+					client_id: "",
+					client_secret: res.data.secret,
+				};
+				return OAuth.AppData.from(appData);
+			});
+	}
+
+	/**
+	 * POST /api/auth/session/generate
+	 */
+	public async generateAuthUrlAndToken(
+		clientSecret: string,
+	): Promise<MisskeyAPI.Entity.Session> {
+		return this.client
+			.post<MisskeyAPI.Entity.Session>("/api/auth/session/generate", {
+				appSecret: clientSecret,
+			})
+			.then((res: Response<MisskeyAPI.Entity.Session>) => res.data);
+	}
+
+	// ======================================
+	// apps
+	// ======================================
+	public async verifyAppCredentials(): Promise<Response<Entity.Application>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// apps/oauth
+	// ======================================
+	/**
+	 * POST /api/auth/session/userkey
+	 *
+	 * @param _client_id This parameter is not used in this method.
+	 * @param client_secret Application secret key which will be provided in createApp.
+	 * @param session_token Session token string which will be provided in generateAuthUrlAndToken.
+	 * @param _redirect_uri This parameter is not used in this method.
+	 */
+	public async fetchAccessToken(
+		_client_id: string | null,
+		client_secret: string,
+		session_token: string,
+		_redirect_uri?: string,
+	): Promise<OAuth.TokenData> {
+		return this.client
+			.post<MisskeyAPI.Entity.UserKey>("/api/auth/session/userkey", {
+				appSecret: client_secret,
+				token: session_token,
+			})
+			.then((res) => {
+				const token = new OAuth.TokenData(
+					res.data.accessToken,
+					"misskey",
+					"",
+					0,
+					null,
+					null,
+				);
+				return token;
+			});
+	}
+
+	public async refreshToken(
+		_client_id: string,
+		_client_secret: string,
+		_refresh_token: string,
+	): Promise<OAuth.TokenData> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async revokeToken(
+		_client_id: string,
+		_client_secret: string,
+		_token: string,
+	): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// accounts
+	// ======================================
+	public async registerAccount(
+		_username: string,
+		_email: string,
+		_password: string,
+		_agreement: boolean,
+		_locale: string,
+		_reason?: string | null,
+	): Promise<Response<Entity.Token>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/i
+	 */
+	public async verifyAccountCredentials(): Promise<Response<Entity.Account>> {
+		return this.client
+			.post<MisskeyAPI.Entity.UserDetail>("/api/i")
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.userDetail(
+						res.data,
+						this.baseUrlToHost(this.baseUrl),
+					),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/i/update
+	 */
+	public async updateCredentials(options?: {
+		discoverable?: boolean;
+		bot?: boolean;
+		display_name?: string;
+		note?: string;
+		avatar?: string;
+		header?: string;
+		locked?: boolean;
+		source?: {
+			privacy?: string;
+			sensitive?: boolean;
+			language?: string;
+		} | null;
+		fields_attributes?: Array<{ name: string; value: string }>;
+	}): Promise<Response<Entity.Account>> {
+		let params = {};
+		if (options) {
+			if (options.bot !== undefined) {
+				params = Object.assign(params, {
+					isBot: options.bot,
+				});
+			}
+			if (options.display_name) {
+				params = Object.assign(params, {
+					name: options.display_name,
+				});
+			}
+			if (options.note) {
+				params = Object.assign(params, {
+					description: options.note,
+				});
+			}
+			if (options.locked !== undefined) {
+				params = Object.assign(params, {
+					isLocked: options.locked,
+				});
+			}
+			if (options.source) {
+				if (options.source.language) {
+					params = Object.assign(params, {
+						lang: options.source.language,
+					});
+				}
+				if (options.source.sensitive) {
+					params = Object.assign(params, {
+						alwaysMarkNsfw: options.source.sensitive,
+					});
+				}
+			}
+		}
+		return this.client
+			.post<MisskeyAPI.Entity.UserDetail>("/api/i", params)
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.userDetail(
+						res.data,
+						this.baseUrlToHost(this.baseUrl),
+					),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/users/show
+	 */
+	public async getAccount(id: string): Promise<Response<Entity.Account>> {
+		return this.client
+			.post<MisskeyAPI.Entity.UserDetail>("/api/users/show", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.userDetail(
+						res.data,
+						this.baseUrlToHost(this.baseUrl),
+					),
+				});
+			});
+	}
+
+	public async getAccountByName(
+		user: string,
+		host: string | null,
+	): Promise<Response<Entity.Account>> {
+		return this.client
+			.post<MisskeyAPI.Entity.UserDetail>("/api/users/show", {
+				username: user,
+				host: host ?? null,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.userDetail(
+						res.data,
+						this.baseUrlToHost(this.baseUrl),
+					),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/users/notes
+	 */
+	public async getAccountStatuses(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			pinned?: boolean;
+			exclude_replies: boolean;
+			exclude_reblogs: boolean;
+			only_media?: boolean;
+		},
+	): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		if (options?.pinned) {
+			return this.client
+				.post<MisskeyAPI.Entity.UserDetail>("/api/users/show", {
+					userId: id,
+				})
+				.then(async (res) => {
+					if (res.data.pinnedNotes) {
+						return {
+							...res,
+							data: await Promise.all(
+								res.data.pinnedNotes.map((n) =>
+									this.noteWithDetails(
+										n,
+										this.baseUrlToHost(this.baseUrl),
+										accountCache,
+									),
+								),
+							),
+						};
+					}
+					return { ...res, data: [] };
+				});
+		}
+
+		let params = {
+			userId: id,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.exclude_replies) {
+				params = Object.assign(params, {
+					includeReplies: false,
+				});
+			}
+			if (options.exclude_reblogs) {
+				params = Object.assign(params, {
+					includeMyRenotes: false,
+				});
+			}
+			if (options.only_media) {
+				params = Object.assign(params, {
+					withFiles: options.only_media,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/users/notes", params)
+			.then(async (res) => {
+				const statuses: Array<Entity.Status> = await Promise.all(
+					res.data.map((note) =>
+						this.noteWithDetails(
+							note,
+							this.baseUrlToHost(this.baseUrl),
+							accountCache,
+						),
+					),
+				);
+				return Object.assign(res, {
+					data: statuses,
+				});
+			});
+	}
+
+	public async getAccountFavourites(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {
+			userId: id,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit <= 100 ? options.limit : 100,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Favorite>>("/api/users/reactions", params)
+			.then(async (res) => {
+				return Object.assign(res, {
+					data: await Promise.all(
+						res.data.map((fav) =>
+							this.noteWithDetails(
+								fav.note,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					),
+				});
+			});
+	}
+
+	public async subscribeAccount(
+		_id: string,
+	): Promise<Response<Entity.Relationship>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async unsubscribeAccount(
+		_id: string,
+	): Promise<Response<Entity.Relationship>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/users/followers
+	 */
+	public async getAccountFollowers(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>> {
+		let params = {
+			userId: id,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit <= 100 ? options.limit : 100,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 40,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 40,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Follower>>("/api/users/followers", params)
+			.then(async (res) => {
+				return Object.assign(res, {
+					data: await Promise.all(
+						res.data.map(async (f) =>
+							this.getAccount(f.followerId).then((p) => p.data),
+						),
+					),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/users/following
+	 */
+	public async getAccountFollowing(
+		id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>> {
+		let params = {
+			userId: id,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit <= 100 ? options.limit : 100,
+				});
+			}
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Following>>("/api/users/following", params)
+			.then(async (res) => {
+				return Object.assign(res, {
+					data: await Promise.all(
+						res.data.map(async (f) =>
+							this.getAccount(f.followeeId).then((p) => p.data),
+						),
+					),
+				});
+			});
+	}
+
+	public async getAccountLists(
+		_id: string,
+	): Promise<Response<Array<Entity.List>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getIdentityProof(
+		_id: string,
+	): Promise<Response<Array<Entity.IdentityProof>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/following/create
+	 */
+	public async followAccount(
+		id: string,
+		_options?: { reblog?: boolean },
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/following/create", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/following/delete
+	 */
+	public async unfollowAccount(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/following/delete", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/blocking/create
+	 */
+	public async blockAccount(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/blocking/create", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/blocking/delete
+	 */
+	public async unblockAccount(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/blocking/delete", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/mute/create
+	 */
+	public async muteAccount(
+		id: string,
+		_notifications: boolean,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/mute/create", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/mute/delete
+	 */
+	public async unmuteAccount(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/mute/delete", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	public async pinAccount(_id: string): Promise<Response<Entity.Relationship>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async unpinAccount(
+		_id: string,
+	): Promise<Response<Entity.Relationship>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/users/relation
+	 *
+	 * @param id The accountID, for example `'1sdfag'`
+	 */
+	public async getRelationship(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/users/relation
+	 *
+	 * @param id Array of account ID, for example `['1sdfag', 'ds12aa']`.
+	 */
+	public async getRelationships(
+		ids: Array<string>,
+	): Promise<Response<Array<Entity.Relationship>>> {
+		return Promise.all(ids.map((id) => this.getRelationship(id))).then(
+			(results) => ({
+				...results[0],
+				data: results.map((r) => r.data),
+			}),
+		);
+	}
+
+	/**
+	 * POST /api/users/search
+	 */
+	public async searchAccount(
+		q: string,
+		options?: {
+			following?: boolean;
+			resolve?: boolean;
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>> {
+		let params = {
+			query: q,
+			detail: true,
+		};
+		if (options) {
+			if (options.resolve !== undefined) {
+				params = Object.assign(params, {
+					localOnly: options.resolve,
+				});
+			}
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 40,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 40,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.UserDetail>>("/api/users/search", params)
+			.then((res) => {
+				return Object.assign(res, {
+					data: res.data.map((u) =>
+						this.converter.userDetail(u, this.baseUrlToHost(this.baseUrl)),
+					),
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/bookmarks
+	// ======================================
+	/**
+	 * POST /api/i/favorites
+	 */
+	public async getBookmarks(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit <= 100 ? options.limit : 100,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 40,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 40,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Favorite>>("/api/i/favorites", params)
+			.then(async (res) => {
+				return Object.assign(res, {
+					data: await Promise.all(
+						res.data.map((s) =>
+							this.noteWithDetails(
+								s.note,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					),
+				});
+			});
+	}
+
+	// ======================================
+	//  accounts/favourites
+	// ======================================
+	public async getFavourites(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>> {
+		const userId = await this.client
+			.post<MisskeyAPI.Entity.UserDetail>("/api/i")
+			.then((res) => res.data.id);
+		return this.getAccountFavourites(userId, options);
+	}
+
+	// ======================================
+	// accounts/mutes
+	// ======================================
+	/**
+	 * POST /api/mute/list
+	 */
+	public async getMutes(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Account>>> {
+		let params = {};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 40,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 40,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Mute>>("/api/mute/list", params)
+			.then((res) => {
+				return Object.assign(res, {
+					data: res.data.map((mute) =>
+						this.converter.userDetail(
+							mute.mutee,
+							this.baseUrlToHost(this.baseUrl),
+						),
+					),
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/blocks
+	// ======================================
+	/**
+	 * POST /api/blocking/list
+	 */
+	public async getBlocks(options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Account>>> {
+		let params = {};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 40,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 40,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Blocking>>("/api/blocking/list", params)
+			.then((res) => {
+				return Object.assign(res, {
+					data: res.data.map((blocking) =>
+						this.converter.userDetail(
+							blocking.blockee,
+							this.baseUrlToHost(this.baseUrl),
+						),
+					),
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/domain_blocks
+	// ======================================
+	public async getDomainBlocks(_options?: {
+		limit?: number;
+		max_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<string>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async blockDomain(_domain: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async unblockDomain(_domain: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// accounts/filters
+	// ======================================
+	public async getFilters(): Promise<Response<Array<Entity.Filter>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getFilter(_id: string): Promise<Response<Entity.Filter>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async createFilter(
+		_phrase: string,
+		_context: Array<string>,
+		_options?: {
+			irreversible?: boolean;
+			whole_word?: boolean;
+			expires_in?: string;
+		},
+	): Promise<Response<Entity.Filter>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async updateFilter(
+		_id: string,
+		_phrase: string,
+		_context: Array<string>,
+		_options?: {
+			irreversible?: boolean;
+			whole_word?: boolean;
+			expires_in?: string;
+		},
+	): Promise<Response<Entity.Filter>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async deleteFilter(_id: string): Promise<Response<Entity.Filter>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// accounts/reports
+	// ======================================
+	/**
+	 * POST /api/users/report-abuse
+	 */
+	public async report(
+		account_id: string,
+		comment: string,
+		_options?: {
+			status_ids?: Array<string>;
+			forward?: boolean;
+		},
+	): Promise<Response<Entity.Report>> {
+		return this.client
+			.post<{}>("/api/users/report-abuse", {
+				userId: account_id,
+				comment: comment,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: {
+						id: "",
+						action_taken: "",
+						comment: comment,
+						account_id: account_id,
+						status_ids: [],
+					},
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/follow_requests
+	// ======================================
+	/**
+	 * POST /api/following/requests/list
+	 */
+	public async getFollowRequests(
+		_limit?: number,
+	): Promise<Response<Array<Entity.Account>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.FollowRequest>>(
+				"/api/following/requests/list",
+			)
+			.then((res) => {
+				return Object.assign(res, {
+					data: res.data.map((r) => this.converter.user(r.follower)),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/following/requests/accept
+	 */
+	public async acceptFollowRequest(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/following/requests/accept", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	/**
+	 * POST /api/following/requests/reject
+	 */
+	public async rejectFollowRequest(
+		id: string,
+	): Promise<Response<Entity.Relationship>> {
+		await this.client.post<{}>("/api/following/requests/reject", {
+			userId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Relation>("/api/users/relation", {
+				userId: id,
+			})
+			.then((res) => {
+				return Object.assign(res, {
+					data: this.converter.relation(res.data),
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/endorsements
+	// ======================================
+	public async getEndorsements(_options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+	}): Promise<Response<Array<Entity.Account>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// accounts/featured_tags
+	// ======================================
+	public async getFeaturedTags(): Promise<Response<Array<Entity.FeaturedTag>>> {
+		return this.getAccountFeaturedTags();
+	}
+
+	public async getAccountFeaturedTags(): Promise<
+		Response<Array<Entity.FeaturedTag>>
+	> {
+		const tags: Entity.FeaturedTag[] = [];
+		const res: Response = {
+			headers: undefined,
+			statusText: "",
+			status: 200,
+			data: tags,
+		};
+		return new Promise((resolve) => resolve(res));
+	}
+
+	public async createFeaturedTag(
+		_name: string,
+	): Promise<Response<Entity.FeaturedTag>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async deleteFeaturedTag(_id: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getSuggestedTags(): Promise<Response<Array<Entity.Tag>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// accounts/preferences
+	// ======================================
+	public async getPreferences(): Promise<Response<Entity.Preferences>> {
+		return this.client
+			.post<MisskeyAPI.Entity.UserDetailMe>("/api/i")
+			.then(async (res) => {
+				return Object.assign(res, {
+					data: this.converter.userPreferences(
+						res.data,
+						await this.getDefaultPostPrivacy(),
+					),
+				});
+			});
+	}
+
+	// ======================================
+	// accounts/suggestions
+	// ======================================
+	/**
+	 * POST /api/users/recommendation
+	 */
+	public async getSuggestions(
+		limit?: number,
+	): Promise<Response<Array<Entity.Account>>> {
+		let params = {};
+		if (limit) {
+			params = Object.assign(params, {
+				limit: limit,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.UserDetail>>(
+				"/api/users/recommendation",
+				params,
+			)
+			.then((res) => ({
+				...res,
+				data: res.data.map((u) =>
+					this.converter.userDetail(u, this.baseUrlToHost(this.baseUrl)),
+				),
+			}));
+	}
+
+	// ======================================
+	// accounts/tags
+	// ======================================
+	public async getFollowedTags(): Promise<Response<Array<Entity.Tag>>> {
+		const tags: Entity.Tag[] = [];
+		const res: Response = {
+			headers: undefined,
+			statusText: "",
+			status: 200,
+			data: tags,
+		};
+		return new Promise((resolve) => resolve(res));
+	}
+
+	public async getTag(_id: string): Promise<Response<Entity.Tag>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async followTag(_id: string): Promise<Response<Entity.Tag>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async unfollowTag(_id: string): Promise<Response<Entity.Tag>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// statuses
+	// ======================================
+	public async postStatus(
+		status: string,
+		options?: {
+			media_ids?: Array<string>;
+			poll?: {
+				options: Array<string>;
+				expires_in: number;
+				multiple?: boolean;
+				hide_totals?: boolean;
+			};
+			in_reply_to_id?: string;
+			sensitive?: boolean;
+			spoiler_text?: string;
+			visibility?: "public" | "unlisted" | "private" | "direct";
+			scheduled_at?: string;
+			language?: string;
+			quote_id?: string;
+		},
+	): Promise<Response<Entity.Status>> {
+		let params = {
+			text: status,
+		};
+		if (options) {
+			if (options.media_ids) {
+				params = Object.assign(params, {
+					fileIds: options.media_ids,
+				});
+			}
+			if (options.poll) {
+				let pollParam = {
+					choices: options.poll.options,
+					expiresAt: null,
+					expiredAfter: options.poll.expires_in * 1000,
+				};
+				if (options.poll.multiple !== undefined) {
+					pollParam = Object.assign(pollParam, {
+						multiple: options.poll.multiple,
+					});
+				}
+				params = Object.assign(params, {
+					poll: pollParam,
+				});
+			}
+			if (options.in_reply_to_id) {
+				params = Object.assign(params, {
+					replyId: options.in_reply_to_id,
+				});
+			}
+			if (options.sensitive) {
+				params = Object.assign(params, {
+					cw: "",
+				});
+			}
+			if (options.spoiler_text) {
+				params = Object.assign(params, {
+					cw: options.spoiler_text,
+				});
+			}
+			if (options.visibility) {
+				params = Object.assign(params, {
+					visibility: this.converter.encodeVisibility(options.visibility),
+				});
+			}
+			if (options.quote_id) {
+				params = Object.assign(params, {
+					renoteId: options.quote_id,
+				});
+			}
+		}
+		return this.client
+			.post<MisskeyAPI.Entity.CreatedNote>("/api/notes/create", params)
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data.createdNote,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/show
+	 */
+	public async getStatus(id: string): Promise<Response<Entity.Status>> {
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	private getFreshAccountCache(): AccountCache {
+		return {
+			locks: new AsyncLock(),
+			accounts: [],
+		};
+	}
+
+	public async notificationWithDetails(
+		n: MisskeyAPI.Entity.Notification,
+		host: string,
+		cache: AccountCache,
+	): Promise<MegalodonEntity.Notification> {
+		const notification = this.converter.notification(n, host);
+		if (n.note)
+			notification.status = await this.noteWithDetails(n.note, host, cache);
+		if (notification.account)
+			notification.account = (
+				await this.getAccount(notification.account.id)
+			).data;
+		return notification;
+	}
+
+	public async noteWithDetails(
+		n: MisskeyAPI.Entity.Note,
+		host: string,
+		cache: AccountCache,
+	): Promise<MegalodonEntity.Status> {
+		const status = await this.addUserDetailsToStatus(
+			this.converter.note(n, host),
+			cache,
+		);
+		status.bookmarked = await this.isStatusBookmarked(n.id);
+		return this.addMentionsToStatus(status, cache);
+	}
+
+	public async isStatusBookmarked(id: string): Promise<boolean> {
+		return this.client
+			.post<MisskeyAPI.Entity.State>("/api/notes/state", {
+				noteId: id,
+			})
+			.then((p) => p.data.isFavorited ?? false);
+	}
+
+	public async addUserDetailsToStatus(
+		status: Entity.Status,
+		cache: AccountCache,
+	): Promise<Entity.Status> {
+		if (
+			status.account.followers_count === 0 &&
+			status.account.followers_count === 0 &&
+			status.account.statuses_count === 0
+		)
+			status.account =
+				(await this.getAccountCached(
+					status.account.id,
+					status.account.acct,
+					cache,
+				)) ?? status.account;
+
+		if (status.reblog != null)
+			status.reblog = await this.addUserDetailsToStatus(status.reblog, cache);
+
+		if (status.quote != null)
+			status.quote = await this.addUserDetailsToStatus(status.quote, cache);
+
+		return status;
+	}
+
+	public async addMentionsToStatus(
+		status: Entity.Status,
+		cache: AccountCache,
+	): Promise<Entity.Status> {
+		if (status.mentions.length > 0) return status;
+
+		if (status.reblog != null)
+			status.reblog = await this.addMentionsToStatus(status.reblog, cache);
+
+		if (status.quote != null)
+			status.quote = await this.addMentionsToStatus(status.quote, cache);
+
+		const idx = status.account.acct.indexOf("@");
+		const origin = idx < 0 ? null : status.account.acct.substring(idx + 1);
+
+		status.mentions = (
+			await this.getMentions(status.plain_content!, origin, cache)
+		).filter((p) => p != null);
+		for (const m of status.mentions.filter(
+			(value, index, array) => array.indexOf(value) === index,
+		)) {
+			const regexFull = new RegExp(
+				`(?<=^|\\s|>)@${m.acct}(?=[^a-zA-Z0-9]|$)`,
+				"gi",
+			);
+			const regexLocalUser = new RegExp(
+				`(?<=^|\\s|>)@${m.acct}@${this.baseUrlToHost(
+					this.baseUrl,
+				)}(?=[^a-zA-Z0-9]|$)`,
+				"gi",
+			);
+			const regexRemoteUser = new RegExp(
+				`(?<=^|\\s|>)@${m.username}(?=[^a-zA-Z0-9@]|$)`,
+				"gi",
+			);
+
+			if (m.acct == m.username) {
+				status.content = status.content.replace(regexLocalUser, `@${m.acct}`);
+			} else if (!status.content.match(regexFull)) {
+				status.content = status.content.replace(regexRemoteUser, `@${m.acct}`);
+			}
+
+			status.content = status.content.replace(
+				regexFull,
+				`<a href="${m.url}" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@${m.acct}</a>`,
+			);
+		}
+		return status;
+	}
+
+	public async getMentions(
+		text: string,
+		origin: string | null,
+		cache: AccountCache,
+	): Promise<Entity.Mention[]> {
+		const mentions: Entity.Mention[] = [];
+
+		if (text == undefined) return mentions;
+
+		const mentionMatch = text.matchAll(
+			/(?<=^|\s)@(?<user>[a-zA-Z0-9_]+)(?:@(?<host>[a-zA-Z0-9-.]+\.[a-zA-Z0-9-]+)|)(?=[^a-zA-Z0-9]|$)/g,
+		);
+
+		for (const m of mentionMatch) {
+			try {
+				if (m.groups == null) continue;
+
+				const account = await this.getAccountByNameCached(
+					m.groups.user,
+					m.groups.host ?? origin,
+					cache,
+				);
+
+				if (account == null) continue;
+
+				mentions.push({
+					id: account.id,
+					url: account.url,
+					username: account.username,
+					acct: account.acct,
+				});
+			} catch {}
+		}
+
+		return mentions;
+	}
+
+	public async getAccountByNameCached(
+		user: string,
+		host: string | null,
+		cache: AccountCache,
+	): Promise<Entity.Account | undefined | null> {
+		const acctToFind = host == null ? user : `${user}@${host}`;
+
+		return await cache.locks.acquire(acctToFind, async () => {
+			const cacheHit = cache.accounts.find((p) => p.acct === acctToFind);
+			const account =
+				cacheHit ?? (await this.getAccountByName(user, host ?? null)).data;
+
+			if (!account) {
+				return null;
+			}
+
+			if (cacheHit == null) {
+				cache.accounts.push(account);
+			}
+
+			return account;
+		});
+	}
+
+	public async getAccountCached(
+		id: string,
+		acct: string,
+		cache: AccountCache,
+	): Promise<Entity.Account | undefined | null> {
+		return await cache.locks.acquire(acct, async () => {
+			const cacheHit = cache.accounts.find((p) => p.id === id);
+			const account = cacheHit ?? (await this.getAccount(id)).data;
+
+			if (!account) {
+				return null;
+			}
+
+			if (cacheHit == null) {
+				cache.accounts.push(account);
+			}
+
+			return account;
+		});
+	}
+
+	public async editStatus(
+		_id: string,
+		_options: {
+			status?: string;
+			spoiler_text?: string;
+			sensitive?: boolean;
+			media_ids?: Array<string>;
+			poll?: {
+				options?: Array<string>;
+				expires_in?: number;
+				multiple?: boolean;
+				hide_totals?: boolean;
+			};
+		},
+	): Promise<Response<Entity.Status>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/notes/delete
+	 */
+	public async deleteStatus(id: string): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/notes/delete", {
+			noteId: id,
+		});
+	}
+
+	/**
+	 * POST /api/notes/children
+	 */
+	public async getStatusContext(
+		id: string,
+		options?: { limit?: number; max_id?: string; since_id?: string },
+	): Promise<Response<Entity.Context>> {
+		let params = {
+			noteId: id,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+					depth: 12,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 30,
+					depth: 12,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 30,
+				depth: 12,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/children", params)
+			.then(async (res) => {
+				const accountCache = this.getFreshAccountCache();
+				const conversation = await this.client.post<
+					Array<MisskeyAPI.Entity.Note>
+				>("/api/notes/conversation", params);
+				const parents = await Promise.all(
+					conversation.data.map((n) =>
+						this.noteWithDetails(
+							n,
+							this.baseUrlToHost(this.baseUrl),
+							accountCache,
+						),
+					),
+				);
+
+				const context: Entity.Context = {
+					ancestors: parents.reverse(),
+					descendants: this.dfs(
+						await Promise.all(
+							res.data.map((n) =>
+								this.noteWithDetails(
+									n,
+									this.baseUrlToHost(this.baseUrl),
+									accountCache,
+								),
+							),
+						),
+					),
+				};
+				return {
+					...res,
+					data: context,
+				};
+			});
+	}
+
+	private dfs(graph: Entity.Status[]) {
+		// we don't need to run dfs if we have zero or one elements
+		if (graph.length <= 1) {
+			return graph;
+		}
+
+		// sort the graph first, so we can grab the correct starting point
+		graph = graph.sort((a, b) => {
+			if (a.id < b.id) return -1;
+			if (a.id > b.id) return 1;
+			return 0;
+		});
+
+		const initialPostId = graph[0].in_reply_to_id;
+
+		// populate stack with all top level replies
+		const stack = graph
+			.filter((reply) => reply.in_reply_to_id === initialPostId)
+			.reverse();
+		const visited = new Set();
+		const result = [];
+
+		while (stack.length) {
+			const currentPost = stack.pop();
+
+			if (currentPost === undefined) return result;
+
+			if (!visited.has(currentPost)) {
+				visited.add(currentPost);
+				result.push(currentPost);
+
+				for (const reply of graph
+					.filter((reply) => reply.in_reply_to_id === currentPost.id)
+					.reverse()) {
+					stack.push(reply);
+				}
+			}
+		}
+
+		return result;
+	}
+
+	public async getStatusHistory(): Promise<Response<Array<Entity.StatusEdit>>> {
+		// FIXME: stub, implement once we have note edit history in the database
+		const history: Entity.StatusEdit[] = [];
+		const res: Response = {
+			headers: undefined,
+			statusText: "",
+			status: 200,
+			data: history,
+		};
+		return new Promise((resolve) => resolve(res));
+	}
+
+	/**
+	 * POST /api/notes/renotes
+	 */
+	public async getStatusRebloggedBy(
+		id: string,
+	): Promise<Response<Array<Entity.Account>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/renotes", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(res.data.map((n) => this.getAccount(n.user.id)))
+				).map((p) => p.data),
+			}));
+	}
+
+	public async getStatusFavouritedBy(
+		id: string,
+	): Promise<Response<Array<Entity.Account>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Reaction>>("/api/notes/reactions", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(res.data.map((n) => this.getAccount(n.user.id)))
+				).map((p) => p.data),
+			}));
+	}
+
+	public async favouriteStatus(id: string): Promise<Response<Entity.Status>> {
+		return this.createEmojiReaction(id, await this.getDefaultFavoriteEmoji());
+	}
+
+	private async getDefaultFavoriteEmoji(): Promise<string> {
+		// NOTE: get-unsecure is calckey's extension.
+		//       Misskey doesn't have this endpoint and regular `/i/registry/get` won't work
+		//       unless you have a 'nativeToken', which is reserved for the frontend webapp.
+
+		return await this.client
+			.post<Array<string>>("/api/i/registry/get-unsecure", {
+				key: "reactions",
+				scope: ["client", "base"],
+			})
+			.then((res) => res.data[0] ?? "⭐");
+	}
+
+	private async getDefaultPostPrivacy(): Promise<
+		"public" | "unlisted" | "private" | "direct"
+	> {
+		// NOTE: get-unsecure is calckey's extension.
+		//       Misskey doesn't have this endpoint and regular `/i/registry/get` won't work
+		//       unless you have a 'nativeToken', which is reserved for the frontend webapp.
+
+		return this.client
+			.post<string>("/api/i/registry/get-unsecure", {
+				key: "defaultNoteVisibility",
+				scope: ["client", "base"],
+			})
+			.then((res) => {
+				if (
+					!res.data ||
+					(res.data != "public" &&
+						res.data != "home" &&
+						res.data != "followers" &&
+						res.data != "specified")
+				)
+					return "public";
+				return this.converter.visibility(res.data);
+			})
+			.catch((_) => "public");
+	}
+
+	public async unfavouriteStatus(id: string): Promise<Response<Entity.Status>> {
+		// NOTE: Misskey allows only one reaction per status, so we don't need to care what that emoji was.
+		return this.deleteEmojiReaction(id, "");
+	}
+
+	/**
+	 * POST /api/notes/create
+	 */
+	public async reblogStatus(id: string): Promise<Response<Entity.Status>> {
+		return this.client
+			.post<MisskeyAPI.Entity.CreatedNote>("/api/notes/create", {
+				renoteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data.createdNote,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/unrenote
+	 */
+	public async unreblogStatus(id: string): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/unrenote", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/favorites/create
+	 */
+	public async bookmarkStatus(id: string): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/favorites/create", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/favorites/delete
+	 */
+	public async unbookmarkStatus(id: string): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/favorites/delete", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	public async muteStatus(_id: string): Promise<Response<Entity.Status>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async unmuteStatus(_id: string): Promise<Response<Entity.Status>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/i/pin
+	 */
+	public async pinStatus(id: string): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/i/pin", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/i/unpin
+	 */
+	public async unpinStatus(id: string): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/i/unpin", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * Convert a Unicode emoji or custom emoji name to a Misskey reaction.
+	 * @see Misskey's reaction-lib.ts
+	 */
+	private reactionName(name: string): string {
+		// See: https://github.com/tc39/proposal-regexp-unicode-property-escapes#matching-emoji
+		const isUnicodeEmoji =
+			/\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu.test(
+				name,
+			);
+		if (isUnicodeEmoji) {
+			return name;
+		}
+		return `:${name}:`;
+	}
+
+	/**
+	 * POST /api/notes/reactions/create
+	 */
+	public async reactStatus(
+		id: string,
+		name: string,
+	): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/reactions/create", {
+			noteId: id,
+			reaction: this.reactionName(name),
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/reactions/delete
+	 */
+	public async unreactStatus(
+		id: string,
+		name: string,
+	): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/reactions/delete", {
+			noteId: id,
+			reaction: this.reactionName(name),
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	// ======================================
+	// statuses/media
+	// ======================================
+	/**
+	 * POST /api/drive/files/create
+	 */
+	public async uploadMedia(
+		file: any,
+		options?: { description?: string; focus?: string },
+	): Promise<Response<Entity.Attachment>> {
+		const formData = new FormData();
+		formData.append("file", fs.createReadStream(file.path), {
+			contentType: file.mimetype,
+		});
+
+		if (file.originalname != null && file.originalname !== "file")
+			formData.append("name", file.originalname);
+
+		if (options?.description != null)
+			formData.append("comment", options.description);
+
+		let headers: { [key: string]: string } = {};
+		if (typeof formData.getHeaders === "function") {
+			headers = formData.getHeaders();
+		}
+		return this.client
+			.post<MisskeyAPI.Entity.File>(
+				"/api/drive/files/create",
+				formData,
+				headers,
+			)
+			.then((res) => ({ ...res, data: this.converter.file(res.data) }));
+	}
+
+	public async getMedia(id: string): Promise<Response<Entity.Attachment>> {
+		const res = await this.client.post<MisskeyAPI.Entity.File>(
+			"/api/drive/files/show",
+			{ fileId: id },
+		);
+		return { ...res, data: this.converter.file(res.data) };
+	}
+
+	/**
+	 * POST /api/drive/files/update
+	 */
+	public async updateMedia(
+		id: string,
+		options?: {
+			file?: any;
+			description?: string;
+			focus?: string;
+			is_sensitive?: boolean;
+		},
+	): Promise<Response<Entity.Attachment>> {
+		let params = {
+			fileId: id,
+		};
+		if (options) {
+			if (options.is_sensitive !== undefined) {
+				params = Object.assign(params, {
+					isSensitive: options.is_sensitive,
+				});
+			}
+
+			if (options.description !== undefined) {
+				params = Object.assign(params, {
+					comment: options.description,
+				});
+			}
+		}
+		return this.client
+			.post<MisskeyAPI.Entity.File>("/api/drive/files/update", params)
+			.then((res) => ({ ...res, data: this.converter.file(res.data) }));
+	}
+
+	// ======================================
+	// statuses/polls
+	// ======================================
+	public async getPoll(id: string): Promise<Response<Entity.Poll>> {
+		const res = await this.getStatus(id);
+		if (res.data.poll == null) throw new Error("poll not found");
+		return { ...res, data: res.data.poll };
+	}
+
+	/**
+	 * POST /api/notes/polls/vote
+	 */
+	public async votePoll(
+		id: string,
+		choices: Array<number>,
+	): Promise<Response<Entity.Poll>> {
+		if (!id) {
+			return new Promise((_, reject) => {
+				const err = new ArgumentError("id is required");
+				reject(err);
+			});
+		}
+
+		for (const c of choices) {
+			const params = {
+				noteId: id,
+				choice: +c,
+			};
+			await this.client.post<{}>("/api/notes/polls/vote", params);
+		}
+
+		const res = await this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => {
+				const note = await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				);
+				return { ...res, data: note.poll };
+			});
+		if (!res.data) {
+			return new Promise((_, reject) => {
+				const err = new UnexpectedError("poll does not exist");
+				reject(err);
+			});
+		}
+		return { ...res, data: res.data };
+	}
+
+	// ======================================
+	// statuses/scheduled_statuses
+	// ======================================
+	public async getScheduledStatuses(_options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.ScheduledStatus>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getScheduledStatus(
+		_id: string,
+	): Promise<Response<Entity.ScheduledStatus>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async scheduleStatus(
+		_id: string,
+		_scheduled_at?: string | null,
+	): Promise<Response<Entity.ScheduledStatus>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async cancelScheduledStatus(_id: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// timelines
+	// ======================================
+	/**
+	 * POST /api/notes/global-timeline
+	 */
+	public async getPublicTimeline(options?: {
+		only_media?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {};
+		if (options) {
+			if (options.only_media !== undefined) {
+				params = Object.assign(params, {
+					withFiles: options.only_media,
+				});
+			}
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/global-timeline", params)
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(
+						res.data.map((n) =>
+							this.noteWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					)
+				).sort(this.sortByIdDesc),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/local-timeline
+	 */
+	public async getLocalTimeline(options?: {
+		only_media?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {};
+		if (options) {
+			if (options.only_media !== undefined) {
+				params = Object.assign(params, {
+					withFiles: options.only_media,
+				});
+			}
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/local-timeline", params)
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(
+						res.data.map((n) =>
+							this.noteWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					)
+				).sort(this.sortByIdDesc),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/search-by-tag
+	 */
+	public async getTagTimeline(
+		hashtag: string,
+		options?: {
+			local?: boolean;
+			only_media?: boolean;
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			min_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {
+			tag: hashtag,
+		};
+		if (options) {
+			if (options.only_media !== undefined) {
+				params = Object.assign(params, {
+					withFiles: options.only_media,
+				});
+			}
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/search-by-tag", params)
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(
+						res.data.map((n) =>
+							this.noteWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					)
+				).sort(this.sortByIdDesc),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/timeline
+	 */
+	public async getHomeTimeline(options?: {
+		local?: boolean;
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {
+			withFiles: false,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/timeline", params)
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(
+						res.data.map((n) =>
+							this.noteWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					)
+				).sort(this.sortByIdDesc),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/user-list-timeline
+	 */
+	public async getListTimeline(
+		list_id: string,
+		options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+			min_id?: string;
+		},
+	): Promise<Response<Array<Entity.Status>>> {
+		const accountCache = this.getFreshAccountCache();
+
+		let params = {
+			listId: list_id,
+			withFiles: false,
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>(
+				"/api/notes/user-list-timeline",
+				params,
+			)
+			.then(async (res) => ({
+				...res,
+				data: (
+					await Promise.all(
+						res.data.map((n) =>
+							this.noteWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							),
+						),
+					)
+				).sort(this.sortByIdDesc),
+			}));
+	}
+
+	// ======================================
+	// timelines/conversations
+	// ======================================
+	/**
+	 * POST /api/notes/mentions
+	 */
+	public async getConversationTimeline(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+	}): Promise<Response<Array<Entity.Conversation>>> {
+		let params = {
+			visibility: "specified",
+		};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/mentions", params)
+			.then((res) => ({
+				...res,
+				data: res.data.map((n) =>
+					this.converter.noteToConversation(
+						n,
+						this.baseUrlToHost(this.baseUrl),
+					),
+				),
+			}));
+		// FIXME: ^ this should also parse mentions
+	}
+
+	public async deleteConversation(_id: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async readConversation(
+		_id: string,
+	): Promise<Response<Entity.Conversation>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	private sortByIdDesc(a: Entity.Status, b: Entity.Status): number {
+		if (a.id < b.id) return 1;
+		if (a.id > b.id) return -1;
+
+		return 0;
+	}
+
+	// ======================================
+	// timelines/lists
+	// ======================================
+	/**
+	 * POST /api/users/lists/list
+	 */
+	public async getLists(): Promise<Response<Array<Entity.List>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.List>>("/api/users/lists/list")
+			.then((res) => ({
+				...res,
+				data: res.data.map((l) => this.converter.list(l)),
+			}));
+	}
+
+	/**
+	 * POST /api/users/lists/show
+	 */
+	public async getList(id: string): Promise<Response<Entity.List>> {
+		return this.client
+			.post<MisskeyAPI.Entity.List>("/api/users/lists/show", {
+				listId: id,
+			})
+			.then((res) => ({ ...res, data: this.converter.list(res.data) }));
+	}
+
+	/**
+	 * POST /api/users/lists/create
+	 */
+	public async createList(title: string): Promise<Response<Entity.List>> {
+		return this.client
+			.post<MisskeyAPI.Entity.List>("/api/users/lists/create", {
+				name: title,
+			})
+			.then((res) => ({ ...res, data: this.converter.list(res.data) }));
+	}
+
+	/**
+	 * POST /api/users/lists/update
+	 */
+	public async updateList(
+		id: string,
+		title: string,
+	): Promise<Response<Entity.List>> {
+		return this.client
+			.post<MisskeyAPI.Entity.List>("/api/users/lists/update", {
+				listId: id,
+				name: title,
+			})
+			.then((res) => ({ ...res, data: this.converter.list(res.data) }));
+	}
+
+	/**
+	 * POST /api/users/lists/delete
+	 */
+	public async deleteList(id: string): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/users/lists/delete", {
+			listId: id,
+		});
+	}
+
+	/**
+	 * POST /api/users/lists/show
+	 */
+	public async getAccountsInList(
+		id: string,
+		_options?: {
+			limit?: number;
+			max_id?: string;
+			since_id?: string;
+		},
+	): Promise<Response<Array<Entity.Account>>> {
+		const res = await this.client.post<MisskeyAPI.Entity.List>(
+			"/api/users/lists/show",
+			{
+				listId: id,
+			},
+		);
+		const promise = res.data.userIds.map((userId) => this.getAccount(userId));
+		const accounts = await Promise.all(promise);
+		return { ...res, data: accounts.map((r) => r.data) };
+	}
+
+	/**
+	 * POST /api/users/lists/push
+	 */
+	public async addAccountsToList(
+		id: string,
+		account_ids: Array<string>,
+	): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/users/lists/push", {
+			listId: id,
+			userId: account_ids[0],
+		});
+	}
+
+	/**
+	 * POST /api/users/lists/pull
+	 */
+	public async deleteAccountsFromList(
+		id: string,
+		account_ids: Array<string>,
+	): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/users/lists/pull", {
+			listId: id,
+			userId: account_ids[0],
+		});
+	}
+
+	// ======================================
+	// timelines/markers
+	// ======================================
+	public async getMarkers(
+		_timeline: Array<string>,
+	): Promise<Response<Entity.Marker | {}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async saveMarkers(_options?: {
+		home?: { last_read_id: string };
+		notifications?: { last_read_id: string };
+	}): Promise<Response<Entity.Marker>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// notifications
+	// ======================================
+	/**
+	 * POST /api/i/notifications
+	 */
+	public async getNotifications(options?: {
+		limit?: number;
+		max_id?: string;
+		since_id?: string;
+		min_id?: string;
+		exclude_type?: Array<Entity.NotificationType>;
+		account_id?: string;
+	}): Promise<Response<Array<Entity.Notification>>> {
+		let params = {};
+		if (options) {
+			if (options.limit) {
+				params = Object.assign(params, {
+					limit: options.limit <= 100 ? options.limit : 100,
+				});
+			} else {
+				params = Object.assign(params, {
+					limit: 20,
+				});
+			}
+			if (options.max_id) {
+				params = Object.assign(params, {
+					untilId: options.max_id,
+				});
+			}
+			if (options.since_id) {
+				params = Object.assign(params, {
+					sinceId: options.since_id,
+				});
+			}
+			if (options.min_id) {
+				params = Object.assign(params, {
+					sinceId: options.min_id,
+				});
+			}
+			if (options.exclude_type) {
+				params = Object.assign(params, {
+					excludeType: options.exclude_type.map((e) =>
+						this.converter.encodeNotificationType(e),
+					),
+				});
+			}
+		} else {
+			params = Object.assign(params, {
+				limit: 20,
+			});
+		}
+		const cache = this.getFreshAccountCache();
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Notification>>(
+				"/api/i/notifications",
+				params,
+			)
+			.then(async (res) => ({
+				...res,
+				data: await Promise.all(
+					res.data
+						.filter(
+							(p) => p.type != MisskeyNotificationType.FollowRequestAccepted,
+						) // these aren't supported on mastodon
+						.map((n) =>
+							this.notificationWithDetails(
+								n,
+								this.baseUrlToHost(this.baseUrl),
+								cache,
+							),
+						),
+				),
+			}));
+	}
+
+	public async getNotification(
+		_id: string,
+	): Promise<Response<Entity.Notification>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * POST /api/notifications/mark-all-as-read
+	 */
+	public async dismissNotifications(): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/notifications/mark-all-as-read");
+	}
+
+	public async dismissNotification(_id: string): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async readNotifications(_options: {
+		id?: string;
+		max_id?: string;
+	}): Promise<Response<Entity.Notification | Array<Entity.Notification>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("mastodon does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// notifications/push
+	// ======================================
+	public async subscribePushNotification(
+		_subscription: { endpoint: string; keys: { p256dh: string; auth: string } },
+		_data?: {
+			alerts: {
+				follow?: boolean;
+				favourite?: boolean;
+				reblog?: boolean;
+				mention?: boolean;
+				poll?: boolean;
+			};
+		} | null,
+	): Promise<Response<Entity.PushSubscription>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getPushSubscription(): Promise<
+		Response<Entity.PushSubscription>
+	> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async updatePushSubscription(
+		_data?: {
+			alerts: {
+				follow?: boolean;
+				favourite?: boolean;
+				reblog?: boolean;
+				mention?: boolean;
+				poll?: boolean;
+			};
+		} | null,
+	): Promise<Response<Entity.PushSubscription>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	/**
+	 * DELETE /api/v1/push/subscription
+	 */
+	public async deletePushSubscription(): Promise<Response<{}>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// search
+	// ======================================
+	public async search(
+		q: string,
+		type: "accounts" | "hashtags" | "statuses",
+		options?: {
+			limit?: number;
+			max_id?: string;
+			min_id?: string;
+			resolve?: boolean;
+			offset?: number;
+			following?: boolean;
+			account_id?: string;
+			exclude_unreviewed?: boolean;
+		},
+	): Promise<Response<Entity.Results>> {
+		const accountCache = this.getFreshAccountCache();
+
+		switch (type) {
+			case "accounts": {
+				if (q.startsWith("http://") || q.startsWith("https://")) {
+					return this.client
+						.post("/api/ap/show", { uri: q })
+						.then(async (res) => {
+							if (res.status != 200 || res.data.type != "User") {
+								res.status = 200;
+								res.statusText = "OK";
+								res.data = {
+									accounts: [],
+									statuses: [],
+									hashtags: [],
+								};
+
+								return res;
+							}
+
+							const account = await this.converter.userDetail(
+								res.data.object as MisskeyAPI.Entity.UserDetail,
+								this.baseUrlToHost(this.baseUrl),
+							);
+
+							return {
+								...res,
+								data: {
+									accounts:
+										options?.max_id && options?.max_id >= account.id
+											? []
+											: [account],
+									statuses: [],
+									hashtags: [],
+								},
+							};
+						});
+				}
+				let params = {
+					query: q,
+				};
+				if (options) {
+					if (options.limit) {
+						params = Object.assign(params, {
+							limit: options.limit,
+						});
+					} else {
+						params = Object.assign(params, {
+							limit: 20,
+						});
+					}
+					if (options.offset) {
+						params = Object.assign(params, {
+							offset: options.offset,
+						});
+					}
+					if (options.resolve) {
+						params = Object.assign(params, {
+							localOnly: options.resolve,
+						});
+					}
+				} else {
+					params = Object.assign(params, {
+						limit: 20,
+					});
+				}
+
+				try {
+					const match = q.match(
+						/^@(?<user>[a-zA-Z0-9_]+)(?:@(?<host>[a-zA-Z0-9-.]+\.[a-zA-Z0-9-]+)|)$/,
+					);
+					if (match) {
+						const lookupQuery = {
+							username: match.groups?.user,
+							host: match.groups?.host,
+						};
+
+						const result = await this.client
+							.post<MisskeyAPI.Entity.UserDetail>(
+								"/api/users/show",
+								lookupQuery,
+							)
+							.then((res) => ({
+								...res,
+								data: {
+									accounts: [
+										this.converter.userDetail(
+											res.data,
+											this.baseUrlToHost(this.baseUrl),
+										),
+									],
+									statuses: [],
+									hashtags: [],
+								},
+							}));
+
+						if (result.status !== 200) {
+							result.status = 200;
+							result.statusText = "OK";
+							result.data = {
+								accounts: [],
+								statuses: [],
+								hashtags: [],
+							};
+						}
+
+						return result;
+					}
+				} catch {}
+
+				return this.client
+					.post<Array<MisskeyAPI.Entity.UserDetail>>(
+						"/api/users/search",
+						params,
+					)
+					.then((res) => ({
+						...res,
+						data: {
+							accounts: res.data.map((u) =>
+								this.converter.userDetail(u, this.baseUrlToHost(this.baseUrl)),
+							),
+							statuses: [],
+							hashtags: [],
+						},
+					}));
+			}
+			case "statuses": {
+				if (q.startsWith("http://") || q.startsWith("https://")) {
+					return this.client
+						.post("/api/ap/show", { uri: q })
+						.then(async (res) => {
+							if (res.status != 200 || res.data.type != "Note") {
+								res.status = 200;
+								res.statusText = "OK";
+								res.data = {
+									accounts: [],
+									statuses: [],
+									hashtags: [],
+								};
+
+								return res;
+							}
+
+							const post = await this.noteWithDetails(
+								res.data.object as MisskeyAPI.Entity.Note,
+								this.baseUrlToHost(this.baseUrl),
+								accountCache,
+							);
+
+							return {
+								...res,
+								data: {
+									accounts: [],
+									statuses:
+										options?.max_id && options.max_id >= post.id ? [] : [post],
+									hashtags: [],
+								},
+							};
+						});
+				}
+				let params = {
+					query: q,
+				};
+				if (options) {
+					if (options.limit) {
+						params = Object.assign(params, {
+							limit: options.limit,
+						});
+					}
+					if (options.offset) {
+						params = Object.assign(params, {
+							offset: options.offset,
+						});
+					}
+					if (options.max_id) {
+						params = Object.assign(params, {
+							untilId: options.max_id,
+						});
+					}
+					if (options.min_id) {
+						params = Object.assign(params, {
+							sinceId: options.min_id,
+						});
+					}
+					if (options.account_id) {
+						params = Object.assign(params, {
+							userId: options.account_id,
+						});
+					}
+				}
+				return this.client
+					.post<Array<MisskeyAPI.Entity.Note>>("/api/notes/search", params)
+					.then(async (res) => ({
+						...res,
+						data: {
+							accounts: [],
+							statuses: await Promise.all(
+								res.data.map((n) =>
+									this.noteWithDetails(
+										n,
+										this.baseUrlToHost(this.baseUrl),
+										accountCache,
+									),
+								),
+							),
+							hashtags: [],
+						},
+					}));
+			}
+			case "hashtags": {
+				let params = {
+					query: q,
+				};
+				if (options) {
+					if (options.limit) {
+						params = Object.assign(params, {
+							limit: options.limit,
+						});
+					}
+					if (options.offset) {
+						params = Object.assign(params, {
+							offset: options.offset,
+						});
+					}
+				}
+				return this.client
+					.post<Array<string>>("/api/hashtags/search", params)
+					.then((res) => ({
+						...res,
+						data: {
+							accounts: [],
+							statuses: [],
+							hashtags: res.data.map((h) => ({
+								name: h,
+								url: h,
+								history: null,
+								following: false,
+							})),
+						},
+					}));
+			}
+		}
+	}
+
+	// ======================================
+	// instance
+	// ======================================
+	/**
+	 * POST /api/meta
+	 * POST /api/stats
+	 */
+	public async getInstance(): Promise<Response<Entity.Instance>> {
+		const meta = await this.client
+			.post<MisskeyAPI.Entity.Meta>("/api/meta")
+			.then((res) => res.data);
+		return this.client
+			.post<MisskeyAPI.Entity.Stats>("/api/stats")
+			.then((res) => ({ ...res, data: this.converter.meta(meta, res.data) }));
+	}
+
+	public async getInstancePeers(): Promise<Response<Array<string>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public async getInstanceActivity(): Promise<
+		Response<Array<Entity.Activity>>
+	> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// instance/trends
+	// ======================================
+	/**
+	 * POST /api/hashtags/trend
+	 */
+	public async getInstanceTrends(
+		_limit?: number | null,
+	): Promise<Response<Array<Entity.Tag>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Hashtag>>("/api/hashtags/trend")
+			.then((res) => ({
+				...res,
+				data: res.data.map((h) => this.converter.hashtag(h)),
+			}));
+	}
+
+	// ======================================
+	// instance/directory
+	// ======================================
+	public async getInstanceDirectory(_options?: {
+		limit?: number;
+		offset?: number;
+		order?: "active" | "new";
+		local?: boolean;
+	}): Promise<Response<Array<Entity.Account>>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	// ======================================
+	// instance/custom_emojis
+	// ======================================
+	/**
+	 * POST /api/meta
+	 */
+	public async getInstanceCustomEmojis(): Promise<
+		Response<Array<Entity.Emoji>>
+	> {
+		return this.client
+			.post<MisskeyAPI.Entity.Meta>("/api/meta")
+			.then((res) => ({
+				...res,
+				data: res.data.emojis.map((e) => this.converter.emoji(e)),
+			}));
+	}
+
+	// ======================================
+	// instance/announcements
+	// ======================================
+	public async getInstanceAnnouncements(
+		with_dismissed?: boolean | null,
+	): Promise<Response<Array<Entity.Announcement>>> {
+		let params = {};
+		if (with_dismissed) {
+			params = Object.assign(params, {
+				withUnreads: with_dismissed,
+			});
+		}
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Announcement>>("/api/announcements", params)
+			.then((res) => ({
+				...res,
+				data: res.data.map((t) => this.converter.announcement(t)),
+			}));
+	}
+
+	public async dismissInstanceAnnouncement(id: string): Promise<Response<{}>> {
+		return this.client.post<{}>("/api/i/read-announcement", {
+			announcementId: id,
+		});
+	}
+
+	// ======================================
+	// Emoji reactions
+	// ======================================
+	/**
+	 * POST /api/notes/reactions/create
+	 *
+	 * @param {string} id Target note ID.
+	 * @param {string} emoji Reaction emoji string. This string is raw unicode emoji.
+	 */
+	public async createEmojiReaction(
+		id: string,
+		emoji: string,
+	): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/reactions/create", {
+			noteId: id,
+			reaction: emoji,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	/**
+	 * POST /api/notes/reactions/delete
+	 */
+	public async deleteEmojiReaction(
+		id: string,
+		_emoji: string,
+	): Promise<Response<Entity.Status>> {
+		await this.client.post<{}>("/api/notes/reactions/delete", {
+			noteId: id,
+		});
+		return this.client
+			.post<MisskeyAPI.Entity.Note>("/api/notes/show", {
+				noteId: id,
+			})
+			.then(async (res) => ({
+				...res,
+				data: await this.noteWithDetails(
+					res.data,
+					this.baseUrlToHost(this.baseUrl),
+					this.getFreshAccountCache(),
+				),
+			}));
+	}
+
+	public async getEmojiReactions(
+		id: string,
+	): Promise<Response<Array<Entity.Reaction>>> {
+		return this.client
+			.post<Array<MisskeyAPI.Entity.Reaction>>("/api/notes/reactions", {
+				noteId: id,
+			})
+			.then((res) => ({
+				...res,
+				data: this.converter.reactions(res.data),
+			}));
+	}
+
+	public async getEmojiReaction(
+		_id: string,
+		_emoji: string,
+	): Promise<Response<Entity.Reaction>> {
+		return new Promise((_, reject) => {
+			const err = new NoImplementedError("misskey does not support");
+			reject(err);
+		});
+	}
+
+	public userSocket(): WebSocketInterface {
+		return this.client.socket("user");
+	}
+
+	public publicSocket(): WebSocketInterface {
+		return this.client.socket("globalTimeline");
+	}
+
+	public localSocket(): WebSocketInterface {
+		return this.client.socket("localTimeline");
+	}
+
+	public tagSocket(_tag: string): WebSocketInterface {
+		throw new NoImplementedError("TODO: implement");
+	}
+
+	public listSocket(list_id: string): WebSocketInterface {
+		return this.client.socket("list", list_id);
+	}
+
+	public directSocket(): WebSocketInterface {
+		return this.client.socket("conversation");
+	}
+}
diff --git a/packages/megalodon/src/misskey/api_client.ts b/packages/megalodon/src/misskey/api_client.ts
new file mode 100644
index 0000000000..47932cbf19
--- /dev/null
+++ b/packages/megalodon/src/misskey/api_client.ts
@@ -0,0 +1,727 @@
+import axios, { AxiosResponse, AxiosRequestConfig } from "axios";
+import dayjs from "dayjs";
+import FormData from "form-data";
+
+import { DEFAULT_UA } from "../default";
+import proxyAgent, { ProxyConfig } from "../proxy_config";
+import Response from "../response";
+import MisskeyEntity from "./entity";
+import MegalodonEntity from "../entity";
+import WebSocket from "./web_socket";
+import MisskeyNotificationType from "./notification";
+import NotificationType from "../notification";
+
+namespace MisskeyAPI {
+	export namespace Entity {
+		export type App = MisskeyEntity.App;
+		export type Announcement = MisskeyEntity.Announcement;
+		export type Blocking = MisskeyEntity.Blocking;
+		export type Choice = MisskeyEntity.Choice;
+		export type CreatedNote = MisskeyEntity.CreatedNote;
+		export type Emoji = MisskeyEntity.Emoji;
+		export type Favorite = MisskeyEntity.Favorite;
+		export type Field = MisskeyEntity.Field;
+		export type File = MisskeyEntity.File;
+		export type Follower = MisskeyEntity.Follower;
+		export type Following = MisskeyEntity.Following;
+		export type FollowRequest = MisskeyEntity.FollowRequest;
+		export type Hashtag = MisskeyEntity.Hashtag;
+		export type List = MisskeyEntity.List;
+		export type Meta = MisskeyEntity.Meta;
+		export type Mute = MisskeyEntity.Mute;
+		export type Note = MisskeyEntity.Note;
+		export type Notification = MisskeyEntity.Notification;
+		export type Poll = MisskeyEntity.Poll;
+		export type Reaction = MisskeyEntity.Reaction;
+		export type Relation = MisskeyEntity.Relation;
+		export type User = MisskeyEntity.User;
+		export type UserDetail = MisskeyEntity.UserDetail;
+		export type UserDetailMe = MisskeyEntity.UserDetailMe;
+		export type GetAll = MisskeyEntity.GetAll;
+		export type UserKey = MisskeyEntity.UserKey;
+		export type Session = MisskeyEntity.Session;
+		export type Stats = MisskeyEntity.Stats;
+		export type State = MisskeyEntity.State;
+		export type APIEmoji = { emojis: Emoji[] };
+	}
+
+	export class Converter {
+		private baseUrl: string;
+		private instanceHost: string;
+		private plcUrl: string;
+		private modelOfAcct = {
+			id: "1",
+			username: "none",
+			acct: "none",
+			display_name: "none",
+			locked: true,
+			bot: true,
+			discoverable: false,
+			group: false,
+			created_at: "1971-01-01T00:00:00.000Z",
+			note: "",
+			url: "plc",
+			avatar: "plc",
+			avatar_static: "plc",
+			header: "plc",
+			header_static: "plc",
+			followers_count: -1,
+			following_count: 0,
+			statuses_count: 0,
+			last_status_at: "1971-01-01T00:00:00.000Z",
+			noindex: true,
+			emojis: [],
+			fields: [],
+			moved: null,
+		};
+
+		constructor(baseUrl: string) {
+			this.baseUrl = baseUrl;
+			this.instanceHost = baseUrl.substring(baseUrl.indexOf("//") + 2);
+			this.plcUrl = `${baseUrl}/static-assets/transparent.png`;
+			this.modelOfAcct.url = this.plcUrl;
+			this.modelOfAcct.avatar = this.plcUrl;
+			this.modelOfAcct.avatar_static = this.plcUrl;
+			this.modelOfAcct.header = this.plcUrl;
+			this.modelOfAcct.header_static = this.plcUrl;
+		}
+
+		// FIXME: Properly render MFM instead of just escaping HTML characters.
+		escapeMFM = (text: string): string =>
+			text
+				.replace(/&/g, "&amp;")
+				.replace(/</g, "&lt;")
+				.replace(/>/g, "&gt;")
+				.replace(/"/g, "&quot;")
+				.replace(/'/g, "&#39;")
+				.replace(/`/g, "&#x60;")
+				.replace(/\r?\n/g, "<br>");
+
+		emoji = (e: Entity.Emoji): MegalodonEntity.Emoji => {
+			return {
+				shortcode: e.name,
+				static_url: e.url,
+				url: e.url,
+				visible_in_picker: true,
+				category: e.category,
+			};
+		};
+
+		field = (f: Entity.Field): MegalodonEntity.Field => ({
+			name: f.name,
+			value: this.escapeMFM(f.value),
+			verified_at: null,
+		});
+
+		user = (u: Entity.User): MegalodonEntity.Account => {
+			let acct = u.username;
+			let acctUrl = `https://${u.host || this.instanceHost}/@${u.username}`;
+			if (u.host) {
+				acct = `${u.username}@${u.host}`;
+				acctUrl = `https://${u.host}/@${u.username}`;
+			}
+			return {
+				id: u.id,
+				username: u.username,
+				acct: acct,
+				display_name: u.name || u.username,
+				locked: false,
+				created_at: new Date().toISOString(),
+				followers_count: 0,
+				following_count: 0,
+				statuses_count: 0,
+				note: "",
+				url: acctUrl,
+				avatar: u.avatarUrl,
+				avatar_static: u.avatarUrl,
+				header: this.plcUrl,
+				header_static: this.plcUrl,
+				emojis: u.emojis.map((e) => this.emoji(e)),
+				moved: null,
+				fields: [],
+				bot: false,
+			};
+		};
+
+		userDetail = (
+			u: Entity.UserDetail,
+			host: string,
+		): MegalodonEntity.Account => {
+			let acct = u.username;
+			host = host.replace("https://", "");
+			let acctUrl = `https://${host || u.host || this.instanceHost}/@${
+				u.username
+			}`;
+			if (u.host) {
+				acct = `${u.username}@${u.host}`;
+				acctUrl = `https://${u.host}/@${u.username}`;
+			}
+			return {
+				id: u.id,
+				username: u.username,
+				acct: acct,
+				display_name: u.name || u.username,
+				locked: u.isLocked,
+				created_at: u.createdAt,
+				followers_count: u.followersCount,
+				following_count: u.followingCount,
+				statuses_count: u.notesCount,
+				note: u.description?.replace(/\n|\\n/g, "<br>") ?? "",
+				url: acctUrl,
+				avatar: u.avatarUrl,
+				avatar_static: u.avatarUrl,
+				header: u.bannerUrl ?? this.plcUrl,
+				header_static: u.bannerUrl ?? this.plcUrl,
+				emojis: u.emojis.map((e) => this.emoji(e)),
+				moved: null,
+				fields: u.fields.map((f) => this.field(f)),
+				bot: u.isBot,
+			};
+		};
+
+		userPreferences = (
+			u: MisskeyAPI.Entity.UserDetailMe,
+			v: "public" | "unlisted" | "private" | "direct",
+		): MegalodonEntity.Preferences => {
+			return {
+				"reading:expand:media": "default",
+				"reading:expand:spoilers": false,
+				"posting:default:language": u.lang,
+				"posting:default:sensitive": u.alwaysMarkNsfw,
+				"posting:default:visibility": v,
+			};
+		};
+
+		visibility = (
+			v: "public" | "home" | "followers" | "specified",
+		): "public" | "unlisted" | "private" | "direct" => {
+			switch (v) {
+				case "public":
+					return v;
+				case "home":
+					return "unlisted";
+				case "followers":
+					return "private";
+				case "specified":
+					return "direct";
+			}
+		};
+
+		encodeVisibility = (
+			v: "public" | "unlisted" | "private" | "direct",
+		): "public" | "home" | "followers" | "specified" => {
+			switch (v) {
+				case "public":
+					return v;
+				case "unlisted":
+					return "home";
+				case "private":
+					return "followers";
+				case "direct":
+					return "specified";
+			}
+		};
+
+		fileType = (
+			s: string,
+		): "unknown" | "image" | "gifv" | "video" | "audio" => {
+			if (s === "image/gif") {
+				return "gifv";
+			}
+			if (s.includes("image")) {
+				return "image";
+			}
+			if (s.includes("video")) {
+				return "video";
+			}
+			if (s.includes("audio")) {
+				return "audio";
+			}
+			return "unknown";
+		};
+
+		file = (f: Entity.File): MegalodonEntity.Attachment => {
+			return {
+				id: f.id,
+				type: this.fileType(f.type),
+				url: f.url,
+				remote_url: f.url,
+				preview_url: f.thumbnailUrl,
+				text_url: f.url,
+				meta: {
+					width: f.properties.width,
+					height: f.properties.height,
+				},
+				description: f.comment,
+				blurhash: f.blurhash,
+			};
+		};
+
+		follower = (f: Entity.Follower): MegalodonEntity.Account => {
+			return this.user(f.follower);
+		};
+
+		following = (f: Entity.Following): MegalodonEntity.Account => {
+			return this.user(f.followee);
+		};
+
+		relation = (r: Entity.Relation): MegalodonEntity.Relationship => {
+			return {
+				id: r.id,
+				following: r.isFollowing,
+				followed_by: r.isFollowed,
+				blocking: r.isBlocking,
+				blocked_by: r.isBlocked,
+				muting: r.isMuted,
+				muting_notifications: false,
+				requested: r.hasPendingFollowRequestFromYou,
+				domain_blocking: false,
+				showing_reblogs: true,
+				endorsed: false,
+				notifying: false,
+			};
+		};
+
+		choice = (c: Entity.Choice): MegalodonEntity.PollOption => {
+			return {
+				title: c.text,
+				votes_count: c.votes,
+			};
+		};
+
+		poll = (p: Entity.Poll, id: string): MegalodonEntity.Poll => {
+			const now = dayjs();
+			const expire = dayjs(p.expiresAt);
+			const count = p.choices.reduce((sum, choice) => sum + choice.votes, 0);
+			return {
+				id: id,
+				expires_at: p.expiresAt,
+				expired: now.isAfter(expire),
+				multiple: p.multiple,
+				votes_count: count,
+				options: p.choices.map((c) => this.choice(c)),
+				voted: p.choices.some((c) => c.isVoted),
+				own_votes: p.choices
+					.filter((c) => c.isVoted)
+					.map((c) => p.choices.indexOf(c)),
+			};
+		};
+
+		note = (n: Entity.Note, host: string): MegalodonEntity.Status => {
+			host = host.replace("https://", "");
+
+			return {
+				id: n.id,
+				uri: n.uri ? n.uri : `https://${host}/notes/${n.id}`,
+				url: n.uri ? n.uri : `https://${host}/notes/${n.id}`,
+				account: this.user(n.user),
+				in_reply_to_id: n.replyId,
+				in_reply_to_account_id: n.reply?.userId ?? null,
+				reblog: n.renote ? this.note(n.renote, host) : null,
+				content: n.text ? this.escapeMFM(n.text) : "",
+				plain_content: n.text ? n.text : null,
+				created_at: n.createdAt,
+				// Remove reaction emojis with names containing @ from the emojis list.
+				emojis: n.emojis
+					.filter((e) => e.name.indexOf("@") === -1)
+					.map((e) => this.emoji(e)),
+				replies_count: n.repliesCount,
+				reblogs_count: n.renoteCount,
+				favourites_count: this.getTotalReactions(n.reactions),
+				reblogged: false,
+				favourited: !!n.myReaction,
+				muted: false,
+				sensitive: n.files ? n.files.some((f) => f.isSensitive) : false,
+				spoiler_text: n.cw ? n.cw : "",
+				visibility: this.visibility(n.visibility),
+				media_attachments: n.files ? n.files.map((f) => this.file(f)) : [],
+				mentions: [],
+				tags: [],
+				card: null,
+				poll: n.poll ? this.poll(n.poll, n.id) : null,
+				application: null,
+				language: null,
+				pinned: null,
+				// Use emojis list to provide URLs for emoji reactions.
+				reactions: this.mapReactions(n.emojis, n.reactions, n.myReaction),
+				bookmarked: false,
+				quote: n.renote && n.text ? this.note(n.renote, host) : null,
+			};
+		};
+
+		mapReactions = (
+			emojis: Array<MisskeyEntity.Emoji>,
+			r: { [key: string]: number },
+			myReaction?: string,
+		): Array<MegalodonEntity.Reaction> => {
+			// Map of emoji shortcodes to image URLs.
+			const emojiUrls = new Map<string, string>(
+				emojis.map((e) => [e.name, e.url]),
+			);
+			return Object.keys(r).map((key) => {
+				// Strip colons from custom emoji reaction names to match emoji shortcodes.
+				const shortcode = key.replaceAll(":", "");
+				// If this is a custom emoji (vs. a Unicode emoji), find its image URL.
+				const url = emojiUrls.get(shortcode);
+				// Finally, remove trailing @. from local custom emoji reaction names.
+				const name = shortcode.replace("@.", "");
+				return {
+					count: r[key],
+					me: key === myReaction,
+					name,
+					url,
+					// We don't actually have a static version of the asset, but clients expect one anyway.
+					static_url: url,
+				};
+			});
+		};
+
+		getTotalReactions = (r: { [key: string]: number }): number => {
+			return Object.values(r).length > 0
+				? Object.values(r).reduce(
+						(previousValue, currentValue) => previousValue + currentValue,
+				  )
+				: 0;
+		};
+
+		reactions = (
+			r: Array<Entity.Reaction>,
+		): Array<MegalodonEntity.Reaction> => {
+			const result: Array<MegalodonEntity.Reaction> = [];
+			for (const e of r) {
+				const i = result.findIndex((res) => res.name === e.type);
+				if (i >= 0) {
+					result[i].count++;
+				} else {
+					result.push({
+						count: 1,
+						me: false,
+						name: e.type,
+					});
+				}
+			}
+			return result;
+		};
+
+		noteToConversation = (
+			n: Entity.Note,
+			host: string,
+		): MegalodonEntity.Conversation => {
+			const accounts: Array<MegalodonEntity.Account> = [this.user(n.user)];
+			if (n.reply) {
+				accounts.push(this.user(n.reply.user));
+			}
+			return {
+				id: n.id,
+				accounts: accounts,
+				last_status: this.note(n, host),
+				unread: false,
+			};
+		};
+
+		list = (l: Entity.List): MegalodonEntity.List => ({
+			id: l.id,
+			title: l.name,
+		});
+
+		encodeNotificationType = (
+			e: MegalodonEntity.NotificationType,
+		): MisskeyEntity.NotificationType => {
+			switch (e) {
+				case NotificationType.Follow:
+					return MisskeyNotificationType.Follow;
+				case NotificationType.Mention:
+					return MisskeyNotificationType.Reply;
+				case NotificationType.Favourite:
+				case NotificationType.Reaction:
+					return MisskeyNotificationType.Reaction;
+				case NotificationType.Reblog:
+					return MisskeyNotificationType.Renote;
+				case NotificationType.Poll:
+					return MisskeyNotificationType.PollEnded;
+				case NotificationType.FollowRequest:
+					return MisskeyNotificationType.ReceiveFollowRequest;
+				default:
+					return e;
+			}
+		};
+
+		decodeNotificationType = (
+			e: MisskeyEntity.NotificationType,
+		): MegalodonEntity.NotificationType => {
+			switch (e) {
+				case MisskeyNotificationType.Follow:
+					return NotificationType.Follow;
+				case MisskeyNotificationType.Mention:
+				case MisskeyNotificationType.Reply:
+					return NotificationType.Mention;
+				case MisskeyNotificationType.Renote:
+				case MisskeyNotificationType.Quote:
+					return NotificationType.Reblog;
+				case MisskeyNotificationType.Reaction:
+					return NotificationType.Reaction;
+				case MisskeyNotificationType.PollEnded:
+					return NotificationType.Poll;
+				case MisskeyNotificationType.ReceiveFollowRequest:
+					return NotificationType.FollowRequest;
+				case MisskeyNotificationType.FollowRequestAccepted:
+					return NotificationType.Follow;
+				default:
+					return e;
+			}
+		};
+
+		announcement = (a: Entity.Announcement): MegalodonEntity.Announcement => ({
+			id: a.id,
+			content: `<h1>${this.escapeMFM(a.title)}</h1>${this.escapeMFM(a.text)}`,
+			starts_at: null,
+			ends_at: null,
+			published: true,
+			all_day: false,
+			published_at: a.createdAt,
+			updated_at: a.updatedAt,
+			read: a.isRead,
+			mentions: [],
+			statuses: [],
+			tags: [],
+			emojis: [],
+			reactions: [],
+		});
+
+		notification = (
+			n: Entity.Notification,
+			host: string,
+		): MegalodonEntity.Notification => {
+			let notification = {
+				id: n.id,
+				account: n.user ? this.user(n.user) : this.modelOfAcct,
+				created_at: n.createdAt,
+				type: this.decodeNotificationType(n.type),
+			};
+			if (n.note) {
+				notification = Object.assign(notification, {
+					status: this.note(n.note, host),
+				});
+				if (notification.type === NotificationType.Poll) {
+					notification = Object.assign(notification, {
+						account: this.note(n.note, host).account,
+					});
+				}
+				if (n.reaction) {
+					notification = Object.assign(notification, {
+						reaction: this.mapReactions(n.note.emojis, { [n.reaction]: 1 })[0],
+					});
+				}
+			}
+			return notification;
+		};
+
+		stats = (s: Entity.Stats): MegalodonEntity.Stats => {
+			return {
+				user_count: s.usersCount,
+				status_count: s.notesCount,
+				domain_count: s.instances,
+			};
+		};
+
+		meta = (m: Entity.Meta, s: Entity.Stats): MegalodonEntity.Instance => {
+			const wss = m.uri.replace(/^https:\/\//, "wss://");
+			return {
+				uri: m.uri,
+				title: m.name,
+				description: m.description,
+				email: m.maintainerEmail,
+				version: m.version,
+				thumbnail: m.bannerUrl,
+				urls: {
+					streaming_api: `${wss}/streaming`,
+				},
+				stats: this.stats(s),
+				languages: m.langs,
+				contact_account: null,
+				max_toot_chars: m.maxNoteTextLength,
+				registrations: !m.disableRegistration,
+			};
+		};
+
+		hashtag = (h: Entity.Hashtag): MegalodonEntity.Tag => {
+			return {
+				name: h.tag,
+				url: h.tag,
+				history: null,
+				following: false,
+			};
+		};
+	}
+
+	export const DEFAULT_SCOPE = [
+		"read:account",
+		"write:account",
+		"read:blocks",
+		"write:blocks",
+		"read:drive",
+		"write:drive",
+		"read:favorites",
+		"write:favorites",
+		"read:following",
+		"write:following",
+		"read:mutes",
+		"write:mutes",
+		"write:notes",
+		"read:notifications",
+		"write:notifications",
+		"read:reactions",
+		"write:reactions",
+		"write:votes",
+	];
+
+	/**
+	 * Interface
+	 */
+	export interface Interface {
+		post<T = any>(
+			path: string,
+			params?: any,
+			headers?: { [key: string]: string },
+		): Promise<Response<T>>;
+		cancel(): void;
+		socket(
+			channel:
+				| "user"
+				| "localTimeline"
+				| "hybridTimeline"
+				| "globalTimeline"
+				| "conversation"
+				| "list",
+			listId?: string,
+		): WebSocket;
+	}
+
+	/**
+	 * Misskey API client.
+	 *
+	 * Usign axios for request, you will handle promises.
+	 */
+	export class Client implements Interface {
+		private accessToken: string | null;
+		private baseUrl: string;
+		private userAgent: string;
+		private abortController: AbortController;
+		private proxyConfig: ProxyConfig | false = false;
+		private converter: Converter;
+
+		/**
+		 * @param baseUrl hostname or base URL
+		 * @param accessToken access token from OAuth2 authorization
+		 * @param userAgent UserAgent is specified in header on request.
+		 * @param proxyConfig Proxy setting, or set false if don't use proxy.
+		 * @param converter Converter instance.
+		 */
+		constructor(
+			baseUrl: string,
+			accessToken: string | null,
+			userAgent: string = DEFAULT_UA,
+			proxyConfig: ProxyConfig | false = false,
+			converter: Converter,
+		) {
+			this.accessToken = accessToken;
+			this.baseUrl = baseUrl;
+			this.userAgent = userAgent;
+			this.proxyConfig = proxyConfig;
+			this.abortController = new AbortController();
+			this.converter = converter;
+			axios.defaults.signal = this.abortController.signal;
+		}
+
+		/**
+		 * POST request to mastodon REST API.
+		 * @param path relative path from baseUrl
+		 * @param params Form data
+		 * @param headers Request header object
+		 */
+		public async post<T>(
+			path: string,
+			params: any = {},
+			headers: { [key: string]: string } = {},
+		): Promise<Response<T>> {
+			let options: AxiosRequestConfig = {
+				headers: headers,
+				maxContentLength: Infinity,
+				maxBodyLength: Infinity,
+			};
+			if (this.proxyConfig) {
+				options = Object.assign(options, {
+					httpAgent: proxyAgent(this.proxyConfig),
+					httpsAgent: proxyAgent(this.proxyConfig),
+				});
+			}
+			let bodyParams = params;
+			if (this.accessToken) {
+				if (params instanceof FormData) {
+					bodyParams.append("i", this.accessToken);
+				} else {
+					bodyParams = Object.assign(params, {
+						i: this.accessToken,
+					});
+				}
+			}
+
+			return axios
+				.post<T>(this.baseUrl + path, bodyParams, options)
+				.then((resp: AxiosResponse<T>) => {
+					const res: Response<T> = {
+						data: resp.data,
+						status: resp.status,
+						statusText: resp.statusText,
+						headers: resp.headers,
+					};
+					return res;
+				});
+		}
+
+		/**
+		 * Cancel all requests in this instance.
+		 * @returns void
+		 */
+		public cancel(): void {
+			return this.abortController.abort();
+		}
+
+		/**
+		 * Get connection and receive websocket connection for Misskey API.
+		 *
+		 * @param channel Channel name is user, localTimeline, hybridTimeline, globalTimeline, conversation or list.
+		 * @param listId This parameter is required only list channel.
+		 */
+		public socket(
+			channel:
+				| "user"
+				| "localTimeline"
+				| "hybridTimeline"
+				| "globalTimeline"
+				| "conversation"
+				| "list",
+			listId?: string,
+		): WebSocket {
+			if (!this.accessToken) {
+				throw new Error("accessToken is required");
+			}
+			const url = `${this.baseUrl}/streaming`;
+			const streaming = new WebSocket(
+				url,
+				channel,
+				this.accessToken,
+				listId,
+				this.userAgent,
+				this.proxyConfig,
+				this.converter,
+			);
+			process.nextTick(() => {
+				streaming.start();
+			});
+			return streaming;
+		}
+	}
+}
+
+export default MisskeyAPI;
diff --git a/packages/megalodon/src/misskey/entities/GetAll.ts b/packages/megalodon/src/misskey/entities/GetAll.ts
new file mode 100644
index 0000000000..94ace2f184
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/GetAll.ts
@@ -0,0 +1,6 @@
+namespace MisskeyEntity {
+	export type GetAll = {
+		tutorial: number;
+		defaultNoteVisibility: "public" | "home" | "followers" | "specified";
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/announcement.ts b/packages/megalodon/src/misskey/entities/announcement.ts
new file mode 100644
index 0000000000..7594ba7efc
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/announcement.ts
@@ -0,0 +1,10 @@
+namespace MisskeyEntity {
+	export type Announcement = {
+		id: string;
+		createdAt: string;
+		updatedAt: string;
+		text: string;
+		title: string;
+		isRead?: boolean;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/app.ts b/packages/megalodon/src/misskey/entities/app.ts
new file mode 100644
index 0000000000..5924060d81
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/app.ts
@@ -0,0 +1,9 @@
+namespace MisskeyEntity {
+	export type App = {
+		id: string;
+		name: string;
+		callbackUrl: string;
+		permission: Array<string>;
+		secret: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/blocking.ts b/packages/megalodon/src/misskey/entities/blocking.ts
new file mode 100644
index 0000000000..3e56790a7b
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/blocking.ts
@@ -0,0 +1,10 @@
+/// <reference path="userDetail.ts" />
+
+namespace MisskeyEntity {
+	export type Blocking = {
+		id: string;
+		createdAt: string;
+		blockeeId: string;
+		blockee: UserDetail;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/createdNote.ts b/packages/megalodon/src/misskey/entities/createdNote.ts
new file mode 100644
index 0000000000..235f7063fb
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/createdNote.ts
@@ -0,0 +1,7 @@
+/// <reference path="note.ts" />
+
+namespace MisskeyEntity {
+	export type CreatedNote = {
+		createdNote: Note;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/emoji.ts b/packages/megalodon/src/misskey/entities/emoji.ts
new file mode 100644
index 0000000000..d320760e91
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/emoji.ts
@@ -0,0 +1,9 @@
+namespace MisskeyEntity {
+	export type Emoji = {
+		name: string;
+		host: string | null;
+		url: string;
+		aliases: Array<string>;
+		category: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/favorite.ts b/packages/megalodon/src/misskey/entities/favorite.ts
new file mode 100644
index 0000000000..ba948f2e73
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/favorite.ts
@@ -0,0 +1,10 @@
+/// <reference path="note.ts" />
+
+namespace MisskeyEntity {
+	export type Favorite = {
+		id: string;
+		createdAt: string;
+		noteId: string;
+		note: Note;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/field.ts b/packages/megalodon/src/misskey/entities/field.ts
new file mode 100644
index 0000000000..8bbb2d7c42
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/field.ts
@@ -0,0 +1,7 @@
+namespace MisskeyEntity {
+	export type Field = {
+		name: string;
+		value: string;
+		verified?: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/file.ts b/packages/megalodon/src/misskey/entities/file.ts
new file mode 100644
index 0000000000..e823dde1be
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/file.ts
@@ -0,0 +1,20 @@
+namespace MisskeyEntity {
+	export type File = {
+		id: string;
+		createdAt: string;
+		name: string;
+		type: string;
+		md5: string;
+		size: number;
+		isSensitive: boolean;
+		properties: {
+			width: number;
+			height: number;
+			avgColor: string;
+		};
+		url: string;
+		thumbnailUrl: string;
+		comment: string;
+		blurhash: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/followRequest.ts b/packages/megalodon/src/misskey/entities/followRequest.ts
new file mode 100644
index 0000000000..60bd0e0abc
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/followRequest.ts
@@ -0,0 +1,9 @@
+/// <reference path="user.ts" />
+
+namespace MisskeyEntity {
+	export type FollowRequest = {
+		id: string;
+		follower: User;
+		followee: User;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/follower.ts b/packages/megalodon/src/misskey/entities/follower.ts
new file mode 100644
index 0000000000..34ae825519
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/follower.ts
@@ -0,0 +1,11 @@
+/// <reference path="userDetail.ts" />
+
+namespace MisskeyEntity {
+	export type Follower = {
+		id: string;
+		createdAt: string;
+		followeeId: string;
+		followerId: string;
+		follower: UserDetail;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/following.ts b/packages/megalodon/src/misskey/entities/following.ts
new file mode 100644
index 0000000000..6cbc8f1c39
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/following.ts
@@ -0,0 +1,11 @@
+/// <reference path="userDetail.ts" />
+
+namespace MisskeyEntity {
+	export type Following = {
+		id: string;
+		createdAt: string;
+		followeeId: string;
+		followerId: string;
+		followee: UserDetail;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/hashtag.ts b/packages/megalodon/src/misskey/entities/hashtag.ts
new file mode 100644
index 0000000000..3ec4d6675b
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/hashtag.ts
@@ -0,0 +1,7 @@
+namespace MisskeyEntity {
+	export type Hashtag = {
+		tag: string;
+		chart: Array<number>;
+		usersCount: number;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/list.ts b/packages/megalodon/src/misskey/entities/list.ts
new file mode 100644
index 0000000000..60706592a4
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/list.ts
@@ -0,0 +1,8 @@
+namespace MisskeyEntity {
+	export type List = {
+		id: string;
+		createdAt: string;
+		name: string;
+		userIds: Array<string>;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/meta.ts b/packages/megalodon/src/misskey/entities/meta.ts
new file mode 100644
index 0000000000..97827fe8fd
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/meta.ts
@@ -0,0 +1,18 @@
+/// <reference path="emoji.ts" />
+
+namespace MisskeyEntity {
+	export type Meta = {
+		maintainerName: string;
+		maintainerEmail: string;
+		name: string;
+		version: string;
+		uri: string;
+		description: string;
+		langs: Array<string>;
+		disableRegistration: boolean;
+		disableLocalTimeline: boolean;
+		bannerUrl: string;
+		maxNoteTextLength: 3000;
+		emojis: Array<Emoji>;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/mute.ts b/packages/megalodon/src/misskey/entities/mute.ts
new file mode 100644
index 0000000000..7975b3d315
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/mute.ts
@@ -0,0 +1,10 @@
+/// <reference path="userDetail.ts" />
+
+namespace MisskeyEntity {
+	export type Mute = {
+		id: string;
+		createdAt: string;
+		muteeId: string;
+		mutee: UserDetail;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/note.ts b/packages/megalodon/src/misskey/entities/note.ts
new file mode 100644
index 0000000000..64a0a50785
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/note.ts
@@ -0,0 +1,32 @@
+/// <reference path="user.ts" />
+/// <reference path="emoji.ts" />
+/// <reference path="file.ts" />
+/// <reference path="poll.ts" />
+
+namespace MisskeyEntity {
+	export type Note = {
+		id: string;
+		createdAt: string;
+		userId: string;
+		user: User;
+		text: string | null;
+		cw: string | null;
+		visibility: "public" | "home" | "followers" | "specified";
+		renoteCount: number;
+		repliesCount: number;
+		reactions: { [key: string]: number };
+		emojis: Array<Emoji>;
+		fileIds: Array<string>;
+		files: Array<File>;
+		replyId: string | null;
+		renoteId: string | null;
+		uri?: string;
+		reply?: Note;
+		renote?: Note;
+		viaMobile?: boolean;
+		tags?: Array<string>;
+		poll?: Poll;
+		mentions?: Array<string>;
+		myReaction?: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/notification.ts b/packages/megalodon/src/misskey/entities/notification.ts
new file mode 100644
index 0000000000..7ecb911537
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/notification.ts
@@ -0,0 +1,17 @@
+/// <reference path="user.ts" />
+/// <reference path="note.ts" />
+
+namespace MisskeyEntity {
+	export type Notification = {
+		id: string;
+		createdAt: string;
+		// https://github.com/syuilo/misskey/blob/056942391aee135eb6c77aaa63f6ed5741d701a6/src/models/entities/notification.ts#L50-L62
+		type: NotificationType;
+		userId: string;
+		user: User;
+		note?: Note;
+		reaction?: string;
+	};
+
+	export type NotificationType = string;
+}
diff --git a/packages/megalodon/src/misskey/entities/poll.ts b/packages/megalodon/src/misskey/entities/poll.ts
new file mode 100644
index 0000000000..9f6bfa40d2
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/poll.ts
@@ -0,0 +1,13 @@
+namespace MisskeyEntity {
+	export type Choice = {
+		text: string;
+		votes: number;
+		isVoted: boolean;
+	};
+
+	export type Poll = {
+		multiple: boolean;
+		expiresAt: string;
+		choices: Array<Choice>;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/reaction.ts b/packages/megalodon/src/misskey/entities/reaction.ts
new file mode 100644
index 0000000000..b35a25bfb5
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/reaction.ts
@@ -0,0 +1,11 @@
+/// <reference path="user.ts" />
+
+namespace MisskeyEntity {
+	export type Reaction = {
+		id: string;
+		createdAt: string;
+		user: User;
+		url?: string;
+		type: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/relation.ts b/packages/megalodon/src/misskey/entities/relation.ts
new file mode 100644
index 0000000000..6db4a1b167
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/relation.ts
@@ -0,0 +1,12 @@
+namespace MisskeyEntity {
+	export type Relation = {
+		id: string;
+		isFollowing: boolean;
+		hasPendingFollowRequestFromYou: boolean;
+		hasPendingFollowRequestToYou: boolean;
+		isFollowed: boolean;
+		isBlocking: boolean;
+		isBlocked: boolean;
+		isMuted: boolean;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/session.ts b/packages/megalodon/src/misskey/entities/session.ts
new file mode 100644
index 0000000000..572333ff0b
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/session.ts
@@ -0,0 +1,6 @@
+namespace MisskeyEntity {
+	export type Session = {
+		token: string;
+		url: string;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/state.ts b/packages/megalodon/src/misskey/entities/state.ts
new file mode 100644
index 0000000000..62d60ce282
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/state.ts
@@ -0,0 +1,7 @@
+namespace MisskeyEntity {
+	export type State = {
+		isFavorited: boolean;
+		isMutedThread: boolean;
+		isWatching: boolean;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/stats.ts b/packages/megalodon/src/misskey/entities/stats.ts
new file mode 100644
index 0000000000..9832a0ad8a
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/stats.ts
@@ -0,0 +1,9 @@
+namespace MisskeyEntity {
+	export type Stats = {
+		notesCount: number;
+		originalNotesCount: number;
+		usersCount: number;
+		originalUsersCount: number;
+		instances: number;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/user.ts b/packages/megalodon/src/misskey/entities/user.ts
new file mode 100644
index 0000000000..96610f6e6d
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/user.ts
@@ -0,0 +1,13 @@
+/// <reference path="emoji.ts" />
+
+namespace MisskeyEntity {
+	export type User = {
+		id: string;
+		name: string;
+		username: string;
+		host: string | null;
+		avatarUrl: string;
+		avatarColor: string;
+		emojis: Array<Emoji>;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/userDetail.ts b/packages/megalodon/src/misskey/entities/userDetail.ts
new file mode 100644
index 0000000000..0f5bd5f644
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/userDetail.ts
@@ -0,0 +1,34 @@
+/// <reference path="emoji.ts" />
+/// <reference path="field.ts" />
+/// <reference path="note.ts" />
+
+namespace MisskeyEntity {
+	export type UserDetail = {
+		id: string;
+		name: string;
+		username: string;
+		host: string | null;
+		avatarUrl: string;
+		avatarColor: string;
+		isAdmin: boolean;
+		isModerator: boolean;
+		isBot: boolean;
+		isCat: boolean;
+		emojis: Array<Emoji>;
+		createdAt: string;
+		bannerUrl: string;
+		bannerColor: string;
+		isLocked: boolean;
+		isSilenced: boolean;
+		isSuspended: boolean;
+		description: string;
+		followersCount: number;
+		followingCount: number;
+		notesCount: number;
+		avatarId: string;
+		bannerId: string;
+		pinnedNoteIds?: Array<string>;
+		pinnedNotes?: Array<Note>;
+		fields: Array<Field>;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/userDetailMe.ts b/packages/megalodon/src/misskey/entities/userDetailMe.ts
new file mode 100644
index 0000000000..272e65ffa4
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/userDetailMe.ts
@@ -0,0 +1,36 @@
+/// <reference path="emoji.ts" />
+/// <reference path="field.ts" />
+/// <reference path="note.ts" />
+
+namespace MisskeyEntity {
+	export type UserDetailMe = {
+		id: string;
+		name: string;
+		username: string;
+		host: string | null;
+		avatarUrl: string;
+		avatarColor: string;
+		isAdmin: boolean;
+		isModerator: boolean;
+		isBot: boolean;
+		isCat: boolean;
+		emojis: Array<Emoji>;
+		createdAt: string;
+		bannerUrl: string;
+		bannerColor: string;
+		isLocked: boolean;
+		isSilenced: boolean;
+		isSuspended: boolean;
+		description: string;
+		followersCount: number;
+		followingCount: number;
+		notesCount: number;
+		avatarId: string;
+		bannerId: string;
+		pinnedNoteIds?: Array<string>;
+		pinnedNotes?: Array<Note>;
+		fields: Array<Field>;
+		alwaysMarkNsfw: boolean;
+		lang: string | null;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entities/userkey.ts b/packages/megalodon/src/misskey/entities/userkey.ts
new file mode 100644
index 0000000000..921af65536
--- /dev/null
+++ b/packages/megalodon/src/misskey/entities/userkey.ts
@@ -0,0 +1,8 @@
+/// <reference path="user.ts" />
+
+namespace MisskeyEntity {
+	export type UserKey = {
+		accessToken: string;
+		user: User;
+	};
+}
diff --git a/packages/megalodon/src/misskey/entity.ts b/packages/megalodon/src/misskey/entity.ts
new file mode 100644
index 0000000000..72a80f9d96
--- /dev/null
+++ b/packages/megalodon/src/misskey/entity.ts
@@ -0,0 +1,28 @@
+/// <reference path="entities/app.ts" />
+/// <reference path="entities/announcement.ts" />
+/// <reference path="entities/blocking.ts" />
+/// <reference path="entities/createdNote.ts" />
+/// <reference path="entities/emoji.ts" />
+/// <reference path="entities/favorite.ts" />
+/// <reference path="entities/field.ts" />
+/// <reference path="entities/file.ts" />
+/// <reference path="entities/follower.ts" />
+/// <reference path="entities/following.ts" />
+/// <reference path="entities/followRequest.ts" />
+/// <reference path="entities/hashtag.ts" />
+/// <reference path="entities/list.ts" />
+/// <reference path="entities/meta.ts" />
+/// <reference path="entities/mute.ts" />
+/// <reference path="entities/note.ts" />
+/// <reference path="entities/notification.ts" />
+/// <reference path="entities/poll.ts" />
+/// <reference path="entities/reaction.ts" />
+/// <reference path="entities/relation.ts" />
+/// <reference path="entities/user.ts" />
+/// <reference path="entities/userDetail.ts" />
+/// <reference path="entities/userDetailMe.ts" />
+/// <reference path="entities/userkey.ts" />
+/// <reference path="entities/session.ts" />
+/// <reference path="entities/stats.ts" />
+
+export default MisskeyEntity;
diff --git a/packages/megalodon/src/misskey/notification.ts b/packages/megalodon/src/misskey/notification.ts
new file mode 100644
index 0000000000..eb7c2d23d8
--- /dev/null
+++ b/packages/megalodon/src/misskey/notification.ts
@@ -0,0 +1,18 @@
+import MisskeyEntity from "./entity";
+
+namespace MisskeyNotificationType {
+	export const Follow: MisskeyEntity.NotificationType = "follow";
+	export const Mention: MisskeyEntity.NotificationType = "mention";
+	export const Reply: MisskeyEntity.NotificationType = "reply";
+	export const Renote: MisskeyEntity.NotificationType = "renote";
+	export const Quote: MisskeyEntity.NotificationType = "quote";
+	export const Reaction: MisskeyEntity.NotificationType = "favourite";
+	export const PollEnded: MisskeyEntity.NotificationType = "pollEnded";
+	export const ReceiveFollowRequest: MisskeyEntity.NotificationType =
+		"receiveFollowRequest";
+	export const FollowRequestAccepted: MisskeyEntity.NotificationType =
+		"followRequestAccepted";
+	export const GroupInvited: MisskeyEntity.NotificationType = "groupInvited";
+}
+
+export default MisskeyNotificationType;
diff --git a/packages/megalodon/src/misskey/web_socket.ts b/packages/megalodon/src/misskey/web_socket.ts
new file mode 100644
index 0000000000..677f2049d3
--- /dev/null
+++ b/packages/megalodon/src/misskey/web_socket.ts
@@ -0,0 +1,458 @@
+import WS from "ws";
+import dayjs, { Dayjs } from "dayjs";
+import { v4 as uuid } from "uuid";
+import { EventEmitter } from "events";
+import { WebSocketInterface } from "../megalodon";
+import proxyAgent, { ProxyConfig } from "../proxy_config";
+import MisskeyAPI from "./api_client";
+
+/**
+ * WebSocket
+ * Misskey is not support http streaming. It supports websocket instead of streaming.
+ * So this class connect to Misskey server with WebSocket.
+ */
+export default class WebSocket
+	extends EventEmitter
+	implements WebSocketInterface
+{
+	public url: string;
+	public channel:
+		| "user"
+		| "localTimeline"
+		| "hybridTimeline"
+		| "globalTimeline"
+		| "conversation"
+		| "list";
+	public parser: any;
+	public headers: { [key: string]: string };
+	public proxyConfig: ProxyConfig | false = false;
+	public listId: string | null = null;
+	private _converter: MisskeyAPI.Converter;
+	private _accessToken: string;
+	private _reconnectInterval: number;
+	private _reconnectMaxAttempts: number;
+	private _reconnectCurrentAttempts: number;
+	private _connectionClosed: boolean;
+	private _client: WS | null = null;
+	private _channelID: string;
+	private _pongReceivedTimestamp: Dayjs;
+	private _heartbeatInterval = 60000;
+	private _pongWaiting = false;
+
+	/**
+	 * @param url Full url of websocket: e.g. wss://firefish.io/streaming
+	 * @param channel Channel name is user, localTimeline, hybridTimeline, globalTimeline, conversation or list.
+	 * @param accessToken The access token.
+	 * @param listId This parameter is required when you specify list as channel.
+	 */
+	constructor(
+		url: string,
+		channel:
+			| "user"
+			| "localTimeline"
+			| "hybridTimeline"
+			| "globalTimeline"
+			| "conversation"
+			| "list",
+		accessToken: string,
+		listId: string | undefined,
+		userAgent: string,
+		proxyConfig: ProxyConfig | false = false,
+		converter: MisskeyAPI.Converter,
+	) {
+		super();
+		this.url = url;
+		this.parser = new Parser();
+		this.channel = channel;
+		this.headers = {
+			"User-Agent": userAgent,
+		};
+		if (listId === undefined) {
+			this.listId = null;
+		} else {
+			this.listId = listId;
+		}
+		this.proxyConfig = proxyConfig;
+		this._accessToken = accessToken;
+		this._reconnectInterval = 10000;
+		this._reconnectMaxAttempts = Infinity;
+		this._reconnectCurrentAttempts = 0;
+		this._connectionClosed = false;
+		this._channelID = uuid();
+		this._pongReceivedTimestamp = dayjs();
+		this._converter = converter;
+	}
+
+	/**
+	 * Start websocket connection.
+	 */
+	public start() {
+		this._connectionClosed = false;
+		this._resetRetryParams();
+		this._startWebSocketConnection();
+	}
+
+	private baseUrlToHost(baseUrl: string): string {
+		return baseUrl.replace("https://", "");
+	}
+
+	/**
+	 * Reset connection and start new websocket connection.
+	 */
+	private _startWebSocketConnection() {
+		this._resetConnection();
+		this._setupParser();
+		this._client = this._connect();
+		this._bindSocket(this._client);
+	}
+
+	/**
+	 * Stop current connection.
+	 */
+	public stop() {
+		this._connectionClosed = true;
+		this._resetConnection();
+		this._resetRetryParams();
+	}
+
+	/**
+	 * Clean up current connection, and listeners.
+	 */
+	private _resetConnection() {
+		if (this._client) {
+			this._client.close(1000);
+			this._client.removeAllListeners();
+			this._client = null;
+		}
+
+		if (this.parser) {
+			this.parser.removeAllListeners();
+		}
+	}
+
+	/**
+	 * Resets the parameters used in reconnect.
+	 */
+	private _resetRetryParams() {
+		this._reconnectCurrentAttempts = 0;
+	}
+
+	/**
+	 * Connect to the endpoint.
+	 */
+	private _connect(): WS {
+		let options: WS.ClientOptions = {
+			headers: this.headers,
+		};
+		if (this.proxyConfig) {
+			options = Object.assign(options, {
+				agent: proxyAgent(this.proxyConfig),
+			});
+		}
+		const cli: WS = new WS(`${this.url}?i=${this._accessToken}`, options);
+		return cli;
+	}
+
+	/**
+	 * Connect specified channels in websocket.
+	 */
+	private _channel() {
+		if (!this._client) {
+			return;
+		}
+		switch (this.channel) {
+			case "conversation":
+				this._client.send(
+					JSON.stringify({
+						type: "connect",
+						body: {
+							channel: "main",
+							id: this._channelID,
+						},
+					}),
+				);
+				break;
+			case "user":
+				this._client.send(
+					JSON.stringify({
+						type: "connect",
+						body: {
+							channel: "main",
+							id: this._channelID,
+						},
+					}),
+				);
+				this._client.send(
+					JSON.stringify({
+						type: "connect",
+						body: {
+							channel: "homeTimeline",
+							id: this._channelID,
+						},
+					}),
+				);
+				break;
+			case "list":
+				this._client.send(
+					JSON.stringify({
+						type: "connect",
+						body: {
+							channel: "userList",
+							id: this._channelID,
+							params: {
+								listId: this.listId,
+							},
+						},
+					}),
+				);
+				break;
+			default:
+				this._client.send(
+					JSON.stringify({
+						type: "connect",
+						body: {
+							channel: this.channel,
+							id: this._channelID,
+						},
+					}),
+				);
+				break;
+		}
+	}
+
+	/**
+	 * Reconnects to the same endpoint.
+	 */
+
+	private _reconnect() {
+		setTimeout(() => {
+			// Skip reconnect when client is connecting.
+			// https://github.com/websockets/ws/blob/7.2.1/lib/websocket.js#L365
+			if (this._client && this._client.readyState === WS.CONNECTING) {
+				return;
+			}
+
+			if (this._reconnectCurrentAttempts < this._reconnectMaxAttempts) {
+				this._reconnectCurrentAttempts++;
+				this._clearBinding();
+				if (this._client) {
+					// In reconnect, we want to close the connection immediately,
+					// because recoonect is necessary when some problems occur.
+					this._client.terminate();
+				}
+				// Call connect methods
+				console.log("Reconnecting");
+				this._client = this._connect();
+				this._bindSocket(this._client);
+			}
+		}, this._reconnectInterval);
+	}
+
+	/**
+	 * Clear binding event for websocket client.
+	 */
+	private _clearBinding() {
+		if (this._client) {
+			this._client.removeAllListeners("close");
+			this._client.removeAllListeners("pong");
+			this._client.removeAllListeners("open");
+			this._client.removeAllListeners("message");
+			this._client.removeAllListeners("error");
+		}
+	}
+
+	/**
+	 * Bind event for web socket client.
+	 * @param client A WebSocket instance.
+	 */
+	private _bindSocket(client: WS) {
+		client.on("close", (code: number, _reason: Buffer) => {
+			if (code === 1000) {
+				this.emit("close", {});
+			} else {
+				console.log(`Closed connection with ${code}`);
+				if (!this._connectionClosed) {
+					this._reconnect();
+				}
+			}
+		});
+		client.on("pong", () => {
+			this._pongWaiting = false;
+			this.emit("pong", {});
+			this._pongReceivedTimestamp = dayjs();
+			// It is required to anonymous function since get this scope in checkAlive.
+			setTimeout(
+				() => this._checkAlive(this._pongReceivedTimestamp),
+				this._heartbeatInterval,
+			);
+		});
+		client.on("open", () => {
+			this.emit("connect", {});
+			this._channel();
+			// Call first ping event.
+			setTimeout(() => {
+				client.ping("");
+			}, 10000);
+		});
+		client.on("message", (data: WS.Data, isBinary: boolean) => {
+			this.parser.parse(data, isBinary, this._channelID);
+		});
+		client.on("error", (err: Error) => {
+			this.emit("error", err);
+		});
+	}
+
+	/**
+	 * Set up parser when receive message.
+	 */
+	private _setupParser() {
+		this.parser.on("update", (note: MisskeyAPI.Entity.Note) => {
+			this.emit(
+				"update",
+				this._converter.note(note, this.baseUrlToHost(this.url)),
+			);
+		});
+		this.parser.on(
+			"notification",
+			(notification: MisskeyAPI.Entity.Notification) => {
+				this.emit(
+					"notification",
+					this._converter.notification(
+						notification,
+						this.baseUrlToHost(this.url),
+					),
+				);
+			},
+		);
+		this.parser.on("conversation", (note: MisskeyAPI.Entity.Note) => {
+			this.emit(
+				"conversation",
+				this._converter.noteToConversation(note, this.baseUrlToHost(this.url)),
+			);
+		});
+		this.parser.on("error", (err: Error) => {
+			this.emit("parser-error", err);
+		});
+	}
+
+	/**
+	 * Call ping and wait to pong.
+	 */
+	private _checkAlive(timestamp: Dayjs) {
+		const now: Dayjs = dayjs();
+		// Block multiple calling, if multiple pong event occur.
+		// It the duration is less than interval, through ping.
+		if (
+			now.diff(timestamp) > this._heartbeatInterval - 1000 &&
+			!this._connectionClosed
+		) {
+			// Skip ping when client is connecting.
+			// https://github.com/websockets/ws/blob/7.2.1/lib/websocket.js#L289
+			if (this._client && this._client.readyState !== WS.CONNECTING) {
+				this._pongWaiting = true;
+				this._client.ping("");
+				setTimeout(() => {
+					if (this._pongWaiting) {
+						this._pongWaiting = false;
+						this._reconnect();
+					}
+				}, 10000);
+			}
+		}
+	}
+}
+
+/**
+ * Parser
+ * This class provides parser for websocket message.
+ */
+export class Parser extends EventEmitter {
+	/**
+	 * @param message Message body of websocket.
+	 * @param channelID Parse only messages which has same channelID.
+	 */
+	public parse(data: WS.Data, isBinary: boolean, channelID: string) {
+		const message = isBinary ? data : data.toString();
+		if (typeof message !== "string") {
+			this.emit("heartbeat", {});
+			return;
+		}
+
+		if (message === "") {
+			this.emit("heartbeat", {});
+			return;
+		}
+
+		let obj: {
+			type: string;
+			body: {
+				id: string;
+				type: string;
+				body: any;
+			};
+		};
+		let body: {
+			id: string;
+			type: string;
+			body: any;
+		};
+
+		try {
+			obj = JSON.parse(message);
+			if (obj.type !== "channel") {
+				return;
+			}
+			if (!obj.body) {
+				return;
+			}
+			body = obj.body;
+			if (body.id !== channelID) {
+				return;
+			}
+		} catch (err) {
+			this.emit(
+				"error",
+				new Error(
+					`Error parsing websocket reply: ${message}, error message: ${err}`,
+				),
+			);
+			return;
+		}
+
+		switch (body.type) {
+			case "note":
+				this.emit("update", body.body as MisskeyAPI.Entity.Note);
+				break;
+			case "notification":
+				this.emit("notification", body.body as MisskeyAPI.Entity.Notification);
+				break;
+			case "mention": {
+				const note = body.body as MisskeyAPI.Entity.Note;
+				if (note.visibility === "specified") {
+					this.emit("conversation", note);
+				}
+				break;
+			}
+			// When renote and followed event, the same notification will be received.
+			case "renote":
+			case "followed":
+			case "follow":
+			case "unfollow":
+			case "receiveFollowRequest":
+			case "meUpdated":
+			case "readAllNotifications":
+			case "readAllUnreadSpecifiedNotes":
+			case "readAllAntennas":
+			case "readAllUnreadMentions":
+			case "unreadNotification":
+				// Ignore these events
+				break;
+			default:
+				this.emit(
+					"error",
+					new Error(`Unknown event has received: ${JSON.stringify(body)}`),
+				);
+				break;
+		}
+	}
+}
diff --git a/packages/megalodon/src/notification.ts b/packages/megalodon/src/notification.ts
new file mode 100644
index 0000000000..84cd23e40d
--- /dev/null
+++ b/packages/megalodon/src/notification.ts
@@ -0,0 +1,14 @@
+import Entity from "./entity";
+
+namespace NotificationType {
+	export const Follow: Entity.NotificationType = "follow";
+	export const Favourite: Entity.NotificationType = "favourite";
+	export const Reblog: Entity.NotificationType = "reblog";
+	export const Mention: Entity.NotificationType = "mention";
+	export const Reaction: Entity.NotificationType = "reaction";
+	export const FollowRequest: Entity.NotificationType = "follow_request";
+	export const Status: Entity.NotificationType = "status";
+	export const Poll: Entity.NotificationType = "poll";
+}
+
+export default NotificationType;
diff --git a/packages/megalodon/src/oauth.ts b/packages/megalodon/src/oauth.ts
new file mode 100644
index 0000000000..f0df721f0a
--- /dev/null
+++ b/packages/megalodon/src/oauth.ts
@@ -0,0 +1,123 @@
+/**
+ * OAuth
+ * Response data when oauth request.
+ **/
+namespace OAuth {
+	export type AppDataFromServer = {
+		id: string;
+		name: string;
+		website: string | null;
+		redirect_uri: string;
+		client_id: string;
+		client_secret: string;
+	};
+
+	export type TokenDataFromServer = {
+		access_token: string;
+		token_type: string;
+		scope: string;
+		created_at: number;
+		expires_in: number | null;
+		refresh_token: string | null;
+	};
+
+	export class AppData {
+		public url: string | null;
+		public session_token: string | null;
+		constructor(
+			public id: string,
+			public name: string,
+			public website: string | null,
+			public redirect_uri: string,
+			public client_id: string,
+			public client_secret: string,
+		) {
+			this.url = null;
+			this.session_token = null;
+		}
+
+		/**
+		 * Serialize raw application data from server
+		 * @param raw from server
+		 */
+		static from(raw: AppDataFromServer) {
+			return new this(
+				raw.id,
+				raw.name,
+				raw.website,
+				raw.redirect_uri,
+				raw.client_id,
+				raw.client_secret,
+			);
+		}
+
+		get redirectUri() {
+			return this.redirect_uri;
+		}
+		get clientId() {
+			return this.client_id;
+		}
+		get clientSecret() {
+			return this.client_secret;
+		}
+	}
+
+	export class TokenData {
+		public _scope: string;
+		constructor(
+			public access_token: string,
+			public token_type: string,
+			scope: string,
+			public created_at: number,
+			public expires_in: number | null = null,
+			public refresh_token: string | null = null,
+		) {
+			this._scope = scope;
+		}
+
+		/**
+		 * Serialize raw token data from server
+		 * @param raw from server
+		 */
+		static from(raw: TokenDataFromServer) {
+			return new this(
+				raw.access_token,
+				raw.token_type,
+				raw.scope,
+				raw.created_at,
+				raw.expires_in,
+				raw.refresh_token,
+			);
+		}
+
+		/**
+		 * OAuth Aceess Token
+		 */
+		get accessToken() {
+			return this.access_token;
+		}
+		get tokenType() {
+			return this.token_type;
+		}
+		get scope() {
+			return this._scope;
+		}
+		/**
+		 * Application ID
+		 */
+		get createdAt() {
+			return this.created_at;
+		}
+		get expiresIn() {
+			return this.expires_in;
+		}
+		/**
+		 * OAuth Refresh Token
+		 */
+		get refreshToken() {
+			return this.refresh_token;
+		}
+	}
+}
+
+export default OAuth;
diff --git a/packages/megalodon/src/parser.ts b/packages/megalodon/src/parser.ts
new file mode 100644
index 0000000000..2ddf2ac2e6
--- /dev/null
+++ b/packages/megalodon/src/parser.ts
@@ -0,0 +1,94 @@
+import { EventEmitter } from "events";
+import Entity from "./entity";
+
+/**
+ * Parser
+ * Parse response data in streaming.
+ **/
+export class Parser extends EventEmitter {
+	private message: string;
+
+	constructor() {
+		super();
+		this.message = "";
+	}
+
+	public parse(chunk: string) {
+		// skip heartbeats
+		if (chunk === ":thump\n") {
+			this.emit("heartbeat", {});
+			return;
+		}
+
+		this.message += chunk;
+		chunk = this.message;
+
+		const size: number = chunk.length;
+		let start = 0;
+		let offset = 0;
+		let curr: string | undefined;
+		let next: string | undefined;
+
+		while (offset < size) {
+			curr = chunk[offset];
+			next = chunk[offset + 1];
+
+			if (curr === "\n" && next === "\n") {
+				const piece: string = chunk.slice(start, offset);
+
+				offset += 2;
+				start = offset;
+
+				if (!piece.length) continue; // empty object
+
+				const root: Array<string> = piece.split("\n");
+
+				// should never happen, as long as mastodon doesn't change API messages
+				if (root.length !== 2) continue;
+
+				// remove event and data markers
+				const event: string = root[0].substr(7);
+				const data: string = root[1].substr(6);
+
+				let jsonObj = {};
+				try {
+					jsonObj = JSON.parse(data);
+				} catch (err) {
+					// delete event does not have json object
+					if (event !== "delete") {
+						this.emit(
+							"error",
+							new Error(
+								`Error parsing API reply: '${piece}', error message: '${err}'`,
+							),
+						);
+						continue;
+					}
+				}
+				switch (event) {
+					case "update":
+						this.emit("update", jsonObj as Entity.Status);
+						break;
+					case "notification":
+						this.emit("notification", jsonObj as Entity.Notification);
+						break;
+					case "conversation":
+						this.emit("conversation", jsonObj as Entity.Conversation);
+						break;
+					case "delete":
+						// When delete, data is an ID of the deleted status
+						this.emit("delete", data);
+						break;
+					default:
+						this.emit(
+							"error",
+							new Error(`Unknown event has received: ${event}`),
+						);
+						continue;
+				}
+			}
+			offset++;
+		}
+		this.message = chunk.slice(start, size);
+	}
+}
diff --git a/packages/megalodon/src/proxy_config.ts b/packages/megalodon/src/proxy_config.ts
new file mode 100644
index 0000000000..fadbcf084e
--- /dev/null
+++ b/packages/megalodon/src/proxy_config.ts
@@ -0,0 +1,92 @@
+import { HttpsProxyAgent, HttpsProxyAgentOptions } from "https-proxy-agent";
+import { SocksProxyAgent, SocksProxyAgentOptions } from "socks-proxy-agent";
+
+export type ProxyConfig = {
+	host: string;
+	port: number;
+	auth?: {
+		username: string;
+		password: string;
+	};
+	protocol:
+		| "http"
+		| "https"
+		| "socks4"
+		| "socks4a"
+		| "socks5"
+		| "socks5h"
+		| "socks";
+};
+
+class ProxyProtocolError extends Error {}
+
+const proxyAgent = (
+	proxyConfig: ProxyConfig,
+): HttpsProxyAgent | SocksProxyAgent => {
+	switch (proxyConfig.protocol) {
+		case "http": {
+			let options: HttpsProxyAgentOptions = {
+				host: proxyConfig.host,
+				port: proxyConfig.port,
+				secureProxy: false,
+			};
+			if (proxyConfig.auth) {
+				options = Object.assign(options, {
+					auth: `${proxyConfig.auth.username}:${proxyConfig.auth.password}`,
+				});
+			}
+			const httpsAgent = new HttpsProxyAgent(options);
+			return httpsAgent;
+		}
+		case "https": {
+			let options: HttpsProxyAgentOptions = {
+				host: proxyConfig.host,
+				port: proxyConfig.port,
+				secureProxy: true,
+			};
+			if (proxyConfig.auth) {
+				options = Object.assign(options, {
+					auth: `${proxyConfig.auth.username}:${proxyConfig.auth.password}`,
+				});
+			}
+			const httpsAgent = new HttpsProxyAgent(options);
+			return httpsAgent;
+		}
+		case "socks4":
+		case "socks4a": {
+			let options: SocksProxyAgentOptions = {
+				type: 4,
+				hostname: proxyConfig.host,
+				port: proxyConfig.port,
+			};
+			if (proxyConfig.auth) {
+				options = Object.assign(options, {
+					userId: proxyConfig.auth.username,
+					password: proxyConfig.auth.password,
+				});
+			}
+			const socksAgent = new SocksProxyAgent(options);
+			return socksAgent;
+		}
+		case "socks5":
+		case "socks5h":
+		case "socks": {
+			let options: SocksProxyAgentOptions = {
+				type: 5,
+				hostname: proxyConfig.host,
+				port: proxyConfig.port,
+			};
+			if (proxyConfig.auth) {
+				options = Object.assign(options, {
+					userId: proxyConfig.auth.username,
+					password: proxyConfig.auth.password,
+				});
+			}
+			const socksAgent = new SocksProxyAgent(options);
+			return socksAgent;
+		}
+		default:
+			throw new ProxyProtocolError("protocol is not accepted");
+	}
+};
+export default proxyAgent;
diff --git a/packages/megalodon/src/response.ts b/packages/megalodon/src/response.ts
new file mode 100644
index 0000000000..13fd8ab574
--- /dev/null
+++ b/packages/megalodon/src/response.ts
@@ -0,0 +1,8 @@
+type Response<T = any> = {
+	data: T;
+	status: number;
+	statusText: string;
+	headers: any;
+};
+
+export default Response;
diff --git a/packages/megalodon/test/integration/megalodon.spec.ts b/packages/megalodon/test/integration/megalodon.spec.ts
new file mode 100644
index 0000000000..8964535509
--- /dev/null
+++ b/packages/megalodon/test/integration/megalodon.spec.ts
@@ -0,0 +1,27 @@
+import { detector } from '../../src/index'
+
+describe('detector', () => {
+  describe('mastodon', () => {
+    const url = 'https://fedibird.com'
+    it('should be mastodon', async () => {
+      const mastodon = await detector(url)
+      expect(mastodon).toEqual('mastodon')
+    })
+  })
+
+  describe('pleroma', () => {
+    const url = 'https://pleroma.soykaf.com'
+    it('should be pleroma', async () => {
+      const pleroma = await detector(url)
+      expect(pleroma).toEqual('pleroma')
+    })
+  })
+
+  describe('misskey', () => {
+    const url = 'https://misskey.io'
+    it('should be misskey', async () => {
+      const misskey = await detector(url)
+      expect(misskey).toEqual('misskey')
+    })
+  })
+})
diff --git a/packages/megalodon/test/integration/misskey.spec.ts b/packages/megalodon/test/integration/misskey.spec.ts
new file mode 100644
index 0000000000..0ec1288428
--- /dev/null
+++ b/packages/megalodon/test/integration/misskey.spec.ts
@@ -0,0 +1,204 @@
+import MisskeyEntity from '@/misskey/entity'
+import MisskeyNotificationType from '@/misskey/notification'
+import Misskey from '@/misskey'
+import MegalodonNotificationType from '@/notification'
+import axios, { AxiosResponse } from 'axios'
+
+jest.mock('axios')
+
+const user: MisskeyEntity.User = {
+  id: '1',
+  name: 'test_user',
+  username: 'TestUser',
+  host: 'misskey.io',
+  avatarUrl: 'https://example.com/icon.png',
+  avatarColor: '#000000',
+  emojis: []
+}
+
+const note: MisskeyEntity.Note = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: '1',
+  user: user,
+  text: 'hogehoge',
+  cw: null,
+  visibility: 'public',
+  renoteCount: 0,
+  repliesCount: 0,
+  reactions: {},
+  emojis: [],
+  fileIds: [],
+  files: [],
+  replyId: null,
+  renoteId: null
+}
+
+const follow: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Follow
+}
+
+const mention: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Mention,
+  note: note
+}
+
+const reply: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Reply,
+  note: note
+}
+
+const renote: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Renote,
+  note: note
+}
+
+const quote: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Quote,
+  note: note
+}
+
+const reaction: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.Reaction,
+  note: note,
+  reaction: '♥'
+}
+
+const pollVote: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.PollEnded,
+  note: note
+}
+
+const receiveFollowRequest: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.ReceiveFollowRequest
+}
+
+const followRequestAccepted: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.FollowRequestAccepted
+}
+
+const groupInvited: MisskeyEntity.Notification = {
+  id: '1',
+  createdAt: '2021-02-01T01:49:29',
+  userId: user.id,
+  user: user,
+  type: MisskeyNotificationType.GroupInvited
+}
+
+;(axios.CancelToken.source as any).mockImplementation(() => {
+  return {
+    token: {
+      throwIfRequested: () => {},
+      promise: {
+        then: () => {},
+        catch: () => {}
+      }
+    }
+  }
+})
+
+describe('getNotifications', () => {
+  const client = new Misskey('http://localhost', 'sample token')
+  const cases: Array<{ event: MisskeyEntity.Notification; expected: Entity.NotificationType; title: string }> = [
+    {
+      event: follow,
+      expected: MegalodonNotificationType.Follow,
+      title: 'follow'
+    },
+    {
+      event: mention,
+      expected: MegalodonNotificationType.Mention,
+      title: 'mention'
+    },
+    {
+      event: reply,
+      expected: MegalodonNotificationType.Mention,
+      title: 'reply'
+    },
+    {
+      event: renote,
+      expected: MegalodonNotificationType.Reblog,
+      title: 'renote'
+    },
+    {
+      event: quote,
+      expected: MegalodonNotificationType.Reblog,
+      title: 'quote'
+    },
+    {
+      event: reaction,
+      expected: MegalodonNotificationType.Reaction,
+      title: 'reaction'
+    },
+    {
+      event: pollVote,
+      expected: MegalodonNotificationType.Poll,
+      title: 'pollVote'
+    },
+    {
+      event: receiveFollowRequest,
+      expected: MegalodonNotificationType.FollowRequest,
+      title: 'receiveFollowRequest'
+    },
+    {
+      event: followRequestAccepted,
+      expected: MegalodonNotificationType.Follow,
+      title: 'followRequestAccepted'
+    },
+    {
+      event: groupInvited,
+      expected: MisskeyNotificationType.GroupInvited,
+      title: 'groupInvited'
+    }
+  ]
+  cases.forEach(c => {
+    it(`should be ${c.title} event`, async () => {
+      const mockResponse: AxiosResponse<Array<MisskeyEntity.Notification>> = {
+        data: [c.event],
+        status: 200,
+        statusText: '200OK',
+        headers: {},
+        config: {}
+      }
+      ;(axios.post as any).mockResolvedValue(mockResponse)
+      const res = await client.getNotifications()
+      expect(res.data[0].type).toEqual(c.expected)
+    })
+  })
+})
diff --git a/packages/megalodon/test/unit/misskey/api_client.spec.ts b/packages/megalodon/test/unit/misskey/api_client.spec.ts
new file mode 100644
index 0000000000..7cf33b983d
--- /dev/null
+++ b/packages/megalodon/test/unit/misskey/api_client.spec.ts
@@ -0,0 +1,233 @@
+import MisskeyAPI from '@/misskey/api_client'
+import MegalodonEntity from '@/entity'
+import MisskeyEntity from '@/misskey/entity'
+import MegalodonNotificationType from '@/notification'
+import MisskeyNotificationType from '@/misskey/notification'
+
+const user: MisskeyEntity.User = {
+  id: '1',
+  name: 'test_user',
+  username: 'TestUser',
+  host: 'misskey.io',
+  avatarUrl: 'https://example.com/icon.png',
+  avatarColor: '#000000',
+  emojis: []
+}
+
+const converter: MisskeyAPI.Converter = new MisskeyAPI.Converter("https://example.com")
+
+describe('api_client', () => {
+  describe('notification', () => {
+    describe('encode', () => {
+      it('megalodon notification type should be encoded to misskey notification type', () => {
+        const cases: Array<{ src: MegalodonEntity.NotificationType; dist: MisskeyEntity.NotificationType }> = [
+          {
+            src: MegalodonNotificationType.Follow,
+            dist: MisskeyNotificationType.Follow
+          },
+          {
+            src: MegalodonNotificationType.Mention,
+            dist: MisskeyNotificationType.Reply
+          },
+          {
+            src: MegalodonNotificationType.Favourite,
+            dist: MisskeyNotificationType.Reaction
+          },
+          {
+            src: MegalodonNotificationType.Reaction,
+            dist: MisskeyNotificationType.Reaction
+          },
+          {
+            src: MegalodonNotificationType.Reblog,
+            dist: MisskeyNotificationType.Renote
+          },
+          {
+            src: MegalodonNotificationType.Poll,
+            dist: MisskeyNotificationType.PollEnded
+          },
+          {
+            src: MegalodonNotificationType.FollowRequest,
+            dist: MisskeyNotificationType.ReceiveFollowRequest
+          }
+        ]
+        cases.forEach(c => {
+          expect(converter.encodeNotificationType(c.src)).toEqual(c.dist)
+        })
+      })
+    })
+    describe('decode', () => {
+      it('misskey notification type should be decoded to megalodon notification type', () => {
+        const cases: Array<{ src: MisskeyEntity.NotificationType; dist: MegalodonEntity.NotificationType }> = [
+          {
+            src: MisskeyNotificationType.Follow,
+            dist: MegalodonNotificationType.Follow
+          },
+          {
+            src: MisskeyNotificationType.Mention,
+            dist: MegalodonNotificationType.Mention
+          },
+          {
+            src: MisskeyNotificationType.Reply,
+            dist: MegalodonNotificationType.Mention
+          },
+          {
+            src: MisskeyNotificationType.Renote,
+            dist: MegalodonNotificationType.Reblog
+          },
+          {
+            src: MisskeyNotificationType.Quote,
+            dist: MegalodonNotificationType.Reblog
+          },
+          {
+            src: MisskeyNotificationType.Reaction,
+            dist: MegalodonNotificationType.Reaction
+          },
+          {
+            src: MisskeyNotificationType.PollEnded,
+            dist: MegalodonNotificationType.Poll
+          },
+          {
+            src: MisskeyNotificationType.ReceiveFollowRequest,
+            dist: MegalodonNotificationType.FollowRequest
+          },
+          {
+            src: MisskeyNotificationType.FollowRequestAccepted,
+            dist: MegalodonNotificationType.Follow
+          }
+        ]
+        cases.forEach(c => {
+          expect(converter.decodeNotificationType(c.src)).toEqual(c.dist)
+        })
+      })
+    })
+  })
+  describe('reactions', () => {
+    it('should be mapped', () => {
+      const misskeyReactions = [
+        {
+          id: '1',
+          createdAt: '2020-04-21T13:04:13.968Z',
+          user: {
+            id: '81u70uwsja',
+            name: 'h3poteto',
+            username: 'h3poteto',
+            host: null,
+            avatarUrl: 'https://s3.arkjp.net/misskey/thumbnail-63807d97-20ca-40ba-9493-179aa48065c1.png',
+            avatarColor: 'rgb(146,189,195)',
+            emojis: []
+          },
+          type: '❤'
+        },
+        {
+          id: '2',
+          createdAt: '2020-04-21T13:04:13.968Z',
+          user: {
+            id: '81u70uwsja',
+            name: 'h3poteto',
+            username: 'h3poteto',
+            host: null,
+            avatarUrl: 'https://s3.arkjp.net/misskey/thumbnail-63807d97-20ca-40ba-9493-179aa48065c1.png',
+            avatarColor: 'rgb(146,189,195)',
+            emojis: []
+          },
+          type: '❤'
+        },
+        {
+          id: '3',
+          createdAt: '2020-04-21T13:04:13.968Z',
+          user: {
+            id: '81u70uwsja',
+            name: 'h3poteto',
+            username: 'h3poteto',
+            host: null,
+            avatarUrl: 'https://s3.arkjp.net/misskey/thumbnail-63807d97-20ca-40ba-9493-179aa48065c1.png',
+            avatarColor: 'rgb(146,189,195)',
+            emojis: []
+          },
+          type: '☺'
+        },
+        {
+          id: '4',
+          createdAt: '2020-04-21T13:04:13.968Z',
+          user: {
+            id: '81u70uwsja',
+            name: 'h3poteto',
+            username: 'h3poteto',
+            host: null,
+            avatarUrl: 'https://s3.arkjp.net/misskey/thumbnail-63807d97-20ca-40ba-9493-179aa48065c1.png',
+            avatarColor: 'rgb(146,189,195)',
+            emojis: []
+          },
+          type: '❤'
+        }
+      ]
+
+      const reactions = converter.reactions(misskeyReactions)
+      expect(reactions).toEqual([
+        {
+          count: 3,
+          me: false,
+          name: '❤'
+        },
+        {
+          count: 1,
+          me: false,
+          name: '☺'
+        }
+      ])
+    })
+  })
+
+  describe('status', () => {
+    describe('plain content', () => {
+      it('should be exported plain content and html content', () => {
+        const plainContent = 'hoge\nfuga\nfuga'
+        const content = 'hoge<br>fuga<br>fuga'
+        const note: MisskeyEntity.Note = {
+          id: '1',
+          createdAt: '2021-02-01T01:49:29',
+          userId: '1',
+          user: user,
+          text: plainContent,
+          cw: null,
+          visibility: 'public',
+          renoteCount: 0,
+          repliesCount: 0,
+          reactions: {},
+          emojis: [],
+          fileIds: [],
+          files: [],
+          replyId: null,
+          renoteId: null
+        }
+        const megalodonStatus = converter.note(note, user.host || 'misskey.io')
+        expect(megalodonStatus.plain_content).toEqual(plainContent)
+        expect(megalodonStatus.content).toEqual(content)
+      })
+      it('html tags should be escaped', () => {
+        const plainContent = '<p>hoge\nfuga\nfuga<p>'
+        const content = '&lt;p&gt;hoge<br>fuga<br>fuga&lt;p&gt;'
+        const note: MisskeyEntity.Note = {
+          id: '1',
+          createdAt: '2021-02-01T01:49:29',
+          userId: '1',
+          user: user,
+          text: plainContent,
+          cw: null,
+          visibility: 'public',
+          renoteCount: 0,
+          repliesCount: 0,
+          reactions: {},
+          emojis: [],
+          fileIds: [],
+          files: [],
+          replyId: null,
+          renoteId: null
+        }
+        const megalodonStatus = converter.note(note, user.host || 'misskey.io')
+        expect(megalodonStatus.plain_content).toEqual(plainContent)
+        expect(megalodonStatus.content).toEqual(content)
+      })
+    })
+  })
+})
diff --git a/packages/megalodon/test/unit/parser.spec.ts b/packages/megalodon/test/unit/parser.spec.ts
new file mode 100644
index 0000000000..5174a647c6
--- /dev/null
+++ b/packages/megalodon/test/unit/parser.spec.ts
@@ -0,0 +1,152 @@
+import { Parser } from '@/parser'
+import Entity from '@/entity'
+
+const account: Entity.Account = {
+  id: '1',
+  username: 'h3poteto',
+  acct: 'h3poteto@pleroma.io',
+  display_name: 'h3poteto',
+  locked: false,
+  created_at: '2019-03-26T21:30:32',
+  followers_count: 10,
+  following_count: 10,
+  statuses_count: 100,
+  note: 'engineer',
+  url: 'https://pleroma.io',
+  avatar: '',
+  avatar_static: '',
+  header: '',
+  header_static: '',
+  emojis: [],
+  moved: null,
+  fields: [],
+  bot: false
+}
+
+const status: Entity.Status = {
+  id: '1',
+  uri: 'http://example.com',
+  url: 'http://example.com',
+  account: account,
+  in_reply_to_id: null,
+  in_reply_to_account_id: null,
+  reblog: null,
+  content: 'hoge',
+  plain_content: 'hoge',
+  created_at: '2019-03-26T21:40:32',
+  emojis: [],
+  replies_count: 0,
+  reblogs_count: 0,
+  favourites_count: 0,
+  reblogged: null,
+  favourited: null,
+  muted: null,
+  sensitive: false,
+  spoiler_text: '',
+  visibility: 'public',
+  media_attachments: [],
+  mentions: [],
+  tags: [],
+  card: null,
+  poll: null,
+  application: {
+    name: 'Web'
+  } as Entity.Application,
+  language: null,
+  pinned: null,
+  reactions: [],
+  bookmarked: false,
+  quote: null
+}
+
+const notification: Entity.Notification = {
+  id: '1',
+  account: account,
+  status: status,
+  type: 'favourite',
+  created_at: '2019-04-01T17:01:32'
+}
+
+const conversation: Entity.Conversation = {
+  id: '1',
+  accounts: [account],
+  last_status: status,
+  unread: true
+}
+
+describe('Parser', () => {
+  let parser: Parser
+
+  beforeEach(() => {
+    parser = new Parser()
+  })
+
+  describe('parse', () => {
+    describe('message is heartbeat', () => {
+      const message: string = ':thump\n'
+      it('should be called', () => {
+        const spy = jest.fn()
+        parser.on('heartbeat', spy)
+        parser.parse(message)
+        expect(spy).toHaveBeenLastCalledWith({})
+      })
+    })
+
+    describe('message is not json', () => {
+      describe('event is delete', () => {
+        const message = `event: delete\ndata: 12asdf34\n\n`
+        it('should be called', () => {
+          const spy = jest.fn()
+          parser.once('delete', spy)
+          parser.parse(message)
+          expect(spy).toHaveBeenCalledWith('12asdf34')
+        })
+      })
+
+      describe('event is not delete', () => {
+        const message = `event: event\ndata: 12asdf34\n\n`
+        it('should be error', () => {
+          const error = jest.fn()
+          const deleted = jest.fn()
+          parser.once('error', error)
+          parser.once('delete', deleted)
+          parser.parse(message)
+          expect(error).toHaveBeenCalled()
+          expect(deleted).not.toHaveBeenCalled()
+        })
+      })
+    })
+
+    describe('message is json', () => {
+      describe('event is update', () => {
+        const message = `event: update\ndata: ${JSON.stringify(status)}\n\n`
+        it('should be called', () => {
+          const spy = jest.fn()
+          parser.once('update', spy)
+          parser.parse(message)
+          expect(spy).toHaveBeenCalledWith(status)
+        })
+      })
+
+      describe('event is notification', () => {
+        const message = `event: notification\ndata: ${JSON.stringify(notification)}\n\n`
+        it('should be called', () => {
+          const spy = jest.fn()
+          parser.once('notification', spy)
+          parser.parse(message)
+          expect(spy).toHaveBeenCalledWith(notification)
+        })
+      })
+
+      describe('event is conversation', () => {
+        const message = `event: conversation\ndata: ${JSON.stringify(conversation)}\n\n`
+        it('should be called', () => {
+          const spy = jest.fn()
+          parser.once('conversation', spy)
+          parser.parse(message)
+          expect(spy).toHaveBeenCalledWith(conversation)
+        })
+      })
+    })
+  })
+})
diff --git a/packages/megalodon/tsconfig.json b/packages/megalodon/tsconfig.json
new file mode 100644
index 0000000000..5a9bfbde9a
--- /dev/null
+++ b/packages/megalodon/tsconfig.json
@@ -0,0 +1,64 @@
+{
+  "compilerOptions": {
+    /* Basic Options */
+    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
+    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
+    "lib": ["es2021", "dom"],                 /* Specify library files to be included in the compilation. */
+    // "allowJs": true,                       /* Allow javascript files to be compiled. */
+    // "checkJs": true,                       /* Report errors in .js files. */
+    // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+    "declaration": true,                      /* Generates corresponding '.d.ts' file. */
+    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
+    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
+    // "outFile": "./",                       /* Concatenate and emit output to single file. */
+    "outDir": "./lib",                        /* Redirect output structure to the directory. */
+    "rootDir": "./",                          /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+    // "composite": true,                     /* Enable project compilation */
+    "removeComments": true,                   /* Do not emit comments to output. */
+    // "noEmit": true,                        /* Do not emit outputs. */
+    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
+    "downlevelIteration": true,               /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+    /* Strict Type-Checking Options */
+    "strict": true,                           /* Enable all strict type-checking options. */
+    "noImplicitAny": true,                    /* Raise error on expressions and declarations with an implied 'any' type. */
+    "strictNullChecks": true,                 /* Enable strict null checks. */
+    "strictFunctionTypes": true,              /* Enable strict checking of function types. */
+    "strictPropertyInitialization": true,     /* Enable strict checking of property initialization in classes. */
+    "noImplicitThis": true,                   /* Raise error on 'this' expressions with an implied 'any' type. */
+    "alwaysStrict": true,                     /* Parse in strict mode and emit "use strict" for each source file. */
+
+    /* Additional Checks */
+    "noUnusedLocals": false,                   /* Report errors on unused locals. */
+    "noUnusedParameters": true,               /* Report errors on unused parameters. */
+    "noImplicitReturns": true,                /* Report error when not all code paths in function return a value. */
+    "noFallthroughCasesInSwitch": true,       /* Report errors for fallthrough cases in switch statement. */
+
+    /* Module Resolution Options */
+    "moduleResolution": "node",               /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+    "baseUrl": "./",                          /* Base directory to resolve non-absolute module names. */
+    "paths": {
+      "@*": ["src*"],
+      "~*": ["./*"]
+    },                                        /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
+    // "typeRoots": [],                       /* List of folders to include type definitions from. */
+    // "types": [],                           /* Type declaration files to be included in compilation. */
+    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+    "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
+
+    /* Source Map Options */
+    // "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+    // "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */
+    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
+    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+    /* Experimental Options */
+    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
+    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
+  },
+  "include": ["./src", "./test"],
+  "exclude": ["node_modules", "example"]
+}
diff --git a/packages/sw/package.json b/packages/sw/package.json
index 7c5bd14077..b86e2af800 100644
--- a/packages/sw/package.json
+++ b/packages/sw/package.json
@@ -9,12 +9,12 @@
 		"format": "pnpm biome format * --write"
 	},
 	"devDependencies": {
-		"@swc/cli": "^0.1.62",
+		"@swc/cli": "^0.1.63",
 		"@swc/core": "1.3.78",
 		"@swc/core-android-arm64": "1.3.11",
 		"firefish-js": "workspace:*",
 		"idb-keyval": "^6.2.1",
-		"vite": "4.4.9",
+		"vite": "5.0.0",
 		"vite-plugin-compression": "^0.5.1"
 	},
 	"optionalDependencies": {
diff --git a/packages/sw/tsconfig.json b/packages/sw/tsconfig.json
index fad2ae5679..cc5e041d13 100644
--- a/packages/sw/tsconfig.json
+++ b/packages/sw/tsconfig.json
@@ -27,13 +27,8 @@
 			"node_modules/@types",
 			"@types",
 		],
-		"lib": [
-			"esnext",
-			"webworker"
-		]
+		"lib": ["esnext", "webworker"]
 	},
 	"compileOnSave": false,
-	"include": [
-		"./**/*.ts", "./**/*.d.ts", "./**/*.tsx", "./**/*.vue"
-	]
+	"include": ["./**/*.ts", "./**/*.d.ts", "./**/*.tsx", "./**/*.vue"]
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f56048c1bd..a4d35b87ab 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,17 +12,17 @@ importers:
   .:
     dependencies:
       '@bull-board/api':
-        specifier: 5.8.0
-        version: 5.8.0(@bull-board/ui@5.8.0)
+        specifier: 5.9.1
+        version: 5.9.1(@bull-board/ui@5.9.1)
       '@bull-board/ui':
-        specifier: 5.8.0
-        version: 5.8.0
+        specifier: 5.9.1
+        version: 5.9.1
       '@napi-rs/cli':
-        specifier: ^2.16.2
-        version: 2.16.2
+        specifier: ^2.16.5
+        version: 2.16.5
       '@tensorflow/tfjs':
-        specifier: ^4.10.0
-        version: 4.11.0(seedrandom@3.0.5)
+        specifier: ^4.13.0
+        version: 4.13.0(seedrandom@3.0.5)
       js-yaml:
         specifier: 4.1.0
         version: 4.1.0
@@ -31,29 +31,29 @@ importers:
         version: 3.0.5
     devDependencies:
       '@biomejs/biome':
-        specifier: 1.0.0
-        version: 1.0.0
+        specifier: 1.3.3
+        version: 1.3.3
       '@biomejs/cli-darwin-arm64':
-        specifier: ^1.0.0
-        version: 1.2.2
+        specifier: ^1.3.3
+        version: 1.3.3
       '@biomejs/cli-darwin-x64':
-        specifier: ^1.0.0
-        version: 1.2.2
+        specifier: ^1.3.3
+        version: 1.3.3
       '@biomejs/cli-linux-arm64':
-        specifier: ^1.0.0
-        version: 1.2.2
+        specifier: ^1.3.3
+        version: 1.3.3
       '@biomejs/cli-linux-x64':
-        specifier: ^1.0.0
-        version: 1.2.2
+        specifier: ^1.3.3
+        version: 1.3.3
       '@types/gulp':
-        specifier: 4.0.13
-        version: 4.0.13
+        specifier: 4.0.17
+        version: 4.0.17
       '@types/gulp-rename':
-        specifier: 2.0.2
-        version: 2.0.2
+        specifier: 2.0.5
+        version: 2.0.5
       '@types/node':
-        specifier: 20.5.8
-        version: 20.5.8
+        specifier: 20.9.0
+        version: 20.9.0
       add:
         specifier: 2.0.6
         version: 2.0.6
@@ -61,11 +61,11 @@ importers:
         specifier: 7.0.3
         version: 7.0.3
       cypress:
-        specifier: 10.11.0
-        version: 10.11.0
+        specifier: 13.5.1
+        version: 13.5.1
       execa:
-        specifier: 5.1.1
-        version: 5.1.1
+        specifier: 8.0.1
+        version: 8.0.1
       gulp:
         specifier: 4.0.2
         version: 4.0.2
@@ -85,11 +85,11 @@ importers:
         specifier: ^1.0.4
         version: 1.0.4
       pnpm:
-        specifier: 8.8.0
-        version: 8.8.0
+        specifier: 8.10.5
+        version: 8.10.5
       start-server-and-test:
-        specifier: 1.15.2
-        version: 1.15.2
+        specifier: 2.0.3
+        version: 2.0.3
       typescript:
         specifier: 5.2.2
         version: 5.2.2
@@ -97,44 +97,44 @@ importers:
   packages/backend:
     dependencies:
       '@bull-board/api':
-        specifier: 5.8.0
-        version: 5.8.0(@bull-board/ui@5.8.0)
+        specifier: 5.9.1
+        version: 5.9.1(@bull-board/ui@5.9.1)
       '@bull-board/koa':
-        specifier: 5.8.0
-        version: 5.8.0(@types/koa@2.13.8)(pug@3.0.2)
+        specifier: 5.9.1
+        version: 5.9.1(@types/koa@2.13.11)(pug@3.0.2)
       '@bull-board/ui':
-        specifier: 5.8.0
-        version: 5.8.0
+        specifier: 5.9.1
+        version: 5.9.1
       '@discordapp/twemoji':
         specifier: 14.1.2
         version: 14.1.2
       '@elastic/elasticsearch':
-        specifier: 7.17.0
-        version: 7.17.0
+        specifier: 8.10.0
+        version: 8.10.0
       '@koa/cors':
-        specifier: 3.4.3
-        version: 3.4.3
+        specifier: 4.0.0
+        version: 4.0.0
       '@koa/multer':
         specifier: 3.0.2
-        version: 3.0.2(multer@1.4.4-lts.1)
+        version: 3.0.2(multer@1.4.5-lts.1)
       '@koa/router':
-        specifier: 9.0.1
-        version: 9.0.1
+        specifier: 12.0.1
+        version: 12.0.1
+      '@ladjs/koa-views':
+        specifier: 9.0.0
+        version: 9.0.0(@babel/core@7.22.10)(@types/koa@2.13.11)(pug@3.0.2)
       '@peertube/http-signature':
         specifier: 1.7.0
         version: 1.7.0
       '@redocly/openapi-core':
-        specifier: 1.0.2
-        version: 1.0.2
+        specifier: 1.4.1
+        version: 1.4.1
       '@sinonjs/fake-timers':
-        specifier: 9.1.2
-        version: 9.1.2
-      '@syuilo/aiscript':
-        specifier: 0.11.1
-        version: 0.11.1
+        specifier: 11.2.2
+        version: 11.2.2
       '@tensorflow/tfjs':
-        specifier: ^4.2.0
-        version: 4.2.0(seedrandom@3.0.5)
+        specifier: ^4.13.0
+        version: 4.13.0(seedrandom@3.0.5)
       adm-zip:
         specifier: ^0.5.10
         version: 0.5.10
@@ -142,11 +142,11 @@ importers:
         specifier: 8.12.0
         version: 8.12.0
       archiver:
-        specifier: 6.0.0
-        version: 6.0.0
+        specifier: 6.0.1
+        version: 6.0.1
       argon2:
-        specifier: ^0.31.1
-        version: 0.31.1
+        specifier: ^0.31.2
+        version: 0.31.2
       autolinker:
         specifier: 4.0.0
         version: 4.0.0
@@ -154,11 +154,11 @@ importers:
         specifier: 0.1.0
         version: 0.1.0
       aws-sdk:
-        specifier: 2.1413.0
-        version: 2.1413.0
+        specifier: 2.1498.0
+        version: 2.1498.0
       axios:
-        specifier: ^1.4.0
-        version: 1.4.0
+        specifier: ^1.6.2
+        version: 1.6.2(debug@4.3.4)
       bcryptjs:
         specifier: 2.4.3
         version: 2.4.3
@@ -166,17 +166,20 @@ importers:
         specifier: 2.0.5
         version: 2.0.5
       bull:
-        specifier: 4.11.3
-        version: 4.11.3
+        specifier: 4.11.5
+        version: 4.11.5
       cacheable-lookup:
         specifier: TheEssem/cacheable-lookup
         version: github.com/TheEssem/cacheable-lookup/dd2fb616366a3c68dcf321a57a67295967b204bf
+      cbor-x:
+        specifier: ^1.5.4
+        version: 1.5.4
       chalk:
         specifier: 5.3.0
         version: 5.3.0
       chalk-template:
-        specifier: 0.4.0
-        version: 0.4.0
+        specifier: 1.1.0
+        version: 1.1.0
       chokidar:
         specifier: ^3.3.1
         version: 3.3.1
@@ -205,8 +208,8 @@ importers:
         specifier: 4.2.2
         version: 4.2.2
       file-type:
-        specifier: 18.5.0
-        version: 18.5.0
+        specifier: 18.7.0
+        version: 18.7.0
       firefish-js:
         specifier: workspace:*
         version: link:../firefish-js
@@ -220,8 +223,8 @@ importers:
         specifier: ^1.4.2
         version: 1.4.2
       happy-dom:
-        specifier: ^11.0.2
-        version: 11.2.0
+        specifier: ^12.10.3
+        version: 12.10.3
       hpagent:
         specifier: 1.2.0
         version: 1.2.0
@@ -241,8 +244,8 @@ importers:
         specifier: 2.2.3
         version: 2.2.3
       jsonld:
-        specifier: 8.2.1
-        version: 8.2.1
+        specifier: 8.3.1
+        version: 8.3.1
       jsrsasign:
         specifier: 10.8.6
         version: 10.8.6
@@ -276,15 +279,12 @@ importers:
       koa-slow:
         specifier: 2.1.0
         version: 2.1.0
-      koa-views:
-        specifier: 7.0.2
-        version: 7.0.2(@types/koa@2.13.8)(ejs@3.1.9)(pug@3.0.2)
       megalodon:
-        specifier: 8.1.1
-        version: 8.1.1
+        specifier: workspace:*
+        version: link:../megalodon
       meilisearch:
-        specifier: 0.34.1
-        version: 0.34.1
+        specifier: 0.35.0
+        version: 0.35.0
       mfm-js:
         specifier: 0.23.3
         version: 0.23.3
@@ -292,11 +292,11 @@ importers:
         specifier: 2.1.35
         version: 2.1.35
       msgpackr:
-        specifier: 1.9.7
-        version: 1.9.7
+        specifier: ^1.9.9
+        version: 1.9.9
       multer:
-        specifier: 1.4.4-lts.1
-        version: 1.4.4-lts.1
+        specifier: 1.4.5-lts.1
+        version: 1.4.5-lts.1
       native-utils:
         specifier: link:native-utils
         version: link:native-utils
@@ -307,11 +307,11 @@ importers:
         specifier: 3.3.2
         version: 3.3.2
       nodemailer:
-        specifier: 6.9.4
-        version: 6.9.4
+        specifier: 6.9.7
+        version: 6.9.7
       nsfwjs:
         specifier: 2.4.2
-        version: 2.4.2(@tensorflow/tfjs@4.2.0)
+        version: 2.4.2(@tensorflow/tfjs@4.13.0)
       opencc-js:
         specifier: ^1.0.5
         version: 1.0.5
@@ -319,8 +319,8 @@ importers:
         specifier: 0.0.14
         version: 0.0.14
       otpauth:
-        specifier: ^9.1.4
-        version: 9.1.4
+        specifier: ^9.2.0
+        version: 9.2.0
       parse5:
         specifier: 7.1.2
         version: 7.1.2
@@ -337,11 +337,11 @@ importers:
         specifier: 2.7.0
         version: 2.7.0
       punycode:
-        specifier: 2.3.0
-        version: 2.3.0
+        specifier: 2.3.1
+        version: 2.3.1
       pureimage:
-        specifier: 0.4.8
-        version: 0.4.8
+        specifier: 0.4.13
+        version: 0.4.13
       qrcode:
         specifier: 1.5.3
         version: 1.5.3
@@ -355,8 +355,8 @@ importers:
         specifier: 3.4.1
         version: 3.4.1
       re2:
-        specifier: 1.20.3
-        version: 1.20.3
+        specifier: 1.20.8
+        version: 1.20.8
       redis-semaphore:
         specifier: 5.5.0
         version: 5.5.0(ioredis@5.3.2)
@@ -382,8 +382,8 @@ importers:
         specifier: 7.5.4
         version: 7.5.4
       sharp:
-        specifier: 0.32.5
-        version: 0.32.5
+        specifier: 0.32.6
+        version: 0.32.6
       sonic-channel:
         specifier: ^1.3.1
         version: 1.3.1
@@ -397,14 +397,14 @@ importers:
         specifier: 1.0.0
         version: 1.0.0
       systeminformation:
-        specifier: 5.21.3
-        version: 5.21.3
+        specifier: 5.21.17
+        version: 5.21.17
       tar-stream:
         specifier: ^3.1.6
         version: 3.1.6
       tesseract.js:
-        specifier: ^4.1.1
-        version: 4.1.1
+        specifier: ^5.0.3
+        version: 5.0.3
       tinycolor2:
         specifier: 1.6.0
         version: 1.6.0
@@ -424,11 +424,11 @@ importers:
         specifier: 2.3.0
         version: 2.3.0
       uuid:
-        specifier: 9.0.0
-        version: 9.0.0
+        specifier: 9.0.1
+        version: 9.0.1
       web-push:
-        specifier: 3.6.5
-        version: 3.6.5
+        specifier: 3.6.6
+        version: 3.6.6
       websocket:
         specifier: 1.0.34
         version: 1.0.34
@@ -440,150 +440,159 @@ importers:
         specifier: 1.3.11
         version: 1.3.11
       '@tensorflow/tfjs-node':
-        specifier: 3.21.1
-        version: 3.21.1(seedrandom@3.0.5)
+        specifier: 4.13.0
+        version: 4.13.0(seedrandom@3.0.5)
     devDependencies:
       '@swc/cli':
-        specifier: ^0.1.62
-        version: 0.1.62(@swc/core@1.3.78)(chokidar@3.3.1)
+        specifier: ^0.1.63
+        version: 0.1.63(@swc/core@1.3.78)(chokidar@3.3.1)
       '@swc/core':
         specifier: 1.3.78
         version: 1.3.78
       '@types/adm-zip':
-        specifier: ^0.5.0
-        version: 0.5.0
+        specifier: ^0.5.4
+        version: 0.5.4
       '@types/bcryptjs':
-        specifier: 2.4.2
-        version: 2.4.2
+        specifier: 2.4.6
+        version: 2.4.6
+      '@types/color-convert':
+        specifier: ^2.0.3
+        version: 2.0.3
+      '@types/content-disposition':
+        specifier: ^0.5.8
+        version: 0.5.8
       '@types/escape-regexp':
-        specifier: 0.0.1
-        version: 0.0.1
+        specifier: 0.0.3
+        version: 0.0.3
       '@types/fluent-ffmpeg':
-        specifier: 2.1.21
-        version: 2.1.21
+        specifier: 2.1.24
+        version: 2.1.24
       '@types/js-yaml':
+        specifier: 4.0.9
+        version: 4.0.9
+      '@types/jsonld':
+        specifier: 1.5.12
+        version: 1.5.12
+      '@types/jsrsasign':
+        specifier: 10.5.12
+        version: 10.5.12
+      '@types/koa':
+        specifier: 2.13.11
+        version: 2.13.11
+      '@types/koa-bodyparser':
+        specifier: 4.3.12
+        version: 4.3.12
+      '@types/koa-cors':
+        specifier: 0.0.5
+        version: 0.0.5
+      '@types/koa-favicon':
+        specifier: 2.1.3
+        version: 2.1.3
+      '@types/koa-logger':
+        specifier: 3.1.5
+        version: 3.1.5
+      '@types/koa-mount':
         specifier: 4.0.5
         version: 4.0.5
-      '@types/jsonld':
-        specifier: 1.5.9
-        version: 1.5.9
-      '@types/jsrsasign':
-        specifier: 10.5.8
-        version: 10.5.8
-      '@types/koa':
-        specifier: 2.13.8
-        version: 2.13.8
-      '@types/koa-bodyparser':
-        specifier: 4.3.10
-        version: 4.3.10
-      '@types/koa-cors':
-        specifier: 0.0.2
-        version: 0.0.2
-      '@types/koa-favicon':
-        specifier: 2.0.21
-        version: 2.0.21
-      '@types/koa-logger':
-        specifier: 3.1.2
-        version: 3.1.2
-      '@types/koa-mount':
-        specifier: 4.0.2
-        version: 4.0.2
       '@types/koa-send':
-        specifier: 4.1.3
-        version: 4.1.3
-      '@types/koa-views':
-        specifier: 7.0.0
-        version: 7.0.0(@types/koa@2.13.8)(pug@3.0.2)
+        specifier: 4.1.6
+        version: 4.1.6
       '@types/koa__cors':
-        specifier: 3.3.0
-        version: 3.3.0
+        specifier: 4.0.3
+        version: 4.0.3
       '@types/koa__multer':
-        specifier: 2.0.4
-        version: 2.0.4
+        specifier: 2.0.7
+        version: 2.0.7
       '@types/koa__router':
-        specifier: 8.0.11
-        version: 8.0.11
+        specifier: 12.0.4
+        version: 12.0.4
       '@types/mocha':
-        specifier: 9.1.1
-        version: 9.1.1
+        specifier: 10.0.4
+        version: 10.0.4
       '@types/node':
-        specifier: 18.11.18
-        version: 18.11.18
+        specifier: 20.9.0
+        version: 20.9.0
       '@types/node-fetch':
-        specifier: 3.0.3
-        version: 3.0.3
+        specifier: 2.6.9
+        version: 2.6.9
       '@types/nodemailer':
-        specifier: 6.4.9
-        version: 6.4.9
+        specifier: 6.4.14
+        version: 6.4.14
       '@types/oauth':
-        specifier: 0.9.1
-        version: 0.9.1
+        specifier: 0.9.4
+        version: 0.9.4
+      '@types/opencc-js':
+        specifier: ^1.0.3
+        version: 1.0.3
+      '@types/pg':
+        specifier: ^8.10.9
+        version: 8.10.9
       '@types/probe-image-size':
-        specifier: ^7.2.0
-        version: 7.2.0
+        specifier: ^7.2.3
+        version: 7.2.3
       '@types/pug':
-        specifier: 2.0.6
-        version: 2.0.6
+        specifier: 2.0.9
+        version: 2.0.9
       '@types/punycode':
-        specifier: 2.1.0
-        version: 2.1.0
+        specifier: 2.1.2
+        version: 2.1.2
       '@types/qrcode':
-        specifier: 1.5.1
-        version: 1.5.1
+        specifier: 1.5.5
+        version: 1.5.5
       '@types/qs':
-        specifier: 6.9.7
-        version: 6.9.7
+        specifier: 6.9.10
+        version: 6.9.10
       '@types/random-seed':
-        specifier: 0.3.3
-        version: 0.3.3
+        specifier: 0.3.5
+        version: 0.3.5
       '@types/ratelimiter':
-        specifier: 3.4.4
-        version: 3.4.4
-      '@types/redis':
-        specifier: 4.0.11
-        version: 4.0.11
+        specifier: 3.4.6
+        version: 3.4.6
       '@types/rename':
-        specifier: 1.0.4
-        version: 1.0.4
+        specifier: 1.0.7
+        version: 1.0.7
       '@types/sanitize-html':
-        specifier: 2.9.0
-        version: 2.9.0
+        specifier: 2.9.4
+        version: 2.9.4
       '@types/semver':
-        specifier: 7.5.0
-        version: 7.5.0
+        specifier: 7.5.5
+        version: 7.5.5
       '@types/sinonjs__fake-timers':
-        specifier: 8.1.2
-        version: 8.1.2
+        specifier: 8.1.5
+        version: 8.1.5
+      '@types/syslog-pro':
+        specifier: ^1.0.3
+        version: 1.0.3
       '@types/tinycolor2':
-        specifier: 1.4.3
-        version: 1.4.3
+        specifier: 1.4.6
+        version: 1.4.6
       '@types/tmp':
-        specifier: 0.2.3
-        version: 0.2.3
+        specifier: 0.2.6
+        version: 0.2.6
       '@types/uuid':
-        specifier: 9.0.2
-        version: 9.0.2
+        specifier: 9.0.7
+        version: 9.0.7
       '@types/web-push':
-        specifier: 3.3.2
-        version: 3.3.2
+        specifier: 3.6.3
+        version: 3.6.3
       '@types/websocket':
-        specifier: 1.0.5
-        version: 1.0.5
+        specifier: 1.0.9
+        version: 1.0.9
       '@types/ws':
-        specifier: 8.5.5
-        version: 8.5.5
+        specifier: 8.5.9
+        version: 8.5.9
       cross-env:
         specifier: 7.0.3
         version: 7.0.3
       eslint:
-        specifier: ^8.46.0
-        version: 8.46.0
+        specifier: ^8.53.0
+        version: 8.53.0
       execa:
-        specifier: 6.1.0
-        version: 6.1.0
+        specifier: 8.0.1
+        version: 8.0.1
       json5-loader:
         specifier: 4.0.1
-        version: 4.0.1(webpack@5.88.2)
+        version: 4.0.1(webpack@5.89.0)
       mocha:
         specifier: 10.2.0
         version: 10.2.0
@@ -595,25 +604,25 @@ importers:
         version: 2.0.0
       swc-loader:
         specifier: ^0.2.3
-        version: 0.2.3(@swc/core@1.3.78)(webpack@5.88.2)
+        version: 0.2.3(@swc/core@1.3.78)(webpack@5.89.0)
       ts-loader:
-        specifier: 9.4.4
-        version: 9.4.4(typescript@5.1.6)(webpack@5.88.2)
+        specifier: 9.5.1
+        version: 9.5.1(typescript@5.2.2)(webpack@5.89.0)
       ts-node:
         specifier: 10.9.1
-        version: 10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6)
+        version: 10.9.1(@swc/core@1.3.78)(@types/node@20.9.0)(typescript@5.2.2)
       tsconfig-paths:
         specifier: 4.2.0
         version: 4.2.0
       typescript:
-        specifier: 5.1.6
-        version: 5.1.6
+        specifier: 5.2.2
+        version: 5.2.2
       webpack:
-        specifier: ^5.88.2
-        version: 5.88.2(@swc/core@1.3.78)
+        specifier: ^5.89.0
+        version: 5.89.0(@swc/core@1.3.78)
       ws:
-        specifier: 8.13.0
-        version: 8.13.0
+        specifier: 8.14.2
+        version: 8.14.2
 
   packages/backend/native-utils:
     devDependencies:
@@ -630,68 +639,80 @@ importers:
         specifier: 14.1.2
         version: 14.1.2
       '@eslint-sets/eslint-config-vue3':
-        specifier: ^5.8.0
-        version: 5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
+        specifier: ^5.10.0
+        version: 5.10.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
       '@eslint-sets/eslint-config-vue3-ts':
         specifier: ^3.3.0
-        version: 3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
+        version: 3.3.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
       '@phosphor-icons/web':
         specifier: ^2.0.3
         version: 2.0.3
       '@rollup/plugin-alias':
-        specifier: 5.0.0
-        version: 5.0.0(rollup@3.28.1)
+        specifier: 5.0.1
+        version: 5.0.1(rollup@4.4.1)
       '@rollup/plugin-json':
-        specifier: 6.0.0
-        version: 6.0.0(rollup@3.28.1)
+        specifier: 6.0.1
+        version: 6.0.1(rollup@4.4.1)
       '@rollup/pluginutils':
-        specifier: ^5.0.4
-        version: 5.0.4(rollup@3.28.1)
+        specifier: ^5.0.5
+        version: 5.0.5(rollup@4.4.1)
       '@syuilo/aiscript':
-        specifier: 0.11.1
-        version: 0.11.1
+        specifier: 0.16.0
+        version: 0.16.0
+      '@types/autosize':
+        specifier: ^4.0.3
+        version: 4.0.3
       '@types/escape-regexp':
-        specifier: 0.0.1
-        version: 0.0.1
+        specifier: 0.0.3
+        version: 0.0.3
       '@types/glob':
         specifier: 8.1.0
         version: 8.1.0
       '@types/gulp':
-        specifier: 4.0.13
-        version: 4.0.13
+        specifier: 4.0.17
+        version: 4.0.17
       '@types/gulp-rename':
-        specifier: 2.0.2
-        version: 2.0.2
+        specifier: 2.0.5
+        version: 2.0.5
+      '@types/insert-text-at-cursor':
+        specifier: ^0.3.2
+        version: 0.3.2
       '@types/katex':
-        specifier: 0.16.2
-        version: 0.16.2
+        specifier: 0.16.6
+        version: 0.16.6
       '@types/matter-js':
-        specifier: 0.19.0
-        version: 0.19.0
+        specifier: 0.19.4
+        version: 0.19.4
+      '@types/prismjs':
+        specifier: ^1.26.3
+        version: 1.26.3
       '@types/punycode':
-        specifier: 2.1.0
-        version: 2.1.0
+        specifier: 2.1.2
+        version: 2.1.2
       '@types/seedrandom':
-        specifier: 3.0.5
-        version: 3.0.5
+        specifier: 3.0.8
+        version: 3.0.8
+      '@types/textarea-caret':
+        specifier: ^3.0.3
+        version: 3.0.3
       '@types/throttle-debounce':
-        specifier: 5.0.0
-        version: 5.0.0
+        specifier: 5.0.2
+        version: 5.0.2
       '@types/tinycolor2':
-        specifier: 1.4.3
-        version: 1.4.3
+        specifier: 1.4.6
+        version: 1.4.6
       '@types/uuid':
-        specifier: 9.0.3
-        version: 9.0.3
+        specifier: 9.0.7
+        version: 9.0.7
       '@vitejs/plugin-vue':
-        specifier: 4.3.4
-        version: 4.3.4(vite@4.4.9)(vue@3.3.4)
+        specifier: 4.5.0
+        version: 4.5.0(vite@5.0.0)(vue@3.3.8)
       '@vue/compiler-sfc':
-        specifier: 3.3.4
-        version: 3.3.4
+        specifier: 3.3.8
+        version: 3.3.8
       '@vue/runtime-core':
-        specifier: 3.3.4
-        version: 3.3.4
+        specifier: 3.3.8
+        version: 3.3.8
       autobind-decorator:
         specifier: 2.4.0
         version: 2.4.0
@@ -702,8 +723,8 @@ importers:
         specifier: 2.0.5
         version: 2.0.5
       broadcast-channel:
-        specifier: 5.3.0
-        version: 5.3.0
+        specifier: 6.0.0
+        version: 6.0.0
       browser-image-resizer:
         specifier: github:misskey-dev/browser-image-resizer
         version: github.com/misskey-dev/browser-image-resizer/5a70660c2ac8aad3d436bfa67a5e7f7c8946cac4
@@ -735,8 +756,8 @@ importers:
         specifier: 7.0.3
         version: 7.0.3
       cypress:
-        specifier: 10.11.0
-        version: 10.11.0
+        specifier: 13.5.1
+        version: 13.5.1
       date-fns:
         specifier: 2.30.0
         version: 2.30.0
@@ -748,10 +769,10 @@ importers:
         version: 0.0.1
       eslint-config-prettier:
         specifier: 9.0.0
-        version: 9.0.0(eslint@8.46.0)
+        version: 9.0.0(eslint@8.53.0)
       eslint-plugin-file-progress:
         specifier: ^1.3.0
-        version: 1.3.0(eslint@8.46.0)
+        version: 1.3.0(eslint@8.53.0)
       eventemitter3:
         specifier: 5.0.1
         version: 5.0.1
@@ -762,11 +783,11 @@ importers:
         specifier: workspace:*
         version: link:../firefish-js
       focus-trap:
-        specifier: ^7.5.2
-        version: 7.5.2
+        specifier: ^7.5.4
+        version: 7.5.4
       focus-trap-vue:
-        specifier: ^4.0.2
-        version: 4.0.2(focus-trap@7.5.2)(vue@3.3.4)
+        specifier: ^4.0.3
+        version: 4.0.3(focus-trap@7.5.4)(vue@3.3.8)
       gsap:
         specifier: ^3.12.2
         version: 3.12.2
@@ -780,8 +801,8 @@ importers:
         specifier: 2.2.3
         version: 2.2.3
       katex:
-        specifier: 0.16.8
-        version: 0.16.8
+        specifier: 0.16.9
+        version: 0.16.9
       libopenmpt-wasm:
         specifier: github:TheEssem/libopenmpt-packaging#build
         version: github.com/TheEssem/libopenmpt-packaging/d05d151a72b638c6312227af0417aca69521172c
@@ -792,11 +813,11 @@ importers:
         specifier: 0.23.3
         version: 0.23.3
       photoswipe:
-        specifier: 5.3.9
-        version: 5.3.9
+        specifier: 5.4.2
+        version: 5.4.2
       prettier:
-        specifier: 3.0.3
-        version: 3.0.3
+        specifier: 3.1.0
+        version: 3.1.0
       prettier-plugin-vue:
         specifier: 1.1.6
         version: 1.1.6
@@ -804,20 +825,20 @@ importers:
         specifier: 1.29.0
         version: 1.29.0
       punycode:
-        specifier: 2.3.0
-        version: 2.3.0
+        specifier: 2.3.1
+        version: 2.3.1
       rndstr:
         specifier: 1.0.0
         version: 1.0.0
       rollup:
-        specifier: 3.28.1
-        version: 3.28.1
+        specifier: 4.4.1
+        version: 4.4.1
       s-age:
         specifier: 1.1.2
         version: 1.1.2
       sass:
-        specifier: 1.66.1
-        version: 1.66.1
+        specifier: 1.69.5
+        version: 1.69.5
       seedrandom:
         specifier: 3.0.5
         version: 3.0.5
@@ -828,8 +849,8 @@ importers:
         specifier: 2.1.0
         version: 2.1.0
       swiper:
-        specifier: 10.2.0
-        version: 10.2.0
+        specifier: 11.0.4
+        version: 11.0.4
       syuilo-password-strength:
         specifier: 0.0.1
         version: 0.0.1
@@ -837,8 +858,8 @@ importers:
         specifier: 3.1.0
         version: 3.1.0
       three:
-        specifier: 0.156.0
-        version: 0.156.0
+        specifier: 0.158.0
+        version: 0.158.0
       throttle-debounce:
         specifier: 5.0.0
         version: 5.0.0
@@ -849,8 +870,8 @@ importers:
         specifier: ^1.3.4
         version: 1.3.4
       tsc-alias:
-        specifier: 1.8.7
-        version: 1.8.7
+        specifier: 1.8.8
+        version: 1.8.8
       tsconfig-paths:
         specifier: 4.2.0
         version: 4.2.0
@@ -864,23 +885,23 @@ importers:
         specifier: ^0.4.0
         version: 0.4.0
       uuid:
-        specifier: 9.0.0
-        version: 9.0.0
+        specifier: 9.0.1
+        version: 9.0.1
       vanilla-tilt:
         specifier: 1.8.1
         version: 1.8.1
       vite:
-        specifier: 4.4.9
-        version: 4.4.9(@types/node@20.5.8)(sass@1.66.1)
+        specifier: 5.0.0
+        version: 5.0.0(@types/node@20.9.0)(sass@1.69.5)
       vite-plugin-compression:
         specifier: ^0.5.1
-        version: 0.5.1(vite@4.4.9)
+        version: 0.5.1(vite@5.0.0)
       vue:
-        specifier: 3.3.4
-        version: 3.3.4
+        specifier: 3.3.8
+        version: 3.3.8(typescript@5.2.2)
       vue-draggable-plus:
-        specifier: ^0.2.6
-        version: 0.2.6(@types/sortablejs@1.15.1)
+        specifier: ^0.2.7
+        version: 0.2.7(@types/sortablejs@1.15.4)
       vue-isyourpasswordsafe:
         specifier: ^2.0.0
         version: 2.0.0
@@ -889,66 +910,178 @@ importers:
         version: 7.0.0
       vue-prism-editor:
         specifier: 2.0.0-alpha.2
-        version: 2.0.0-alpha.2(vue@3.3.4)
+        version: 2.0.0-alpha.2(vue@3.3.8)
 
   packages/firefish-js:
     dependencies:
       eventemitter3:
-        specifier: ^4.0.7
-        version: 4.0.7
-      reconnecting-websocket:
-        specifier: ^4.4.0
-        version: 4.4.0
-      semver:
-        specifier: ^7.3.8
-        version: 7.5.4
+        specifier: ^5.0.1
+        version: 5.0.1
+      reconnecting:
+        specifier: ^4.4.1
+        version: 4.4.1
     optionalDependencies:
       '@swc/core-android-arm64':
         specifier: 1.3.11
         version: 1.3.11
     devDependencies:
-      '@microsoft/api-documenter':
-        specifier: ^7.22.21
-        version: 7.22.21(@types/node@20.3.1)
-      '@microsoft/api-extractor':
-        specifier: ^7.36.0
-        version: 7.36.0(@types/node@20.3.1)
       '@swc/cli':
-        specifier: ^0.1.62
-        version: 0.1.62(@swc/core@1.3.78)(chokidar@3.3.1)
+        specifier: ^0.1.63
+        version: 0.1.63(@swc/core@1.3.78)(chokidar@3.3.1)
       '@swc/core':
         specifier: 1.3.78
         version: 1.3.78
+      '@swc/types':
+        specifier: ^0.1.5
+        version: 0.1.5
       '@types/jest':
-        specifier: ^27.4.0
-        version: 27.4.0
+        specifier: ^29.5.8
+        version: 29.5.8
       '@types/node':
-        specifier: 20.3.1
-        version: 20.3.1
+        specifier: 20.9.0
+        version: 20.9.0
       jest:
-        specifier: ^27.4.5
-        version: 27.4.5(ts-node@10.4.0)
+        specifier: ^29.7.0
+        version: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
       jest-fetch-mock:
         specifier: ^3.0.3
         version: 3.0.3
       jest-websocket-mock:
-        specifier: ^2.2.1
-        version: 2.2.1(mock-socket@9.0.8)
+        specifier: ^2.5.0
+        version: 2.5.0
       mock-socket:
-        specifier: ^9.0.8
-        version: 9.0.8
+        specifier: ^9.3.1
+        version: 9.3.1
       ts-jest:
-        specifier: ^27.1.2
-        version: 27.1.2(@babel/core@7.22.10)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3)
+        specifier: ^29.1.1
+        version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.2.2)
       ts-node:
-        specifier: 10.4.0
-        version: 10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3)
+        specifier: 10.9.1
+        version: 10.9.1(@swc/core@1.3.78)(@types/node@20.9.0)(typescript@5.2.2)
       tsd:
-        specifier: ^0.28.1
-        version: 0.28.1
+        specifier: ^0.29.0
+        version: 0.29.0
       typescript:
-        specifier: 5.1.3
-        version: 5.1.3
+        specifier: 5.2.2
+        version: 5.2.2
+
+  packages/megalodon:
+    dependencies:
+      '@types/oauth':
+        specifier: ^0.9.0
+        version: 0.9.1
+      '@types/ws':
+        specifier: ^8.5.4
+        version: 8.5.5
+      async-lock:
+        specifier: 1.4.0
+        version: 1.4.0
+      axios:
+        specifier: 1.2.2
+        version: 1.2.2
+      dayjs:
+        specifier: ^1.11.7
+        version: 1.11.10
+      form-data:
+        specifier: ^4.0.0
+        version: 4.0.0
+      https-proxy-agent:
+        specifier: ^5.0.1
+        version: 5.0.1
+      oauth:
+        specifier: ^0.10.0
+        version: 0.10.0
+      object-assign-deep:
+        specifier: ^0.4.0
+        version: 0.4.0
+      parse-link-header:
+        specifier: ^2.0.0
+        version: 2.0.0
+      socks-proxy-agent:
+        specifier: ^7.0.0
+        version: 7.0.0
+      typescript:
+        specifier: 4.9.4
+        version: 4.9.4
+      uuid:
+        specifier: ^9.0.0
+        version: 9.0.0
+      ws:
+        specifier: 8.12.0
+        version: 8.12.0
+    devDependencies:
+      '@types/async-lock':
+        specifier: 1.4.0
+        version: 1.4.0
+      '@types/core-js':
+        specifier: ^2.5.0
+        version: 2.5.7
+      '@types/form-data':
+        specifier: ^2.5.0
+        version: 2.5.0
+      '@types/jest':
+        specifier: ^29.4.0
+        version: 29.5.6
+      '@types/node':
+        specifier: 18.11.18
+        version: 18.11.18
+      '@types/object-assign-deep':
+        specifier: ^0.4.0
+        version: 0.4.2
+      '@types/parse-link-header':
+        specifier: ^2.0.0
+        version: 2.0.2
+      '@types/uuid':
+        specifier: ^9.0.0
+        version: 9.0.3
+      '@typescript-eslint/eslint-plugin':
+        specifier: ^5.49.0
+        version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.4)
+      '@typescript-eslint/parser':
+        specifier: ^5.49.0
+        version: 5.62.0(eslint@8.46.0)(typescript@4.9.4)
+      eslint:
+        specifier: ^8.32.0
+        version: 8.46.0
+      eslint-config-prettier:
+        specifier: ^8.6.0
+        version: 8.9.0(eslint@8.46.0)
+      eslint-config-standard:
+        specifier: ^16.0.3
+        version: 16.0.3(eslint-plugin-import@2.28.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.46.0)
+      eslint-plugin-import:
+        specifier: ^2.27.5
+        version: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)
+      eslint-plugin-node:
+        specifier: ^11.0.0
+        version: 11.1.0(eslint@8.46.0)
+      eslint-plugin-prettier:
+        specifier: ^4.2.1
+        version: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@2.8.8)
+      eslint-plugin-promise:
+        specifier: ^6.1.1
+        version: 6.1.1(eslint@8.46.0)
+      eslint-plugin-standard:
+        specifier: ^5.0.0
+        version: 5.0.0(eslint@8.46.0)
+      jest:
+        specifier: ^29.4.0
+        version: 29.7.0(@types/node@18.11.18)
+      jest-worker:
+        specifier: ^29.4.0
+        version: 29.7.0
+      lodash:
+        specifier: ^4.17.14
+        version: 4.17.21
+      prettier:
+        specifier: ^2.8.3
+        version: 2.8.8
+      ts-jest:
+        specifier: ^29.0.5
+        version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.4)
+      typedoc:
+        specifier: ^0.23.24
+        version: 0.23.28(typescript@4.9.4)
 
   packages/sw:
     optionalDependencies:
@@ -957,8 +1090,8 @@ importers:
         version: 1.3.11
     devDependencies:
       '@swc/cli':
-        specifier: ^0.1.62
-        version: 0.1.62(@swc/core@1.3.78)(chokidar@3.3.1)
+        specifier: ^0.1.63
+        version: 0.1.63(@swc/core@1.3.78)(chokidar@3.3.1)
       '@swc/core':
         specifier: 1.3.78
         version: 1.3.78
@@ -969,11 +1102,11 @@ importers:
         specifier: ^6.2.1
         version: 6.2.1
       vite:
-        specifier: 4.4.9
-        version: 4.4.9(@types/node@20.5.8)(sass@1.66.1)
+        specifier: 5.0.0
+        version: 5.0.0(@types/node@20.9.0)(sass@1.69.5)
       vite-plugin-compression:
         specifier: ^0.5.1
-        version: 0.5.1(vite@4.4.9)
+        version: 0.5.1(vite@5.0.0)
 
 packages:
 
@@ -987,7 +1120,7 @@ packages:
     engines: {node: '>=6.0.0'}
     dependencies:
       '@jridgewell/gen-mapping': 0.3.3
-      '@jridgewell/trace-mapping': 0.3.19
+      '@jridgewell/trace-mapping': 0.3.20
 
   /@babel/code-frame@7.22.10:
     resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==}
@@ -996,10 +1129,23 @@ packages:
       '@babel/highlight': 7.22.10
       chalk: 2.4.2
 
+  /@babel/code-frame@7.22.13:
+    resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/highlight': 7.22.20
+      chalk: 2.4.2
+    dev: true
+
   /@babel/compat-data@7.22.9:
     resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/compat-data@7.23.2:
+    resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/core@7.22.10:
     resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==}
     engines: {node: '>=6.9.0'}
@@ -1022,16 +1168,53 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
-  /@babel/eslint-parser@7.22.10(@babel/core@7.22.10)(eslint@8.46.0):
+  /@babel/core@7.23.2:
+    resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@ampproject/remapping': 2.2.1
+      '@babel/code-frame': 7.22.13
+      '@babel/generator': 7.23.0
+      '@babel/helper-compilation-targets': 7.22.15
+      '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+      '@babel/helpers': 7.23.2
+      '@babel/parser': 7.23.0
+      '@babel/template': 7.22.15
+      '@babel/traverse': 7.23.2
+      '@babel/types': 7.23.0
+      convert-source-map: 2.0.0
+      debug: 4.3.4(supports-color@8.1.1)
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/eslint-parser@7.22.10(@babel/core@7.23.2)(eslint@8.53.0):
     resolution: {integrity: sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==}
     engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
     peerDependencies:
       '@babel/core': ^7.11.0
       eslint: ^7.5.0 || ^8.0.0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
-      eslint: 8.46.0
+      eslint: 8.53.0
+      eslint-visitor-keys: 2.1.0
+      semver: 6.3.1
+    dev: true
+
+  /@babel/eslint-parser@7.23.3(@babel/core@7.23.2)(eslint@8.53.0):
+    resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+    peerDependencies:
+      '@babel/core': ^7.11.0
+      eslint: ^7.5.0 || ^8.0.0
+    dependencies:
+      '@babel/core': 7.23.2
+      '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+      eslint: 8.53.0
       eslint-visitor-keys: 2.1.0
       semver: 6.3.1
     dev: true
@@ -1042,9 +1225,19 @@ packages:
     dependencies:
       '@babel/types': 7.22.10
       '@jridgewell/gen-mapping': 0.3.3
-      '@jridgewell/trace-mapping': 0.3.19
+      '@jridgewell/trace-mapping': 0.3.20
       jsesc: 2.5.2
 
+  /@babel/generator@7.23.0:
+    resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.23.0
+      '@jridgewell/gen-mapping': 0.3.3
+      '@jridgewell/trace-mapping': 0.3.20
+      jsesc: 2.5.2
+    dev: true
+
   /@babel/helper-compilation-targets@7.22.10:
     resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==}
     engines: {node: '>=6.9.0'}
@@ -1055,6 +1248,22 @@ packages:
       lru-cache: 5.1.1
       semver: 6.3.1
 
+  /@babel/helper-compilation-targets@7.22.15:
+    resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/compat-data': 7.23.2
+      '@babel/helper-validator-option': 7.22.15
+      browserslist: 4.22.1
+      lru-cache: 5.1.1
+      semver: 6.3.1
+    dev: true
+
+  /@babel/helper-environment-visitor@7.22.20:
+    resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/helper-environment-visitor@7.22.5:
     resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
     engines: {node: '>=6.9.0'}
@@ -1066,12 +1275,27 @@ packages:
       '@babel/template': 7.22.5
       '@babel/types': 7.22.10
 
+  /@babel/helper-function-name@7.23.0:
+    resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.22.15
+      '@babel/types': 7.23.0
+    dev: true
+
   /@babel/helper-hoist-variables@7.22.5:
     resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/types': 7.22.10
 
+  /@babel/helper-module-imports@7.22.15:
+    resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.23.0
+    dev: true
+
   /@babel/helper-module-imports@7.22.5:
     resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
     engines: {node: '>=6.9.0'}
@@ -1091,6 +1315,20 @@ packages:
       '@babel/helper-split-export-declaration': 7.22.6
       '@babel/helper-validator-identifier': 7.22.5
 
+  /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
+    resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.23.2
+      '@babel/helper-environment-visitor': 7.22.20
+      '@babel/helper-module-imports': 7.22.15
+      '@babel/helper-simple-access': 7.22.5
+      '@babel/helper-split-export-declaration': 7.22.6
+      '@babel/helper-validator-identifier': 7.22.20
+    dev: true
+
   /@babel/helper-plugin-utils@7.22.5:
     resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
     engines: {node: '>=6.9.0'}
@@ -1111,10 +1349,20 @@ packages:
     resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/helper-validator-identifier@7.22.20:
+    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/helper-validator-identifier@7.22.5:
     resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
     engines: {node: '>=6.9.0'}
 
+  /@babel/helper-validator-option@7.22.15:
+    resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
   /@babel/helper-validator-option@7.22.5:
     resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
     engines: {node: '>=6.9.0'}
@@ -1129,6 +1377,17 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/helpers@7.23.2:
+    resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.22.15
+      '@babel/traverse': 7.23.2
+      '@babel/types': 7.23.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@babel/highlight@7.22.10:
     resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==}
     engines: {node: '>=6.9.0'}
@@ -1137,6 +1396,15 @@ packages:
       chalk: 2.4.2
       js-tokens: 4.0.0
 
+  /@babel/highlight@7.22.20:
+    resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-validator-identifier': 7.22.20
+      chalk: 2.4.2
+      js-tokens: 4.0.0
+    dev: true
+
   /@babel/parser@7.22.10:
     resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==}
     engines: {node: '>=6.0.0'}
@@ -1144,6 +1412,14 @@ packages:
     dependencies:
       '@babel/types': 7.22.10
 
+  /@babel/parser@7.23.0:
+    resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.23.0
+    dev: true
+
   /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.10):
     resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
     engines: {node: '>=6.9.0'}
@@ -1155,30 +1431,30 @@ packages:
       '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10)
     dev: false
 
-  /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10):
+  /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2):
     resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10):
+  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2):
     resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
@@ -1191,95 +1467,105 @@ packages:
       '@babel/helper-plugin-utils': 7.22.5
     dev: false
 
-  /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10):
+  /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2):
     resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10):
+  /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2):
+    resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.23.2
+      '@babel/helper-plugin-utils': 7.22.5
+    dev: true
+
+  /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2):
     resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10):
+  /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2):
     resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10):
+  /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2):
     resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10):
+  /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2):
     resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
-  /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10):
+  /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2):
     resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
     dependencies:
-      '@babel/core': 7.22.10
+      '@babel/core': 7.23.2
       '@babel/helper-plugin-utils': 7.22.5
     dev: true
 
@@ -1301,6 +1587,22 @@ packages:
     dependencies:
       regenerator-runtime: 0.14.0
 
+  /@babel/runtime@7.23.2:
+    resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      regenerator-runtime: 0.14.0
+    dev: true
+
+  /@babel/template@7.22.15:
+    resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.22.13
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
+    dev: true
+
   /@babel/template@7.22.5:
     resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
     engines: {node: '>=6.9.0'}
@@ -1326,6 +1628,24 @@ packages:
     transitivePeerDependencies:
       - supports-color
 
+  /@babel/traverse@7.23.2:
+    resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.22.13
+      '@babel/generator': 7.23.0
+      '@babel/helper-environment-visitor': 7.22.20
+      '@babel/helper-function-name': 7.23.0
+      '@babel/helper-hoist-variables': 7.22.5
+      '@babel/helper-split-export-declaration': 7.22.6
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
+      debug: 4.3.4(supports-color@8.1.1)
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@babel/types@7.22.10:
     resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==}
     engines: {node: '>=6.9.0'}
@@ -1334,90 +1654,63 @@ packages:
       '@babel/helper-validator-identifier': 7.22.5
       to-fast-properties: 2.0.0
 
+  /@babel/types@7.23.0:
+    resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.22.5
+      '@babel/helper-validator-identifier': 7.22.20
+      to-fast-properties: 2.0.0
+    dev: true
+
   /@bcoe/v8-coverage@0.2.3:
     resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
     dev: true
 
-  /@biomejs/biome@1.0.0:
-    resolution: {integrity: sha512-Y5CND1QZ5pF6hc4dFw5ItDutv9KJO91ksLdBIFyvHL7LmXN0UomqyyRWryvrqq+YlA8Q58cR6sqjjQuMp9E2Ig==}
+  /@biomejs/biome@1.3.3:
+    resolution: {integrity: sha512-vTJn7RBzLWIabUuUIoEopO860YyBrbPEu4Pztfd28jRU5QD074hKZ9IQs24pFO6A2R296gaeYmN62f4u7pUruQ==}
     engines: {node: '>=14.*'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@biomejs/cli-darwin-arm64': 1.0.0
-      '@biomejs/cli-darwin-x64': 1.0.0
-      '@biomejs/cli-linux-arm64': 1.0.0
-      '@biomejs/cli-linux-x64': 1.0.0
-      '@biomejs/cli-win32-arm64': 1.0.0
-      '@biomejs/cli-win32-x64': 1.0.0
+      '@biomejs/cli-darwin-arm64': 1.3.3
+      '@biomejs/cli-darwin-x64': 1.3.3
+      '@biomejs/cli-linux-arm64': 1.3.3
+      '@biomejs/cli-linux-x64': 1.3.3
+      '@biomejs/cli-win32-arm64': 1.3.3
+      '@biomejs/cli-win32-x64': 1.3.3
     dev: true
 
-  /@biomejs/cli-darwin-arm64@1.0.0:
-    resolution: {integrity: sha512-3v7kEyxkf3D246esH+q/lDK5wWn+xLCXZpHCuc1itAmC35GkEc6S7um6C1VD3XKXLx6N0sJR/rTmjKiRGV32Ig==}
-    engines: {node: '>=14.*'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@biomejs/cli-darwin-arm64@1.2.2:
-    resolution: {integrity: sha512-Fx1IURKhoqH6wPawtKLT6wcfMSjRRcNK8+VWau0iDOjXvNtjJpSmICbU89B7Vt/gZRwPqkfDMBkFwm6V5vFTSQ==}
+  /@biomejs/cli-darwin-arm64@1.3.3:
+    resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==}
     engines: {node: '>=14.*'}
     cpu: [arm64]
     os: [darwin]
     dev: true
 
-  /@biomejs/cli-darwin-x64@1.0.0:
-    resolution: {integrity: sha512-uxIMt/X7TQWicjsImkqMvUUEqaFZTOJJrtEhlHl/eIaETWJmK3uAR7ihIWctpGJnN16sUgpLgwczc7FETqu/PQ==}
-    engines: {node: '>=14.*'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@biomejs/cli-darwin-x64@1.2.2:
-    resolution: {integrity: sha512-JNaAFOI/ZisnmzvcFNd73geJxaFaN2L4YsWM6cgBeKyLY/ycl9C/PBTFfEmeB1c7f5XIIal8P2cj47kLJpN5Ig==}
+  /@biomejs/cli-darwin-x64@1.3.3:
+    resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==}
     engines: {node: '>=14.*'}
     cpu: [x64]
     os: [darwin]
     dev: true
 
-  /@biomejs/cli-linux-arm64@1.0.0:
-    resolution: {integrity: sha512-kJWtu3Xr4MdHV2Yn4U+eZudAGPgv0kRCjWAyzLRewJiqE5TLPrX08imB9SU1n3+VxNO8e2JJ0tWWBHo4J+aSEg==}
-    engines: {node: '>=14.*'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@biomejs/cli-linux-arm64@1.2.2:
-    resolution: {integrity: sha512-JHXRnfhOLx8UO/Fcyn2c5pFRri0XKqRZm2wf5oH5GSfLVpckDw2X15dYGbu3nmfM/3pcAaTV46pUpjrCnaAieg==}
+  /@biomejs/cli-linux-arm64@1.3.3:
+    resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==}
     engines: {node: '>=14.*'}
     cpu: [arm64]
     os: [linux]
     dev: true
 
-  /@biomejs/cli-linux-x64@1.0.0:
-    resolution: {integrity: sha512-FK6hYZ0Lkk39eXYx1+2ZWtLkApc0RdOpcjDVM96JbvI0bxqvNnm193BPXuxh5A/fCl6N28RNUvcKnZ5LbgZ0Yw==}
-    engines: {node: '>=14.*'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@biomejs/cli-linux-x64@1.2.2:
-    resolution: {integrity: sha512-5Zr+iM7lUKsw81p9PkXRESuH2/AhRZ6RCWkgE+FSLcxMhXy/4RDR+o2YQDsJM6cWKIzOJM05vDHTGrDq7vXE4A==}
+  /@biomejs/cli-linux-x64@1.3.3:
+    resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==}
     engines: {node: '>=14.*'}
     cpu: [x64]
     os: [linux]
     dev: true
 
-  /@biomejs/cli-win32-arm64@1.0.0:
-    resolution: {integrity: sha512-kE+OY2isEJHBodiLPMlybZckHkl3CQWsvXuJEvSxkoMhLbGDPEV3yZ/0lEph3BlxP3KP5vUO3hOFGaTvHFOuqQ==}
+  /@biomejs/cli-win32-arm64@1.3.3:
+    resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==}
     engines: {node: '>=14.*'}
     cpu: [arm64]
     os: [win32]
@@ -1425,8 +1718,8 @@ packages:
     dev: true
     optional: true
 
-  /@biomejs/cli-win32-x64@1.0.0:
-    resolution: {integrity: sha512-Ko6ZsbmbScPMEnh/xz4mwDSCZIUCAEjbbbnUVApgAAL2+1Hoe7Vnhh2RiwYRqy3tHrBIMDwXkSxj0vlf1G3EHg==}
+  /@biomejs/cli-win32-x64@1.3.3:
+    resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==}
     engines: {node: '>=14.*'}
     cpu: [x64]
     os: [win32]
@@ -1434,26 +1727,26 @@ packages:
     dev: true
     optional: true
 
-  /@bull-board/api@5.8.0(@bull-board/ui@5.8.0):
-    resolution: {integrity: sha512-jHJ7Mw/CHixNgIsrbUihyYVxIdlM/lzii+ZUo7E8CFEsOCjE+Um5RDr9boYghWVHuJykkLy7b+wPvbnTwmX0SA==}
+  /@bull-board/api@5.9.1(@bull-board/ui@5.9.1):
+    resolution: {integrity: sha512-xZzPYNw9Dp46It4vvZv3tmFScmUu/UT/jWQxYK9cvbkJRXh15rsZrbbR+/phUqou0NxRQGiHoFSZ1y5D107dIA==}
     peerDependencies:
-      '@bull-board/ui': 5.8.0
+      '@bull-board/ui': 5.9.1
     dependencies:
-      '@bull-board/ui': 5.8.0
+      '@bull-board/ui': 5.9.1
       redis-info: 3.1.0
     dev: false
 
-  /@bull-board/koa@5.8.0(@types/koa@2.13.8)(pug@3.0.2):
-    resolution: {integrity: sha512-r7v+PxDklRoDhhTu+h0I1LElxgfd9QUqyD6auJNMMsxDKjvCCLFwDWgzAzav0m2bG0XX5MM3dsEiFJnY8a8bYA==}
+  /@bull-board/koa@5.9.1(@types/koa@2.13.11)(pug@3.0.2):
+    resolution: {integrity: sha512-PV2b6SQYu5/QSh65+QxbNsBmCP406qXrjUIp09cG7A+/aaTpdThDju5EgXIoe9VGPPG1CZMZ4eVOR8UT5D7H5A==}
     dependencies:
-      '@bull-board/api': 5.8.0(@bull-board/ui@5.8.0)
-      '@bull-board/ui': 5.8.0
+      '@bull-board/api': 5.9.1(@bull-board/ui@5.9.1)
+      '@bull-board/ui': 5.9.1
       ejs: 3.1.9
       koa: 2.14.2
       koa-mount: 4.0.0
       koa-router: 10.1.1
       koa-static: 5.0.0
-      koa-views: 7.0.2(@types/koa@2.13.8)(ejs@3.1.9)(pug@3.0.2)
+      koa-views: 7.0.2(@types/koa@2.13.11)(ejs@3.1.9)(pug@3.0.2)
     transitivePeerDependencies:
       - '@types/koa'
       - arc-templates
@@ -1511,12 +1804,60 @@ packages:
       - whiskers
     dev: false
 
-  /@bull-board/ui@5.8.0:
-    resolution: {integrity: sha512-O2imjnV7KFictoy6FsrG2y5u10Z60BIuX+nghLbhdEkZL/B4B2VUM+655d9wMIpjXocXkr2DN5ELJkUXewl9wQ==}
+  /@bull-board/ui@5.9.1:
+    resolution: {integrity: sha512-lL93KVRTpLSl73KUFBw7sXOcCrqddGBbpiMKWEbViXxObIq68yFuhRrcfR7JeTSocLF5GsnqSVdSiNCZHmdNpw==}
     dependencies:
-      '@bull-board/api': 5.8.0(@bull-board/ui@5.8.0)
+      '@bull-board/api': 5.9.1(@bull-board/ui@5.9.1)
     dev: false
 
+  /@cbor-extract/cbor-extract-darwin-arm64@2.1.1:
+    resolution: {integrity: sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@cbor-extract/cbor-extract-darwin-x64@2.1.1:
+    resolution: {integrity: sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@cbor-extract/cbor-extract-linux-arm64@2.1.1:
+    resolution: {integrity: sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@cbor-extract/cbor-extract-linux-arm@2.1.1:
+    resolution: {integrity: sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@cbor-extract/cbor-extract-linux-x64@2.1.1:
+    resolution: {integrity: sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
+    optional: true
+
+  /@cbor-extract/cbor-extract-win32-x64@2.1.1:
+    resolution: {integrity: sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: false
+    optional: true
+
   /@chainsafe/is-ip@2.0.2:
     resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==}
     dev: false
@@ -1616,26 +1957,14 @@ packages:
     resolution: {integrity: sha512-mrUTA3LbEq1Y3nPTC5X6koTd2Dk8P+6xTuhp4P8X3mg5Z7d8AVK+0OU5kbB49OLAaEfvGEqbZJ84rLwgMy9RHw==}
     dev: true
 
-  /@cspotcode/source-map-consumer@0.8.0:
-    resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==}
-    engines: {node: '>= 12'}
-    dev: true
-
-  /@cspotcode/source-map-support@0.7.0:
-    resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==}
-    engines: {node: '>=12'}
-    dependencies:
-      '@cspotcode/source-map-consumer': 0.8.0
-    dev: true
-
   /@cspotcode/source-map-support@0.8.1:
     resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
     engines: {node: '>=12'}
     dependencies:
       '@jridgewell/trace-mapping': 0.3.9
 
-  /@cypress/request@2.88.12:
-    resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==}
+  /@cypress/request@3.0.1:
+    resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==}
     engines: {node: '>= 6'}
     dependencies:
       aws-sign2: 0.7.0
@@ -1686,29 +2015,41 @@ packages:
       twemoji-parser: 14.0.0
       universalify: 0.1.2
 
-  /@elastic/elasticsearch@7.17.0:
-    resolution: {integrity: sha512-5QLPCjd0uLmLj1lSuKSThjNpq39f6NmlTy9ROLFwG5gjyTgpwSqufDeYG/Fm43Xs05uF7WcscoO7eguI3HuuYA==}
-    engines: {node: '>=12'}
+  /@elastic/elasticsearch@8.10.0:
+    resolution: {integrity: sha512-RIEyqz0D18bz/dK+wJltaak+7wKaxDELxuiwOJhuMrvbrBsYDFnEoTdP/TZ0YszHBgnRPGqBDBgH/FHNgHObiQ==}
+    engines: {node: '>=14'}
     dependencies:
-      debug: 4.3.4(supports-color@8.1.1)
-      hpagent: 0.1.2
-      ms: 2.1.3
-      secure-json-parse: 2.7.0
+      '@elastic/transport': 8.3.4
+      tslib: 2.6.1
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@es-joy/jsdoccomment@0.40.1:
-    resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==}
+  /@elastic/transport@8.3.4:
+    resolution: {integrity: sha512-+0o8o74sbzu3BO7oOZiP9ycjzzdOt4QwmMEjFc1zfO7M0Fh7QX1xrpKqZbSd8vBwihXNlSq/EnMPfgD2uFEmFg==}
+    engines: {node: '>=14'}
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      hpagent: 1.2.0
+      ms: 2.1.3
+      secure-json-parse: 2.7.0
+      tslib: 2.6.1
+      undici: 5.23.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
+  /@es-joy/jsdoccomment@0.41.0:
+    resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==}
     engines: {node: '>=16'}
     dependencies:
-      comment-parser: 1.4.0
+      comment-parser: 1.4.1
       esquery: 1.5.0
       jsdoc-type-pratt-parser: 4.0.0
     dev: true
 
-  /@esbuild/android-arm64@0.18.20:
-    resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+  /@esbuild/android-arm64@0.19.5:
+    resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]
@@ -1716,8 +2057,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-arm@0.18.20:
-    resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+  /@esbuild/android-arm@0.19.5:
+    resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
@@ -1725,8 +2066,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-x64@0.18.20:
-    resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+  /@esbuild/android-x64@0.19.5:
+    resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
@@ -1734,8 +2075,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/darwin-arm64@0.18.20:
-    resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+  /@esbuild/darwin-arm64@0.19.5:
+    resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]
@@ -1743,8 +2084,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/darwin-x64@0.18.20:
-    resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+  /@esbuild/darwin-x64@0.19.5:
+    resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
@@ -1752,8 +2093,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/freebsd-arm64@0.18.20:
-    resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+  /@esbuild/freebsd-arm64@0.19.5:
+    resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]
@@ -1761,8 +2102,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/freebsd-x64@0.18.20:
-    resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+  /@esbuild/freebsd-x64@0.19.5:
+    resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
@@ -1770,8 +2111,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-arm64@0.18.20:
-    resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+  /@esbuild/linux-arm64@0.19.5:
+    resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]
@@ -1779,8 +2120,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-arm@0.18.20:
-    resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+  /@esbuild/linux-arm@0.19.5:
+    resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]
@@ -1788,8 +2129,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-ia32@0.18.20:
-    resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+  /@esbuild/linux-ia32@0.19.5:
+    resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]
@@ -1797,8 +2138,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64@0.18.20:
-    resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+  /@esbuild/linux-loong64@0.19.5:
+    resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -1806,8 +2147,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-mips64el@0.18.20:
-    resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+  /@esbuild/linux-mips64el@0.19.5:
+    resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]
@@ -1815,8 +2156,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-ppc64@0.18.20:
-    resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+  /@esbuild/linux-ppc64@0.19.5:
+    resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]
@@ -1824,8 +2165,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-riscv64@0.18.20:
-    resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+  /@esbuild/linux-riscv64@0.19.5:
+    resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]
@@ -1833,8 +2174,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-s390x@0.18.20:
-    resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+  /@esbuild/linux-s390x@0.19.5:
+    resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]
@@ -1842,8 +2183,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-x64@0.18.20:
-    resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+  /@esbuild/linux-x64@0.19.5:
+    resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]
@@ -1851,8 +2192,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/netbsd-x64@0.18.20:
-    resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+  /@esbuild/netbsd-x64@0.19.5:
+    resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
@@ -1860,8 +2201,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/openbsd-x64@0.18.20:
-    resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+  /@esbuild/openbsd-x64@0.19.5:
+    resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
@@ -1869,8 +2210,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/sunos-x64@0.18.20:
-    resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+  /@esbuild/sunos-x64@0.19.5:
+    resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
@@ -1878,8 +2219,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-arm64@0.18.20:
-    resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+  /@esbuild/win32-arm64@0.19.5:
+    resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]
@@ -1887,8 +2228,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-ia32@0.18.20:
-    resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+  /@esbuild/win32-ia32@0.19.5:
+    resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
@@ -1896,8 +2237,8 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-x64@0.18.20:
-    resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+  /@esbuild/win32-x64@0.19.5:
+    resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]
@@ -1912,7 +2253,17 @@ packages:
       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
     dependencies:
       eslint: 8.46.0
-      eslint-visitor-keys: 3.4.2
+      eslint-visitor-keys: 3.4.3
+    dev: true
+
+  /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0):
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+    dependencies:
+      eslint: 8.53.0
+      eslint-visitor-keys: 3.4.3
     dev: true
 
   /@eslint-community/regexpp@4.6.2:
@@ -1920,29 +2271,34 @@ packages:
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
     dev: true
 
-  /@eslint-sets/eslint-config-basic@3.3.0(@babel/core@7.22.10)(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(prettier@3.0.3):
+  /@eslint-community/regexpp@4.9.1:
+    resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+    dev: true
+
+  /@eslint-sets/eslint-config-basic@3.3.0(@babel/core@7.23.2)(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(prettier@3.1.0):
     resolution: {integrity: sha512-x5YH0CvZJxn19/5ehu188XaoLQpxOGlFiIuPHCN6FyONgrmriakT/cmIIBOJg2Vi/y1bn2xbhsgVNb00J3HyTg==}
     peerDependencies:
       eslint: '>=8.0.0'
       prettier: '>=2.0.0'
     dependencies:
-      '@babel/eslint-parser': 7.22.10(@babel/core@7.22.10)(eslint@8.46.0)
-      eslint: 8.46.0
-      eslint-config-prettier: 8.9.0(eslint@8.46.0)
-      eslint-plugin-eslint-comments: 3.2.0(eslint@8.46.0)
+      '@babel/eslint-parser': 7.22.10(@babel/core@7.23.2)(eslint@8.53.0)
+      eslint: 8.53.0
+      eslint-config-prettier: 8.9.0(eslint@8.53.0)
+      eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0)
       eslint-plugin-html: 7.1.0
-      eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)
-      eslint-plugin-jsonc: 2.9.0(eslint@8.46.0)
-      eslint-plugin-markdown: 3.0.1(eslint@8.46.0)
-      eslint-plugin-n: 15.7.0(eslint@8.46.0)
-      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3)
-      eslint-plugin-promise: 5.2.0(eslint@8.46.0)
+      eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)
+      eslint-plugin-jsonc: 2.9.0(eslint@8.53.0)
+      eslint-plugin-markdown: 3.0.1(eslint@8.53.0)
+      eslint-plugin-n: 15.7.0(eslint@8.53.0)
+      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.53.0)(prettier@3.1.0)
+      eslint-plugin-promise: 5.2.0(eslint@8.53.0)
       eslint-plugin-tsdoc: 0.2.17
-      eslint-plugin-unicorn: 45.0.2(eslint@8.46.0)
-      eslint-plugin-yml: 1.8.0(eslint@8.46.0)
+      eslint-plugin-unicorn: 45.0.2(eslint@8.53.0)
+      eslint-plugin-yml: 1.8.0(eslint@8.53.0)
       jsonc-eslint-parser: 2.3.0
-      prettier: 3.0.3
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      prettier: 3.1.0
+      vue-eslint-parser: 9.3.1(eslint@8.53.0)
       yaml-eslint-parser: 1.2.2
     transitivePeerDependencies:
       - '@babel/core'
@@ -1952,8 +2308,8 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint-sets/eslint-config-basic@5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2):
-    resolution: {integrity: sha512-dWUDQY10cHPz9M6r2HvFvByOecH0dFjnihzrdRLVx8rWWMG4keeuEhURi5eSYsHCvHJz6Q3KzukiDrp7wHZoAw==}
+  /@eslint-sets/eslint-config-basic@5.10.0(@babel/core@7.23.2)(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-zpcEpOnktX6GNvr9qbKMr13imbCmuLZDtgW79QrOlCvi4Wic6jfjH4HMz5bT+9lZgqdWCOyOyyBCoqfnqYOj/A==}
     peerDependencies:
       eslint: '>=7.4.0'
       prettier: '>=2'
@@ -1962,24 +2318,24 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@babel/eslint-parser': 7.22.10(@babel/core@7.22.10)(eslint@8.46.0)
-      eslint: 8.46.0
-      eslint-config-prettier: 9.0.0(eslint@8.46.0)
-      eslint-plugin-eslint-comments: 3.2.0(eslint@8.46.0)
+      '@babel/eslint-parser': 7.23.3(@babel/core@7.23.2)(eslint@8.53.0)
+      eslint: 8.53.0
+      eslint-config-prettier: 9.0.0(eslint@8.53.0)
+      eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0)
       eslint-plugin-html: 7.1.0
-      eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)
-      eslint-plugin-jsonc: 2.9.0(eslint@8.46.0)
-      eslint-plugin-markdown: 3.0.1(eslint@8.46.0)
-      eslint-plugin-n: 16.0.1(eslint@8.46.0)
-      eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3)
-      eslint-plugin-promise: 6.1.1(eslint@8.46.0)
+      eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)
+      eslint-plugin-jsonc: 2.10.0(eslint@8.53.0)
+      eslint-plugin-markdown: 3.0.1(eslint@8.53.0)
+      eslint-plugin-n: 16.3.1(eslint@8.53.0)
+      eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0)
+      eslint-plugin-promise: 6.1.1(eslint@8.53.0)
       eslint-plugin-tsdoc: 0.2.17
-      eslint-plugin-unicorn: 40.1.0(eslint@8.46.0)
-      eslint-plugin-yml: 1.8.0(eslint@8.46.0)
+      eslint-plugin-unicorn: 40.1.0(eslint@8.53.0)
+      eslint-plugin-yml: 1.10.0(eslint@8.53.0)
       jsonc-eslint-parser: 2.3.0
-      prettier: 3.0.3
+      prettier: 3.1.0
       typescript: 5.2.2
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      vue-eslint-parser: 9.3.2(eslint@8.53.0)
       yaml-eslint-parser: 1.2.2
     transitivePeerDependencies:
       - '@babel/core'
@@ -1990,21 +2346,21 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint-sets/eslint-config-ts@3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2):
+  /@eslint-sets/eslint-config-ts@3.3.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2):
     resolution: {integrity: sha512-4Vj3KxYx16hmW6AyEv1mil0gVN8H3rdJt8TRWufbAj0ZN+EjwOPf3TqE7ASCYto/NpA8xWQY3NGm/og9Or/dDQ==}
     peerDependencies:
       eslint: '>=8.0.0'
       prettier: '>=2.0.0'
       typescript: '>=4.0.0'
     dependencies:
-      '@eslint-sets/eslint-config-basic': 3.3.0(@babel/core@7.22.10)(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(prettier@3.0.3)
-      '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
-      eslint: 8.46.0
-      eslint-config-prettier: 8.9.0(eslint@8.46.0)
-      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3)
+      '@eslint-sets/eslint-config-basic': 3.3.0(@babel/core@7.23.2)(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(prettier@3.1.0)
+      '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
+      eslint: 8.53.0
+      eslint-config-prettier: 8.9.0(eslint@8.53.0)
+      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.53.0)(prettier@3.1.0)
       eslint-plugin-tsdoc: 0.2.17
-      prettier: 3.0.3
+      prettier: 3.1.0
       typescript: 5.2.2
     transitivePeerDependencies:
       - '@babel/core'
@@ -2013,8 +2369,8 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint-sets/eslint-config-ts@5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2):
-    resolution: {integrity: sha512-0tLzYHizhI0B1oh8IFmSOyDye2jIF34SnrO/YZRXVKTuv7d4QKDD9xkC+SOBB0pk+SHPJ6AU/N2xZar+CsHl3g==}
+  /@eslint-sets/eslint-config-ts@5.10.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-SyNwxC8u3QT/h66wRihdLEEgmUx5onx34GACkOu97dHxPHgnIo3BI9Hkmott/7I60ndgt9UwoG1gb+MVnOWfSw==}
     peerDependencies:
       eslint: '>=7.4.0'
       prettier: '>=2'
@@ -2023,14 +2379,14 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
-      '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
-      eslint: 8.46.0
-      eslint-config-prettier: 9.0.0(eslint@8.46.0)
-      eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3)
+      '@eslint-sets/eslint-config-basic': 5.10.0(@babel/core@7.23.2)(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
+      '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      eslint: 8.53.0
+      eslint-config-prettier: 9.0.0(eslint@8.53.0)
+      eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0)
       eslint-plugin-tsdoc: 0.2.17
-      prettier: 3.0.3
+      prettier: 3.1.0
       typescript: 5.2.2
     transitivePeerDependencies:
       - '@babel/core'
@@ -2040,26 +2396,26 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint-sets/eslint-config-vue3-ts@3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2):
+  /@eslint-sets/eslint-config-vue3-ts@3.3.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2):
     resolution: {integrity: sha512-KX3VFuS5U4FYKfZ6PABQjl54BMpNapNjYYe103Nm2Zy8y9zphDCBAARbhU97XNSvzkurve7HhJcsi9gXrWlGFA==}
     peerDependencies:
       eslint: '>=8.0.0'
       prettier: '>=2.0.0'
       typescript: '>=4.0.0'
     dependencies:
-      '@eslint-sets/eslint-config-ts': 3.3.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
-      '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
-      eslint: 8.46.0
-      eslint-config-prettier: 8.9.0(eslint@8.46.0)
-      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3)
+      '@eslint-sets/eslint-config-ts': 3.3.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
+      '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
+      eslint: 8.53.0
+      eslint-config-prettier: 8.9.0(eslint@8.53.0)
+      eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.9.0)(eslint@8.53.0)(prettier@3.1.0)
       eslint-plugin-tsdoc: 0.2.17
       eslint-plugin-vitest-globals: 1.4.0
-      eslint-plugin-vue: 9.16.1(eslint@8.46.0)
-      eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1)
-      prettier: 3.0.3
+      eslint-plugin-vue: 9.16.1(eslint@8.53.0)
+      eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.53.0)(vue-eslint-parser@9.3.1)
+      prettier: 3.1.0
       typescript: 5.2.2
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      vue-eslint-parser: 9.3.1(eslint@8.53.0)
     transitivePeerDependencies:
       - '@babel/core'
       - eslint-import-resolver-typescript
@@ -2067,8 +2423,8 @@ packages:
       - supports-color
     dev: true
 
-  /@eslint-sets/eslint-config-vue3@5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2):
-    resolution: {integrity: sha512-o9ijQjjAy3kfIMmfDIsjxmjob0oitdzga4JxpX+jvwmUqvjv2eKU300Up3IGhfcQFsPcYIJhBn9+Vfe+MPH9tw==}
+  /@eslint-sets/eslint-config-vue3@5.10.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-1Ef6R6/VR5sLEZE/kEhTqkCxqhN6nS+PZ5Eq4wgRDLAqsqM71/9NSPb29BcBDOI83xPJfHqkAlqUmKInsSR3qg==}
     peerDependencies:
       eslint: '>=7.4.0'
       prettier: '>=2'
@@ -2077,22 +2433,22 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@eslint-sets/eslint-config-basic': 5.8.0(@babel/core@7.22.10)(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
-      '@eslint-sets/eslint-config-ts': 5.8.0(@babel/core@7.22.10)(eslint@8.46.0)(prettier@3.0.3)(typescript@5.2.2)
-      '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
-      eslint: 8.46.0
-      eslint-config-prettier: 9.0.0(eslint@8.46.0)
-      eslint-plugin-jsdoc: 46.4.6(eslint@8.46.0)
-      eslint-plugin-prettier: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3)
+      '@eslint-sets/eslint-config-basic': 5.10.0(@babel/core@7.23.2)(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
+      '@eslint-sets/eslint-config-ts': 5.10.0(@babel/core@7.23.2)(eslint@8.53.0)(prettier@3.1.0)(typescript@5.2.2)
+      '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      eslint: 8.53.0
+      eslint-config-prettier: 9.0.0(eslint@8.53.0)
+      eslint-plugin-jsdoc: 46.9.0(eslint@8.53.0)
+      eslint-plugin-prettier: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0)
       eslint-plugin-tsdoc: 0.2.17
       eslint-plugin-vitest-globals: 1.4.0
-      eslint-plugin-vue: 9.16.1(eslint@8.46.0)
-      eslint-plugin-vue-scoped-css: 2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1)
-      local-pkg: 0.4.3
-      prettier: 3.0.3
+      eslint-plugin-vue: 9.18.1(eslint@8.53.0)
+      eslint-plugin-vue-scoped-css: 2.5.1(eslint@8.53.0)(vue-eslint-parser@9.3.2)
+      local-pkg: 0.5.0
+      prettier: 3.1.0
       typescript: 5.2.2
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      vue-eslint-parser: 9.3.2(eslint@8.53.0)
     transitivePeerDependencies:
       - '@babel/core'
       - '@types/eslint'
@@ -2118,11 +2474,33 @@ packages:
       - supports-color
     dev: true
 
+  /@eslint/eslintrc@2.1.3:
+    resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.3.4(supports-color@8.1.1)
+      espree: 9.6.1
+      globals: 13.23.0
+      ignore: 5.2.4
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@eslint/js@8.46.0:
     resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
+  /@eslint/js@8.53.0:
+    resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
   /@hapi/hoek@9.3.0:
     resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
     dev: true
@@ -2144,6 +2522,17 @@ packages:
       - supports-color
     dev: true
 
+  /@humanwhocodes/config-array@0.11.13:
+    resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
+    engines: {node: '>=10.10.0'}
+    dependencies:
+      '@humanwhocodes/object-schema': 2.0.1
+      debug: 4.3.4(supports-color@8.1.1)
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@humanwhocodes/module-importer@1.0.1:
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
     engines: {node: '>=12.22'}
@@ -2153,6 +2542,10 @@ packages:
     resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
     dev: true
 
+  /@humanwhocodes/object-schema@2.0.1:
+    resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
+    dev: true
+
   /@ioredis/commands@1.2.0:
     resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
     dev: false
@@ -2185,97 +2578,115 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /@jest/console@27.5.1:
-    resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/console@29.7.0:
+    resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       chalk: 4.1.2
-      jest-message-util: 27.5.1
-      jest-util: 27.5.1
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
       slash: 3.0.0
     dev: true
 
-  /@jest/core@27.5.1(ts-node@10.4.0):
-    resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/core@29.7.0(ts-node@10.9.1):
+    resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
     peerDependenciesMeta:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/console': 27.5.1
-      '@jest/reporters': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/console': 29.7.0
+      '@jest/reporters': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       ansi-escapes: 4.3.2
       chalk: 4.1.2
-      emittery: 0.8.1
+      ci-info: 3.8.0
       exit: 0.1.2
       graceful-fs: 4.2.11
-      jest-changed-files: 27.5.1
-      jest-config: 27.5.1(ts-node@10.4.0)
-      jest-haste-map: 27.5.1
-      jest-message-util: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-resolve: 27.5.1
-      jest-resolve-dependencies: 27.5.1
-      jest-runner: 27.5.1
-      jest-runtime: 27.5.1
-      jest-snapshot: 27.5.1
-      jest-util: 27.5.1
-      jest-validate: 27.5.1
-      jest-watcher: 27.5.1
+      jest-changed-files: 29.7.0
+      jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+      jest-haste-map: 29.7.0
+      jest-message-util: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-resolve-dependencies: 29.7.0
+      jest-runner: 29.7.0
+      jest-runtime: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      jest-watcher: 29.7.0
       micromatch: 4.0.5
-      rimraf: 3.0.2
+      pretty-format: 29.7.0
       slash: 3.0.0
       strip-ansi: 6.0.1
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
+      - babel-plugin-macros
       - supports-color
       - ts-node
-      - utf-8-validate
     dev: true
 
-  /@jest/environment@27.5.1:
-    resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/environment@29.7.0:
+    resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/fake-timers': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
-      jest-mock: 27.5.1
+      '@jest/fake-timers': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
+      jest-mock: 29.7.0
     dev: true
 
-  /@jest/fake-timers@27.5.1:
-    resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/expect-utils@29.7.0:
+    resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      '@sinonjs/fake-timers': 8.1.0
-      '@types/node': 20.5.8
-      jest-message-util: 27.5.1
-      jest-mock: 27.5.1
-      jest-util: 27.5.1
+      jest-get-type: 29.6.3
     dev: true
 
-  /@jest/globals@27.5.1:
-    resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/expect@29.7.0:
+    resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/types': 27.5.1
-      expect: 27.5.1
+      expect: 29.7.0
+      jest-snapshot: 29.7.0
+    transitivePeerDependencies:
+      - supports-color
     dev: true
 
-  /@jest/reporters@27.5.1:
-    resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/fake-timers@29.7.0:
+    resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.6.3
+      '@sinonjs/fake-timers': 10.3.0
+      '@types/node': 20.9.0
+      jest-message-util: 29.7.0
+      jest-mock: 29.7.0
+      jest-util: 29.7.0
+    dev: true
+
+  /@jest/globals@29.7.0:
+    resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/expect': 29.7.0
+      '@jest/types': 29.6.3
+      jest-mock: 29.7.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@jest/reporters@29.7.0:
+    resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
     peerDependenciesMeta:
@@ -2283,103 +2694,101 @@ packages:
         optional: true
     dependencies:
       '@bcoe/v8-coverage': 0.2.3
-      '@jest/console': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/console': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@jridgewell/trace-mapping': 0.3.20
+      '@types/node': 20.9.0
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
       exit: 0.1.2
       glob: 7.2.3
       graceful-fs: 4.2.11
       istanbul-lib-coverage: 3.2.0
-      istanbul-lib-instrument: 5.2.1
+      istanbul-lib-instrument: 6.0.1
       istanbul-lib-report: 3.0.1
       istanbul-lib-source-maps: 4.0.1
       istanbul-reports: 3.1.6
-      jest-haste-map: 27.5.1
-      jest-resolve: 27.5.1
-      jest-util: 27.5.1
-      jest-worker: 27.5.1
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
+      jest-worker: 29.7.0
       slash: 3.0.0
-      source-map: 0.6.1
       string-length: 4.0.2
-      terminal-link: 2.1.1
-      v8-to-istanbul: 8.1.1
+      strip-ansi: 6.0.1
+      v8-to-istanbul: 9.1.3
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@jest/schemas@29.6.0:
-    resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==}
+  /@jest/schemas@29.6.3:
+    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@sinclair/typebox': 0.27.8
     dev: true
 
-  /@jest/source-map@27.5.1:
-    resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/source-map@29.6.3:
+    resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
+      '@jridgewell/trace-mapping': 0.3.20
       callsites: 3.1.0
       graceful-fs: 4.2.11
-      source-map: 0.6.1
     dev: true
 
-  /@jest/test-result@27.5.1:
-    resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/test-result@29.7.0:
+    resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/console': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/istanbul-lib-coverage': 2.0.4
+      '@jest/console': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/istanbul-lib-coverage': 2.0.5
       collect-v8-coverage: 1.0.2
     dev: true
 
-  /@jest/test-sequencer@27.5.1:
-    resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/test-sequencer@29.7.0:
+    resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/test-result': 27.5.1
+      '@jest/test-result': 29.7.0
       graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-runtime: 27.5.1
-    transitivePeerDependencies:
-      - supports-color
+      jest-haste-map: 29.7.0
+      slash: 3.0.0
     dev: true
 
-  /@jest/transform@27.5.1:
-    resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/transform@29.7.0:
+    resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@babel/core': 7.22.10
-      '@jest/types': 27.5.1
+      '@babel/core': 7.23.2
+      '@jest/types': 29.6.3
+      '@jridgewell/trace-mapping': 0.3.20
       babel-plugin-istanbul: 6.1.1
       chalk: 4.1.2
-      convert-source-map: 1.9.0
+      convert-source-map: 2.0.0
       fast-json-stable-stringify: 2.1.0
       graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-util: 27.5.1
+      jest-haste-map: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-util: 29.7.0
       micromatch: 4.0.5
       pirates: 4.0.6
       slash: 3.0.0
-      source-map: 0.6.1
-      write-file-atomic: 3.0.3
+      write-file-atomic: 4.0.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@jest/types@27.5.1:
-    resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /@jest/types@29.6.3:
+    resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
-      '@types/istanbul-reports': 3.0.1
-      '@types/node': 20.5.8
-      '@types/yargs': 16.0.5
+      '@jest/schemas': 29.6.3
+      '@types/istanbul-lib-coverage': 2.0.5
+      '@types/istanbul-reports': 3.0.3
+      '@types/node': 20.9.0
+      '@types/yargs': 17.0.29
       chalk: 4.1.2
     dev: true
 
@@ -2389,7 +2798,7 @@ packages:
     dependencies:
       '@jridgewell/set-array': 1.1.2
       '@jridgewell/sourcemap-codec': 1.4.15
-      '@jridgewell/trace-mapping': 0.3.19
+      '@jridgewell/trace-mapping': 0.3.20
 
   /@jridgewell/resolve-uri@3.1.1:
     resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
@@ -2414,6 +2823,13 @@ packages:
     dependencies:
       '@jridgewell/resolve-uri': 3.1.1
       '@jridgewell/sourcemap-codec': 1.4.15
+    dev: true
+
+  /@jridgewell/trace-mapping@0.3.20:
+    resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.1
+      '@jridgewell/sourcemap-codec': 1.4.15
 
   /@jridgewell/trace-mapping@0.3.9:
     resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
@@ -2421,31 +2837,31 @@ packages:
       '@jridgewell/resolve-uri': 3.1.1
       '@jridgewell/sourcemap-codec': 1.4.15
 
-  /@koa/cors@3.4.3:
-    resolution: {integrity: sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==}
-    engines: {node: '>= 8.0.0'}
+  /@koa/cors@4.0.0:
+    resolution: {integrity: sha512-Y4RrbvGTlAaa04DBoPBWJqDR5gPj32OOz827ULXfgB1F7piD1MB/zwn8JR2LAnvdILhxUbXbkXGWuNVsFuVFCQ==}
+    engines: {node: '>= 14.0.0'}
     dependencies:
       vary: 1.1.2
     dev: false
 
-  /@koa/multer@3.0.2(multer@1.4.4-lts.1):
+  /@koa/multer@3.0.2(multer@1.4.5-lts.1):
     resolution: {integrity: sha512-Q6WfPpE06mJWyZD1fzxM6zWywaoo+zocAn2YA9QYz4RsecoASr1h/kSzG0c5seDpFVKCMZM9raEfuM7XfqbRLw==}
     engines: {node: '>= 8'}
     peerDependencies:
       multer: '*'
     dependencies:
       fix-esm: 1.0.1
-      multer: 1.4.4-lts.1
+      multer: 1.4.5-lts.1
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@koa/router@9.0.1:
-    resolution: {integrity: sha512-OI+OU49CJV4px0WkIMmayBeqVXB/JS1ZMq7UoGlTZt6Y7ijK7kdeQ18+SEHHJPytmtI1y6Hf8XLrpxva3mhv5Q==}
-    engines: {node: '>= 8.0.0'}
+  /@koa/router@12.0.1:
+    resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==}
+    engines: {node: '>= 12'}
     dependencies:
       debug: 4.3.4(supports-color@8.1.1)
-      http-errors: 1.8.1
+      http-errors: 2.0.0
       koa-compose: 4.1.0
       methods: 1.1.2
       path-to-regexp: 6.2.1
@@ -2457,6 +2873,229 @@ packages:
     resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
     dev: true
 
+  /@ladjs/consolidate@1.0.3(@babel/core@7.22.10)(pug@3.0.2):
+    resolution: {integrity: sha512-zyUeV5nkEFz7FH88pz+moVeMMOygTx1zL5bjXGHCVX5MMpmAtFf5piaQlBDk3nClGoUs8vjYI9TKsbXldGv0VA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.22.5
+      arc-templates: ^0.5.3
+      atpl: '>=0.7.6'
+      bracket-template: ^1.1.5
+      coffee-script: ^1.12.7
+      dot: ^1.1.3
+      dust: ^0.3.0
+      dustjs-helpers: ^1.7.4
+      dustjs-linkedin: ^2.7.5
+      eco: ^1.1.0-rc-3
+      ect: ^0.5.9
+      ejs: ^3.1.5
+      haml-coffee: ^1.14.1
+      hamlet: ^0.3.3
+      hamljs: ^0.6.2
+      handlebars: ^4.7.6
+      hogan.js: ^3.0.2
+      htmling: ^0.0.8
+      jazz: ^0.0.18
+      jqtpl: ~1.1.0
+      just: ^0.1.8
+      liquid-node: ^3.0.1
+      liquor: ^0.0.5
+      lodash: ^4.17.20
+      mote: ^0.2.0
+      mustache: ^4.0.1
+      nunjucks: ^3.2.2
+      plates: ~0.4.11
+      pug: ^3.0.0
+      qejs: ^3.0.5
+      ractive: ^1.3.12
+      react: '>=16.13.1'
+      react-dom: '>=16.13.1'
+      slm: ^2.0.0
+      swig: ^1.4.2
+      swig-templates: ^2.0.3
+      teacup: ^2.0.0
+      templayed: '>=0.2.3'
+      then-pug: '*'
+      tinyliquid: ^0.2.34
+      toffee: ^0.3.6
+      twig: ^1.15.2
+      twing: ^5.0.2
+      underscore: ^1.11.0
+      vash: ^0.13.0
+      velocityjs: ^2.0.1
+      walrus: ^0.10.1
+      whiskers: ^0.4.0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+      arc-templates:
+        optional: true
+      atpl:
+        optional: true
+      bracket-template:
+        optional: true
+      coffee-script:
+        optional: true
+      dot:
+        optional: true
+      dust:
+        optional: true
+      dustjs-helpers:
+        optional: true
+      dustjs-linkedin:
+        optional: true
+      eco:
+        optional: true
+      ect:
+        optional: true
+      ejs:
+        optional: true
+      haml-coffee:
+        optional: true
+      hamlet:
+        optional: true
+      hamljs:
+        optional: true
+      handlebars:
+        optional: true
+      hogan.js:
+        optional: true
+      htmling:
+        optional: true
+      jazz:
+        optional: true
+      jqtpl:
+        optional: true
+      just:
+        optional: true
+      liquid-node:
+        optional: true
+      liquor:
+        optional: true
+      lodash:
+        optional: true
+      mote:
+        optional: true
+      mustache:
+        optional: true
+      nunjucks:
+        optional: true
+      plates:
+        optional: true
+      pug:
+        optional: true
+      qejs:
+        optional: true
+      ractive:
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+      slm:
+        optional: true
+      swig:
+        optional: true
+      swig-templates:
+        optional: true
+      teacup:
+        optional: true
+      templayed:
+        optional: true
+      then-pug:
+        optional: true
+      tinyliquid:
+        optional: true
+      toffee:
+        optional: true
+      twig:
+        optional: true
+      twing:
+        optional: true
+      underscore:
+        optional: true
+      vash:
+        optional: true
+      velocityjs:
+        optional: true
+      walrus:
+        optional: true
+      whiskers:
+        optional: true
+    dependencies:
+      '@babel/core': 7.22.10
+      pug: 3.0.2
+    dev: false
+
+  /@ladjs/koa-views@9.0.0(@babel/core@7.22.10)(@types/koa@2.13.11)(pug@3.0.2):
+    resolution: {integrity: sha512-/nzUN3HhB7SIxrE4c2MXCLARXMwgoy7xJogyX8lNJo4VBxM6dVQ47iZWjOoHxTBKGFNAv2OTQ0rWI7HYpiv8kg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@types/koa': ^2.13.1
+    peerDependenciesMeta:
+      '@types/koa':
+        optional: true
+    dependencies:
+      '@ladjs/consolidate': 1.0.3(@babel/core@7.22.10)(pug@3.0.2)
+      '@types/koa': 2.13.11
+      debug: 4.3.4(supports-color@8.1.1)
+      get-paths: 0.0.7
+      koa-send: 5.0.1
+      mz: 2.7.0
+      pretty: 2.0.0
+      resolve-path: 1.4.0
+    transitivePeerDependencies:
+      - '@babel/core'
+      - arc-templates
+      - atpl
+      - bracket-template
+      - coffee-script
+      - dot
+      - dust
+      - dustjs-helpers
+      - dustjs-linkedin
+      - eco
+      - ect
+      - ejs
+      - haml-coffee
+      - hamlet
+      - hamljs
+      - handlebars
+      - hogan.js
+      - htmling
+      - jazz
+      - jqtpl
+      - just
+      - liquid-node
+      - liquor
+      - lodash
+      - mote
+      - mustache
+      - nunjucks
+      - plates
+      - pug
+      - qejs
+      - ractive
+      - react
+      - react-dom
+      - slm
+      - supports-color
+      - swig
+      - swig-templates
+      - teacup
+      - templayed
+      - then-pug
+      - tinyliquid
+      - toffee
+      - twig
+      - twing
+      - underscore
+      - vash
+      - velocityjs
+      - walrus
+      - whiskers
+    dev: false
+
   /@mapbox/node-pre-gyp@1.0.11:
     resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
     hasBin: true
@@ -2495,51 +3134,6 @@ packages:
     dev: false
     optional: true
 
-  /@microsoft/api-documenter@7.22.21(@types/node@20.3.1):
-    resolution: {integrity: sha512-o8VXpB83P87cLIYfkQS7ibShoYorTZ7Xs+gMwftT75pFaYWwhBuI8M0MPgzTGIAxzi338XfUjhctlVCjRn+Sqg==}
-    hasBin: true
-    dependencies:
-      '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1)
-      '@microsoft/tsdoc': 0.14.2
-      '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1)
-      '@rushstack/ts-command-line': 4.15.1
-      colors: 1.2.5
-      js-yaml: 3.13.1
-      resolve: 1.22.4
-    transitivePeerDependencies:
-      - '@types/node'
-    dev: true
-
-  /@microsoft/api-extractor-model@7.27.3(@types/node@20.3.1):
-    resolution: {integrity: sha512-fSFvw7otYHduOkyshjTbapKKgwF8bgquVHvgF8VgeKtMYvqXkoaj7W6VcM7PNY7E2bbblhUgC4XNdqZLD4SJGw==}
-    dependencies:
-      '@microsoft/tsdoc': 0.14.2
-      '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1)
-    transitivePeerDependencies:
-      - '@types/node'
-    dev: true
-
-  /@microsoft/api-extractor@7.36.0(@types/node@20.3.1):
-    resolution: {integrity: sha512-P+kYgJFDXIr+UNzhRMhlpM/dderi6ab4lxn35vdhfAIMPtGCSXIJxrrtpTOQmQW8CZtmoZX06LYoUsKCc1zjow==}
-    hasBin: true
-    dependencies:
-      '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1)
-      '@microsoft/tsdoc': 0.14.2
-      '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1)
-      '@rushstack/rig-package': 0.4.0
-      '@rushstack/ts-command-line': 4.15.1
-      colors: 1.2.5
-      lodash: 4.17.21
-      resolve: 1.22.4
-      semver: 7.3.8
-      source-map: 0.6.1
-      typescript: 5.0.4
-    transitivePeerDependencies:
-      - '@types/node'
-    dev: true
-
   /@microsoft/tsdoc-config@0.16.2:
     resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
     dependencies:
@@ -2621,8 +3215,8 @@ packages:
     hasBin: true
     dev: true
 
-  /@napi-rs/cli@2.16.2:
-    resolution: {integrity: sha512-U2aZfnr0s9KkXpZlYC0l5WxWCXL7vJUNpCnWMwq3T9GG9rhYAAUM9CTZsi1Z+0iR2LcHbfq9EfMgoqnuTyUjfg==}
+  /@napi-rs/cli@2.16.5:
+    resolution: {integrity: sha512-mFEzwrg4IOLngGd2/P6yeqIWgwQNn59Z08n1rndu6kLDq1gg954NH9cM1O9Da0RJuybt46p43lqgSsnAY2mxqA==}
     engines: {node: '>= 10'}
     hasBin: true
     dev: false
@@ -2654,6 +3248,19 @@ packages:
       fastq: 1.15.0
     dev: true
 
+  /@npmcli/agent@2.2.0:
+    resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==}
+    engines: {node: ^16.14.0 || >=18.0.0}
+    dependencies:
+      agent-base: 7.1.0
+      http-proxy-agent: 7.0.0
+      https-proxy-agent: 7.0.1
+      lru-cache: 10.0.2
+      socks-proxy-agent: 8.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
   /@npmcli/fs@3.1.0:
     resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -2681,6 +3288,7 @@ packages:
 
   /@one-ini/wasm@0.1.1:
     resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+    dev: false
 
   /@peertube/http-signature@1.7.0:
     resolution: {integrity: sha512-aGQIwo6/sWtyyqhVK4e1MtxYz4N1X8CNt6SOtCc+Wnczs5S5ONaLHDDR8LYaGn0MgOwvGgXyuZ5sJIfd7iyoUw==}
@@ -2719,55 +3327,6 @@ packages:
       tslib: 2.6.1
     dev: true
 
-  /@redis/bloom@1.2.0(@redis/client@1.5.8):
-    resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.5.8
-    dev: true
-
-  /@redis/client@1.5.8:
-    resolution: {integrity: sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==}
-    engines: {node: '>=14'}
-    dependencies:
-      cluster-key-slot: 1.1.2
-      generic-pool: 3.9.0
-      yallist: 4.0.0
-    dev: true
-
-  /@redis/graph@1.1.0(@redis/client@1.5.8):
-    resolution: {integrity: sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.5.8
-    dev: true
-
-  /@redis/json@1.0.4(@redis/client@1.5.8):
-    resolution: {integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.5.8
-    dev: true
-
-  /@redis/search@1.1.3(@redis/client@1.5.8):
-    resolution: {integrity: sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.5.8
-    dev: true
-
-  /@redis/time-series@1.0.4(@redis/client@1.5.8):
-    resolution: {integrity: sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==}
-    peerDependencies:
-      '@redis/client': ^1.0.0
-    dependencies:
-      '@redis/client': 1.5.8
-    dev: true
-
   /@redocly/ajv@8.11.0:
     resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==}
     dependencies:
@@ -2777,12 +3336,12 @@ packages:
       uri-js: 4.4.1
     dev: false
 
-  /@redocly/openapi-core@1.0.2:
-    resolution: {integrity: sha512-53dzhmG2bsi/8rcAAgBKk9ZLMR035VHgN7oSM3+BM4UAIoNBg6lMC/ChHSf9zO+GrX5qtuWVPqHhjjMti3SAlQ==}
-    engines: {node: '>=12.0.0'}
+  /@redocly/openapi-core@1.4.1:
+    resolution: {integrity: sha512-oAhnG8MKocM9LuP++NGFxdniNKWSLA7hzHPQoOK92LIP/DdvXx8pEeZ68UTNxIXhKonoUcO6s86I3L0zj143zg==}
+    engines: {node: '>=14.19.0', npm: '>=7.0.0'}
     dependencies:
       '@redocly/ajv': 8.11.0
-      '@types/node': 14.18.54
+      '@types/node': 14.18.63
       colorette: 1.4.0
       js-levenshtein: 1.1.6
       js-yaml: 4.1.0
@@ -2795,80 +3354,142 @@ packages:
       - encoding
     dev: false
 
-  /@rollup/plugin-alias@5.0.0(rollup@3.28.1):
-    resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==}
+  /@rollup/plugin-alias@5.0.1(rollup@4.4.1):
+    resolution: {integrity: sha512-JObvbWdOHoMy9W7SU0lvGhDtWq9PllP5mjpAy+TUslZG/WzOId9u80Hsqq1vCUn9pFJ0cxpdcnAv+QzU2zFH3Q==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
     peerDependenciesMeta:
       rollup:
         optional: true
     dependencies:
-      rollup: 3.28.1
+      rollup: 4.4.1
       slash: 4.0.0
     dev: true
 
-  /@rollup/plugin-json@6.0.0(rollup@3.28.1):
-    resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==}
+  /@rollup/plugin-json@6.0.1(rollup@4.4.1):
+    resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
     peerDependenciesMeta:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
-      rollup: 3.28.1
+      '@rollup/pluginutils': 5.0.5(rollup@4.4.1)
+      rollup: 4.4.1
     dev: true
 
-  /@rollup/pluginutils@5.0.4(rollup@3.28.1):
-    resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==}
+  /@rollup/pluginutils@5.0.5(rollup@4.4.1):
+    resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
     peerDependenciesMeta:
       rollup:
         optional: true
     dependencies:
-      '@types/estree': 1.0.1
+      '@types/estree': 1.0.3
       estree-walker: 2.0.2
       picomatch: 2.3.1
-      rollup: 3.28.1
+      rollup: 4.4.1
     dev: true
 
-  /@rushstack/node-core-library@3.59.4(@types/node@20.3.1):
-    resolution: {integrity: sha512-YAKJDC6Mz/KA1D7bvB88WaRX3knt/ZuLzkRu5G9QADGSjLtvTWzCNCytRF2PCSaaHOZaZsWul4F1KQdgFgUDqA==}
-    peerDependencies:
-      '@types/node': '*'
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-    dependencies:
-      '@types/node': 20.3.1
-      colors: 1.2.5
-      fs-extra: 7.0.1
-      import-lazy: 4.0.0
-      jju: 1.4.0
-      resolve: 1.22.4
-      semver: 7.3.8
-      z-schema: 5.0.5
+  /@rollup/rollup-android-arm-eabi@4.4.1:
+    resolution: {integrity: sha512-Ss4suS/sd+6xLRu+MLCkED2mUrAyqHmmvZB+zpzZ9Znn9S8wCkTQCJaQ8P8aHofnvG5L16u9MVnJjCqioPErwQ==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
     dev: true
+    optional: true
 
-  /@rushstack/rig-package@0.4.0:
-    resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==}
-    dependencies:
-      resolve: 1.22.4
-      strip-json-comments: 3.1.1
+  /@rollup/rollup-android-arm64@4.4.1:
+    resolution: {integrity: sha512-sRSkGTvGsARwWd7TzC8LKRf8FiPn7257vd/edzmvG4RIr9x68KBN0/Ek48CkuUJ5Pj/Dp9vKWv6PEupjKWjTYA==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
     dev: true
+    optional: true
 
-  /@rushstack/ts-command-line@4.15.1:
-    resolution: {integrity: sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==}
-    dependencies:
-      '@types/argparse': 1.0.38
-      argparse: 1.0.10
-      colors: 1.2.5
-      string-argv: 0.3.2
+  /@rollup/rollup-darwin-arm64@4.4.1:
+    resolution: {integrity: sha512-nz0AiGrrXyaWpsmBXUGOBiRDU0wyfSXbFuF98pPvIO8O6auQsPG6riWsfQqmCCC5FNd8zKQ4JhgugRNAkBJ8mQ==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
     dev: true
+    optional: true
+
+  /@rollup/rollup-darwin-x64@4.4.1:
+    resolution: {integrity: sha512-Ogqvf4/Ve/faMaiPRvzsJEqajbqs00LO+8vtrPBVvLgdw4wBg6ZDXdkDAZO+4MLnrc8mhGV6VJAzYScZdPLtJg==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm-gnueabihf@4.4.1:
+    resolution: {integrity: sha512-9zc2tqlr6HfO+hx9+wktUlWTRdje7Ub15iJqKcqg5uJZ+iKqmd2CMxlgPpXi7+bU7bjfDIuvCvnGk7wewFEhCg==}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-gnu@4.4.1:
+    resolution: {integrity: sha512-phLb1fN3rq2o1j1v+nKxXUTSJnAhzhU0hLrl7Qzb0fLpwkGMHDem+o6d+ZI8+/BlTXfMU4kVWGvy6g9k/B8L6Q==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-arm64-musl@4.4.1:
+    resolution: {integrity: sha512-M2sDtw4tf57VPSjbTAN/lz1doWUqO2CbQuX3L9K6GWIR5uw9j+ROKCvvUNBY8WUbMxwaoc8mH9HmmBKsLht7+w==}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-gnu@4.4.1:
+    resolution: {integrity: sha512-mHIlRLX+hx+30cD6c4BaBOsSqdnCE4ok7/KDvjHYAHoSuveoMMxIisZFvcLhUnyZcPBXDGZTuBoalcuh43UfQQ==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-linux-x64-musl@4.4.1:
+    resolution: {integrity: sha512-tB+RZuDi3zxFx7vDrjTNGVLu2KNyzYv+UY8jz7e4TMEoAj7iEt8Qk6xVu6mo3pgjnsHj6jnq3uuRsHp97DLwOA==}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-arm64-msvc@4.4.1:
+    resolution: {integrity: sha512-Hdn39PzOQowK/HZzYpCuZdJC91PE6EaGbTe2VCA9oq2u18evkisQfws0Smh9QQGNNRa/T7MOuGNQoLeXhhE3PQ==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-ia32-msvc@4.4.1:
+    resolution: {integrity: sha512-tLpKb1Elm9fM8c5w3nl4N1eLTP4bCqTYw9tqUBxX8/hsxqHO3dxc2qPbZ9PNkdK4tg4iLEYn0pOUnVByRd2CbA==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@rollup/rollup-win32-x64-msvc@4.4.1:
+    resolution: {integrity: sha512-eAhItDX9yQtZVM3yvXS/VR3qPqcnXvnLyx1pLXl4JzyNMBNO3KC986t/iAg2zcMzpAp9JSvxB5VZGnBiNoA98w==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
 
   /@sideway/address@4.1.4:
     resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
@@ -2897,29 +3518,29 @@ packages:
     engines: {node: '>=14.16'}
     dev: false
 
-  /@sinonjs/commons@1.8.6:
-    resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==}
+  /@sinonjs/commons@3.0.0:
+    resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==}
     dependencies:
       type-detect: 4.0.8
 
-  /@sinonjs/fake-timers@8.1.0:
-    resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==}
+  /@sinonjs/fake-timers@10.3.0:
+    resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
     dependencies:
-      '@sinonjs/commons': 1.8.6
+      '@sinonjs/commons': 3.0.0
     dev: true
 
-  /@sinonjs/fake-timers@9.1.2:
-    resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
+  /@sinonjs/fake-timers@11.2.2:
+    resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==}
     dependencies:
-      '@sinonjs/commons': 1.8.6
+      '@sinonjs/commons': 3.0.0
     dev: false
 
   /@sqltools/formatter@1.2.5:
     resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==}
     dev: false
 
-  /@swc/cli@0.1.62(@swc/core@1.3.78)(chokidar@3.3.1):
-    resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==}
+  /@swc/cli@0.1.63(@swc/core@1.3.78)(chokidar@3.3.1):
+    resolution: {integrity: sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==}
     engines: {node: '>= 12.13'}
     hasBin: true
     peerDependencies:
@@ -3051,20 +3672,23 @@ packages:
       '@swc/core-win32-ia32-msvc': 1.3.78
       '@swc/core-win32-x64-msvc': 1.3.78
 
+  /@swc/types@0.1.5:
+    resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==}
+    dev: true
+
   /@swc/wasm@1.2.130:
     resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==}
     requiresBuild: true
     dev: false
     optional: true
 
-  /@syuilo/aiscript@0.11.1:
-    resolution: {integrity: sha512-chwOIA3yLUKvOB0G611hjLArKTeOWNmTm3lHERSaDW1d+dS6do56naX6Lkwy2UpnwWC0qzeNSgg35elk6t2gZg==}
+  /@syuilo/aiscript@0.16.0:
+    resolution: {integrity: sha512-CXvoWOq6kmOSUQtKv0IEf7Ebfkk5PO1LxAgLqgRRPgssPvDvINCXu/gFNXKdapkFMkmX+Gj8qjemKR1vnUS4ZA==}
     dependencies:
-      autobind-decorator: 2.4.0
-      chalk: 4.0.0
       seedrandom: 3.0.5
       stringz: 2.1.0
-      uuid: 7.0.3
+      uuid: 9.0.1
+    dev: true
 
   /@szmarczak/http-timer@4.0.6:
     resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
@@ -3079,131 +3703,40 @@ packages:
       defer-to-connect: 2.0.1
     dev: false
 
-  /@tensorflow/tfjs-backend-cpu@3.21.0(@tensorflow/tfjs-core@3.21.0):
-    resolution: {integrity: sha512-88S21UAdzyK0CsLUrH17GPTD+26E85OP9CqmLZslaWjWUmBkeTQ5Zqyp6iK+gELnLxPx6q7JsNEeFuPv4254lQ==}
-    engines: {yarn: '>= 1.3.2'}
-    requiresBuild: true
-    peerDependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-      '@types/seedrandom': 2.4.30
-      seedrandom: 3.0.5
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-backend-cpu@4.11.0(@tensorflow/tfjs-core@4.11.0):
-    resolution: {integrity: sha512-2zmGX9MuR8AwscSGOybz4fBOFgQDnj+ZCWGkLxDzbKecy9GxuilukT46xB2zU0kSq7Mf3ncfE/9eUEy6a7ZDqQ==}
+  /@tensorflow/tfjs-backend-cpu@4.13.0(@tensorflow/tfjs-core@4.13.0):
+    resolution: {integrity: sha512-k44G+2WZShxI2ejvQdsSQcicFMNWaccsf6bkI0R7dol9t9uj73yg7JkiT0U0uuJE6XwXymJgDe+KJVprg3fAgA==}
     engines: {yarn: '>= 1.3.2'}
     peerDependencies:
-      '@tensorflow/tfjs-core': 4.11.0
+      '@tensorflow/tfjs-core': 4.13.0
     dependencies:
-      '@tensorflow/tfjs-core': 4.11.0
+      '@tensorflow/tfjs-core': 4.13.0
       '@types/seedrandom': 2.4.30
       seedrandom: 3.0.5
     dev: false
 
-  /@tensorflow/tfjs-backend-cpu@4.2.0(@tensorflow/tfjs-core@4.2.0):
-    resolution: {integrity: sha512-8HWg9J69m0Ovc6w8TVhhixMOcwA3t/NPXLblOA/sgJ+/JD5gsbpLWJk4QISQyb1RnpSVzw6PX3BSMTJU7hWVOg==}
+  /@tensorflow/tfjs-backend-webgl@4.13.0(@tensorflow/tfjs-core@4.13.0):
+    resolution: {integrity: sha512-UDwn6o70GyZaVxWdGWrWYJad2tUbxqgLtGfZI19j5EmM554PVsGLd+VHOqv4XodTviawuNq/GzqSdqhqsp8f5w==}
     engines: {yarn: '>= 1.3.2'}
     peerDependencies:
-      '@tensorflow/tfjs-core': 4.2.0
+      '@tensorflow/tfjs-core': 4.13.0
     dependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-      '@types/seedrandom': 2.4.30
-      seedrandom: 3.0.5
-    dev: false
-
-  /@tensorflow/tfjs-backend-webgl@3.21.0(@tensorflow/tfjs-core@3.21.0):
-    resolution: {integrity: sha512-N4zitIAT9IX8B8oe489qM3f3VcESxGZIZvHmVP8varOQakTvTX859aaPo1s8hK1qCy4BjSGbweooZe4U8D4kTQ==}
-    engines: {yarn: '>= 1.3.2'}
-    requiresBuild: true
-    peerDependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dependencies:
-      '@tensorflow/tfjs-backend-cpu': 3.21.0(@tensorflow/tfjs-core@3.21.0)
-      '@tensorflow/tfjs-core': 3.21.0
-      '@types/offscreencanvas': 2019.3.0
-      '@types/seedrandom': 2.4.30
-      '@types/webgl-ext': 0.0.30
-      '@types/webgl2': 0.0.6
-      seedrandom: 3.0.5
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-backend-webgl@4.11.0(@tensorflow/tfjs-core@4.11.0):
-    resolution: {integrity: sha512-sM/B65u+1T3U+Ctiq1fn5j6VmiLEZW7BpuSa3ZXDXtIS07MoZ2FTuO8BMudxEY4xGpTyoOzqTOGT9BaGO3qrWg==}
-    engines: {yarn: '>= 1.3.2'}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-    dependencies:
-      '@tensorflow/tfjs-backend-cpu': 4.11.0(@tensorflow/tfjs-core@4.11.0)
-      '@tensorflow/tfjs-core': 4.11.0
+      '@tensorflow/tfjs-backend-cpu': 4.13.0(@tensorflow/tfjs-core@4.13.0)
+      '@tensorflow/tfjs-core': 4.13.0
       '@types/offscreencanvas': 2019.3.0
       '@types/seedrandom': 2.4.30
       seedrandom: 3.0.5
     dev: false
 
-  /@tensorflow/tfjs-backend-webgl@4.2.0(@tensorflow/tfjs-core@4.2.0):
-    resolution: {integrity: sha512-Qvf+hD5pSh+xi48kChSGzcDKJemkc4EKfoVVjuxl4k25ZUPwuEd7zZUAtinkLu1dzgHNyvePZY8k+9rVm59HJA==}
-    engines: {yarn: '>= 1.3.2'}
+  /@tensorflow/tfjs-converter@4.13.0(@tensorflow/tfjs-core@4.13.0):
+    resolution: {integrity: sha512-jA2/IigBXReZHS8Bo308HG7oVzsNPnPgSYfXneRXnxUz+WfcIPkJ6zp48KERZSPja8vOO5eNG4lsUkQpbtiyyw==}
     peerDependencies:
-      '@tensorflow/tfjs-core': 4.2.0
+      '@tensorflow/tfjs-core': 4.13.0
     dependencies:
-      '@tensorflow/tfjs-backend-cpu': 4.2.0(@tensorflow/tfjs-core@4.2.0)
-      '@tensorflow/tfjs-core': 4.2.0
-      '@types/offscreencanvas': 2019.3.0
-      '@types/seedrandom': 2.4.30
-      '@types/webgl-ext': 0.0.30
-      seedrandom: 3.0.5
+      '@tensorflow/tfjs-core': 4.13.0
     dev: false
 
-  /@tensorflow/tfjs-converter@3.21.0(@tensorflow/tfjs-core@3.21.0):
-    resolution: {integrity: sha512-12Y4zVDq3yW+wSjSDpSv4HnpL2sDZrNiGSg8XNiDE4HQBdjdA+a+Q3sZF/8NV9y2yoBhL5L7V4mMLDdbZBd9/Q==}
-    requiresBuild: true
-    peerDependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-converter@4.11.0(@tensorflow/tfjs-core@4.11.0):
-    resolution: {integrity: sha512-j2JEVwkqh+pyin+sxUiNUG7QOIU2S0+5SzN8LFXHlR90/bPvC2qiaaSPYdGG/BYidFc27QCHD3obBXrb1EE/ow==}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-    dependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-    dev: false
-
-  /@tensorflow/tfjs-converter@4.2.0(@tensorflow/tfjs-core@4.2.0):
-    resolution: {integrity: sha512-m+E2KJM6yGQdi8ElzWpChdD/JaqhWMCi9yK70v/ndkOaCL2q2UN48nYP2T5S15vkDvMIgzAQyZfh7hxQsMuvRQ==}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-    dependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-    dev: false
-
-  /@tensorflow/tfjs-core@3.21.0:
-    resolution: {integrity: sha512-YSfsswOqWfd+M4bXIhT3hwtAb+IV8+ODwIxwdFR/7jTAPZP1wMVnSlpKnXHAN64HFOiP+Tm3HmKusEZ0+09A0w==}
-    engines: {yarn: '>= 1.3.2'}
-    requiresBuild: true
-    dependencies:
-      '@types/long': 4.0.2
-      '@types/offscreencanvas': 2019.3.0
-      '@types/seedrandom': 2.4.30
-      '@types/webgl-ext': 0.0.30
-      '@webgpu/types': 0.1.16
-      long: 4.0.0
-      node-fetch: 2.6.12
-      seedrandom: 3.0.5
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-core@4.11.0:
-    resolution: {integrity: sha512-t0mCNIco8wg6aZdHWT1d6ZuKtbbdY5y871ELWLSUA1+grXDvvaroHYh5eeJexJYXeg+EQ0/hzB0G8nLsLjlyVQ==}
+  /@tensorflow/tfjs-core@4.13.0:
+    resolution: {integrity: sha512-vvz/kHakvv5Tppp2GDTUBA2/XkNmEkManbdsFEXfwVc5+rVMPEMsRFOjsKTy/TpDRd/4wsJBA99L4F7iG2tr/Q==}
     engines: {yarn: '>= 1.3.2'}
     dependencies:
       '@types/long': 4.0.2
@@ -3217,47 +3750,14 @@ packages:
       - encoding
     dev: false
 
-  /@tensorflow/tfjs-core@4.2.0:
-    resolution: {integrity: sha512-uuHkiWVC8b00ngFbHvAV7J7haRlN/9PEdeenCi0CzBjgKd7aN25wPWaoN0TSQcU+GT4FJ8mofMZ9VBYZ/s/WLg==}
-    engines: {yarn: '>= 1.3.2'}
-    dependencies:
-      '@types/long': 4.0.2
-      '@types/offscreencanvas': 2019.7.0
-      '@types/seedrandom': 2.4.30
-      '@types/webgl-ext': 0.0.30
-      '@webgpu/types': 0.1.21
-      long: 4.0.0
-      node-fetch: 2.6.12
-      seedrandom: 3.0.5
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /@tensorflow/tfjs-data@3.21.0(@tensorflow/tfjs-core@3.21.0)(seedrandom@3.0.5):
-    resolution: {integrity: sha512-eFLfw2wIcFNxnP2Iv/SnVlihehzKMumk1b5Prcx1ixk/SbkCo5u0Lt7OVOWaEOKVqvB2sT+dJcTjAh6lrCC/QA==}
-    requiresBuild: true
+  /@tensorflow/tfjs-data@4.13.0(@tensorflow/tfjs-core@4.13.0)(seedrandom@3.0.5):
+    resolution: {integrity: sha512-8FmvzGKBH3SJ3Y+vDTF/coFxD/FMh93YRZHxevNGE+nJcs3JK0grRbjSX3AAWb2GXtz2/o30BU0YL8bW8POuUA==}
     peerDependencies:
-      '@tensorflow/tfjs-core': 3.21.0
+      '@tensorflow/tfjs-core': 4.13.0
       seedrandom: ^3.0.5
     dependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-      '@types/node-fetch': 2.6.4
-      node-fetch: 2.6.12
-      seedrandom: 3.0.5
-      string_decoder: 1.3.0
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-data@4.11.0(@tensorflow/tfjs-core@4.11.0)(seedrandom@3.0.5):
-    resolution: {integrity: sha512-8E6CVpd7kxRFtVL7kvz6WF5jH18pNN2wEcm2yA87xq37JwcRsIPTkrmfyqCHlJZmiWn3RQbP59Sl05gbBnFo5w==}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-      seedrandom: ^3.0.5
-    dependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-      '@types/node-fetch': 2.6.4
+      '@tensorflow/tfjs-core': 4.13.0
+      '@types/node-fetch': 2.6.9
       node-fetch: 2.6.12
       seedrandom: 3.0.5
       string_decoder: 1.3.0
@@ -3265,54 +3765,21 @@ packages:
       - encoding
     dev: false
 
-  /@tensorflow/tfjs-data@4.2.0(@tensorflow/tfjs-core@4.2.0)(seedrandom@3.0.5):
-    resolution: {integrity: sha512-11t7Q+ikseduJgkd9iSeRrtor1aA3o5PVCFhC5yYvR3JLO55ic1+4Ryo0EJfhRoismS6zBUJrpzX4K0zlLbIfw==}
+  /@tensorflow/tfjs-layers@4.13.0(@tensorflow/tfjs-core@4.13.0):
+    resolution: {integrity: sha512-YoBqtVTnE71h48+f89G6ZSYZMN+QsUMccopSxQC6XscncB6Gt1KwuWfpDc2Ld5JeubmUzKLqHdEP0jXIWxssJw==}
     peerDependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-      seedrandom: ^3.0.5
+      '@tensorflow/tfjs-core': 4.13.0
     dependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-      '@types/node-fetch': 2.6.4
-      node-fetch: 2.6.12
-      seedrandom: 3.0.5
-      string_decoder: 1.3.0
-    transitivePeerDependencies:
-      - encoding
+      '@tensorflow/tfjs-core': 4.13.0
     dev: false
 
-  /@tensorflow/tfjs-layers@3.21.0(@tensorflow/tfjs-core@3.21.0):
-    resolution: {integrity: sha512-CMVXsraakXgnXEnqD9QbtResA7nvV7Jz20pGmjFIodcQkClgmFFhdCG5N+zlVRHEz7VKG2OyfhltZ0dBq/OAhA==}
-    requiresBuild: true
-    peerDependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dependencies:
-      '@tensorflow/tfjs-core': 3.21.0
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs-layers@4.11.0(@tensorflow/tfjs-core@4.11.0):
-    resolution: {integrity: sha512-ErVqwxjpu2YM3uJRj2o5GbBTYViUwnqOb0wKWuCVukVmGeWrUzf1X00Ky3dP4xfilfAvq+B26dg7QN4YNHeaKg==}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-    dependencies:
-      '@tensorflow/tfjs-core': 4.11.0
-    dev: false
-
-  /@tensorflow/tfjs-layers@4.2.0(@tensorflow/tfjs-core@4.2.0):
-    resolution: {integrity: sha512-SO0KTmCFOjrW+PlP9nKYXz07XGFq6uE7am9yH2bRaRPWpEeaKT/+k0C9vFMxI/GzRwY8AK4sLe4U+jE1mhYxGw==}
-    peerDependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-    dependencies:
-      '@tensorflow/tfjs-core': 4.2.0
-    dev: false
-
-  /@tensorflow/tfjs-node@3.21.1(seedrandom@3.0.5):
-    resolution: {integrity: sha512-WV77fiuux6E5RR7FRD8RL3yCruhoHjZMI9yybztGLItJwco2YVjHr6h4TOjaZcIMnxu9748iV118MN2ZeLXbdQ==}
+  /@tensorflow/tfjs-node@4.13.0(seedrandom@3.0.5):
+    resolution: {integrity: sha512-lCC5wLojaH6QLGiXdicswi0rz4b+sEVuBvDUaqdV4tve1wLHl3RzSS3IxR7fYj8V9GXCCcCtOkqwdEtXVMiIXg==}
     engines: {node: '>=8.11.0'}
     requiresBuild: true
     dependencies:
       '@mapbox/node-pre-gyp': 1.0.9
-      '@tensorflow/tfjs': 3.21.0(seedrandom@3.0.5)
+      '@tensorflow/tfjs': 4.13.0(seedrandom@3.0.5)
       adm-zip: 0.5.10
       google-protobuf: 3.21.2
       https-proxy-agent: 2.2.4
@@ -3326,38 +3793,16 @@ packages:
     dev: false
     optional: true
 
-  /@tensorflow/tfjs@3.21.0(seedrandom@3.0.5):
-    resolution: {integrity: sha512-khcARd3/872llL/oF4ouR40qlT71mylU66PGT8kHP/GJ5YKj44sv8lDRjU7lOVlJK7jsJFWEsNVHI3eMc/GWNQ==}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      '@tensorflow/tfjs-backend-cpu': 3.21.0(@tensorflow/tfjs-core@3.21.0)
-      '@tensorflow/tfjs-backend-webgl': 3.21.0(@tensorflow/tfjs-core@3.21.0)
-      '@tensorflow/tfjs-converter': 3.21.0(@tensorflow/tfjs-core@3.21.0)
-      '@tensorflow/tfjs-core': 3.21.0
-      '@tensorflow/tfjs-data': 3.21.0(@tensorflow/tfjs-core@3.21.0)(seedrandom@3.0.5)
-      '@tensorflow/tfjs-layers': 3.21.0(@tensorflow/tfjs-core@3.21.0)
-      argparse: 1.0.10
-      chalk: 4.1.2
-      core-js: 3.32.0
-      regenerator-runtime: 0.13.11
-      yargs: 16.2.0
-    transitivePeerDependencies:
-      - encoding
-      - seedrandom
-    dev: false
-    optional: true
-
-  /@tensorflow/tfjs@4.11.0(seedrandom@3.0.5):
-    resolution: {integrity: sha512-s6Vbz3IvMz2zNbH8/VptpRXzkwVjmuzT48esYLXJxMKtTcob4m5Srdxo7B+eJSDrWYkutXruiivaWmihFmu5rA==}
+  /@tensorflow/tfjs@4.13.0(seedrandom@3.0.5):
+    resolution: {integrity: sha512-yvjcNMt1q9CLUeOVwoNf0KyMg//fY9earGQGH91C+NcacOK4j0BJUJUqMolEJqfHIbmK2n2CIFmdvgA5epVPSA==}
     hasBin: true
     dependencies:
-      '@tensorflow/tfjs-backend-cpu': 4.11.0(@tensorflow/tfjs-core@4.11.0)
-      '@tensorflow/tfjs-backend-webgl': 4.11.0(@tensorflow/tfjs-core@4.11.0)
-      '@tensorflow/tfjs-converter': 4.11.0(@tensorflow/tfjs-core@4.11.0)
-      '@tensorflow/tfjs-core': 4.11.0
-      '@tensorflow/tfjs-data': 4.11.0(@tensorflow/tfjs-core@4.11.0)(seedrandom@3.0.5)
-      '@tensorflow/tfjs-layers': 4.11.0(@tensorflow/tfjs-core@4.11.0)
+      '@tensorflow/tfjs-backend-cpu': 4.13.0(@tensorflow/tfjs-core@4.13.0)
+      '@tensorflow/tfjs-backend-webgl': 4.13.0(@tensorflow/tfjs-core@4.13.0)
+      '@tensorflow/tfjs-converter': 4.13.0(@tensorflow/tfjs-core@4.13.0)
+      '@tensorflow/tfjs-core': 4.13.0
+      '@tensorflow/tfjs-data': 4.13.0(@tensorflow/tfjs-core@4.13.0)(seedrandom@3.0.5)
+      '@tensorflow/tfjs-layers': 4.13.0(@tensorflow/tfjs-core@4.13.0)
       argparse: 1.0.10
       chalk: 4.1.2
       core-js: 3.29.1
@@ -3368,39 +3813,9 @@ packages:
       - seedrandom
     dev: false
 
-  /@tensorflow/tfjs@4.2.0(seedrandom@3.0.5):
-    resolution: {integrity: sha512-iZmtyGC9IJkx+TpFnkgDol8BHv2BU3zJ01HyNcuvnm1w1EqoNe+1n8bwvLzI/sxHMcHTqzuu7VugMaphryxE+A==}
-    hasBin: true
-    dependencies:
-      '@tensorflow/tfjs-backend-cpu': 4.2.0(@tensorflow/tfjs-core@4.2.0)
-      '@tensorflow/tfjs-backend-webgl': 4.2.0(@tensorflow/tfjs-core@4.2.0)
-      '@tensorflow/tfjs-converter': 4.2.0(@tensorflow/tfjs-core@4.2.0)
-      '@tensorflow/tfjs-core': 4.2.0
-      '@tensorflow/tfjs-data': 4.2.0(@tensorflow/tfjs-core@4.2.0)(seedrandom@3.0.5)
-      '@tensorflow/tfjs-layers': 4.2.0(@tensorflow/tfjs-core@4.2.0)
-      argparse: 1.0.10
-      chalk: 4.1.2
-      core-js: 3.32.0
-      regenerator-runtime: 0.13.11
-      yargs: 16.2.0
-    transitivePeerDependencies:
-      - encoding
-      - seedrandom
-    dev: false
-
   /@tokenizer/token@0.3.0:
     resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
 
-  /@tootallnate/once@1.1.2:
-    resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
-    engines: {node: '>= 6'}
-    dev: true
-
-  /@tootallnate/once@2.0.0:
-    resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
-    engines: {node: '>= 10'}
-    dev: false
-
   /@tsconfig/node10@1.0.9:
     resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
 
@@ -3413,86 +3828,130 @@ packages:
   /@tsconfig/node16@1.0.4:
     resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
 
-  /@tsd/typescript@5.0.4:
-    resolution: {integrity: sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==}
+  /@tsd/typescript@5.2.2:
+    resolution: {integrity: sha512-VtjHPAKJqLJoHHKBDNofzvQB2+ZVxjXU/Gw6INAS9aINLQYVsxfzrQ2s84huCeYWZRTtrr7R0J7XgpZHjNwBCw==}
+    engines: {node: '>=14.17'}
     dev: true
 
   /@types/accepts@1.3.5:
     resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
-  /@types/adm-zip@0.5.0:
-    resolution: {integrity: sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==}
+  /@types/adm-zip@0.5.4:
+    resolution: {integrity: sha512-/pYie/76O0TTqU4L/z1XqQ5mA5QvScaP/EO3lpH7iQ6/AjioYyuvi2IAmQeimuTTnytl03e9g8YFYkGV2Bxojw==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/argparse@1.0.38:
-    resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+  /@types/async-lock@1.4.0:
+    resolution: {integrity: sha512-2+rYSaWrpdbQG3SA0LmMT6YxWLrI81AqpMlSkw3QtFc2HGDufkweQSn30Eiev7x9LL0oyFrBqk1PXOnB9IEgKg==}
+    dev: true
+
+  /@types/autosize@4.0.3:
+    resolution: {integrity: sha512-o0ZyU3ePp3+KRbhHsY4ogjc+ZQWgVN5h6j8BHW5RII4cFKi6PEKK9QPAcphJVkD0dGpyFnD3VRR0WMvHVjCv9w==}
     dev: true
 
   /@types/babel__core@7.20.1:
     resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
     dependencies:
-      '@babel/parser': 7.22.10
-      '@babel/types': 7.22.10
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
       '@types/babel__generator': 7.6.4
       '@types/babel__template': 7.4.1
       '@types/babel__traverse': 7.20.1
     dev: true
 
+  /@types/babel__core@7.20.3:
+    resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==}
+    dependencies:
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
+      '@types/babel__generator': 7.6.6
+      '@types/babel__template': 7.4.3
+      '@types/babel__traverse': 7.20.3
+    dev: true
+
   /@types/babel__generator@7.6.4:
     resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
     dependencies:
-      '@babel/types': 7.22.10
+      '@babel/types': 7.23.0
+    dev: true
+
+  /@types/babel__generator@7.6.6:
+    resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==}
+    dependencies:
+      '@babel/types': 7.23.0
     dev: true
 
   /@types/babel__template@7.4.1:
     resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
     dependencies:
-      '@babel/parser': 7.22.10
-      '@babel/types': 7.22.10
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
+    dev: true
+
+  /@types/babel__template@7.4.3:
+    resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==}
+    dependencies:
+      '@babel/parser': 7.23.0
+      '@babel/types': 7.23.0
     dev: true
 
   /@types/babel__traverse@7.20.1:
     resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==}
     dependencies:
-      '@babel/types': 7.22.10
+      '@babel/types': 7.23.0
     dev: true
 
-  /@types/bcryptjs@2.4.2:
-    resolution: {integrity: sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==}
+  /@types/babel__traverse@7.20.3:
+    resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==}
+    dependencies:
+      '@babel/types': 7.23.0
+    dev: true
+
+  /@types/bcryptjs@2.4.6:
+    resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==}
     dev: true
 
   /@types/body-parser@1.19.2:
     resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
     dependencies:
       '@types/connect': 3.4.35
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
   /@types/cacheable-request@6.0.3:
     resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
     dependencies:
       '@types/http-cache-semantics': 4.0.1
       '@types/keyv': 3.1.4
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       '@types/responselike': 1.0.0
 
   /@types/co-body@6.1.0:
     resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==}
     dependencies:
-      '@types/node': 20.5.8
-      '@types/qs': 6.9.7
+      '@types/node': 20.9.0
+      '@types/qs': 6.9.10
     dev: false
 
+  /@types/color-convert@2.0.3:
+    resolution: {integrity: sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==}
+    dependencies:
+      '@types/color-name': 1.1.2
+    dev: true
+
+  /@types/color-name@1.1.2:
+    resolution: {integrity: sha512-JWO/ZyxTKk0bLuOhAavGjnwLR73rUE7qzACnU7gMeyA/gdrSHm2xJwqNPipw2MtaZUaqQ2UG/q7pP6AQiZ8mqw==}
+    dev: true
+
   /@types/connect@3.4.35:
     resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
-  /@types/content-disposition@0.5.5:
-    resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==}
+  /@types/content-disposition@0.5.8:
+    resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==}
 
   /@types/cookies@0.7.7:
     resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==}
@@ -3500,39 +3959,43 @@ packages:
       '@types/connect': 3.4.35
       '@types/express': 4.17.17
       '@types/keygrip': 1.0.2
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
+
+  /@types/core-js@2.5.7:
+    resolution: {integrity: sha512-EhO4Lcd2Rs2bZvQwIDMZ1qsaZk8DpdOkQCbKpK0vt7fSjJGXrCA7EPauR/BZ7eJXks1een4FX7JtlhS136fklA==}
+    dev: true
 
   /@types/disposable-email-domains@1.0.4:
     resolution: {integrity: sha512-AmKPD8vBZzvey/jeg+YAIH/xJE3D6edOXz+YUooSCcHesGzFyzke83kj1j4d0LUR9nkSHIRklUVdcAMleuWLpg==}
     dev: false
 
-  /@types/escape-regexp@0.0.1:
-    resolution: {integrity: sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw==}
+  /@types/escape-regexp@0.0.3:
+    resolution: {integrity: sha512-FQMYUxaf1dVeWLUzJFSvfdDugfOpDyM13p67QfyMdagxSkBa689opkr/q9uR/VWyrWrl0jAyQaSPKxX9MpAXFw==}
     dev: true
 
   /@types/eslint-scope@3.7.4:
     resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==}
     dependencies:
       '@types/eslint': 8.44.2
-      '@types/estree': 1.0.1
+      '@types/estree': 1.0.3
     dev: true
 
   /@types/eslint@7.29.0:
     resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==}
     dependencies:
-      '@types/estree': 1.0.1
-      '@types/json-schema': 7.0.12
+      '@types/estree': 1.0.3
+      '@types/json-schema': 7.0.14
     dev: true
 
   /@types/eslint@8.44.2:
     resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==}
     dependencies:
-      '@types/estree': 1.0.1
-      '@types/json-schema': 7.0.12
+      '@types/estree': 1.0.3
+      '@types/json-schema': 7.0.14
     dev: true
 
-  /@types/estree@1.0.1:
-    resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+  /@types/estree@1.0.3:
+    resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==}
     dev: true
 
   /@types/expect@1.20.4:
@@ -3542,8 +4005,8 @@ packages:
   /@types/express-serve-static-core@4.17.35:
     resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==}
     dependencies:
-      '@types/node': 20.5.8
-      '@types/qs': 6.9.7
+      '@types/node': 20.9.0
+      '@types/qs': 6.9.10
       '@types/range-parser': 1.2.4
       '@types/send': 0.17.1
 
@@ -3552,25 +4015,32 @@ packages:
     dependencies:
       '@types/body-parser': 1.19.2
       '@types/express-serve-static-core': 4.17.35
-      '@types/qs': 6.9.7
+      '@types/qs': 6.9.10
       '@types/serve-static': 1.15.2
 
-  /@types/fluent-ffmpeg@2.1.21:
-    resolution: {integrity: sha512-+n3dy/Tegt6n+YwGZUiGq6i8Jrnt8+MoyPiW1L6J5EWUl7GSt18a/VyReecfCsvTTNBXNMIKOMHDstiQM8nJLA==}
+  /@types/fluent-ffmpeg@2.1.24:
+    resolution: {integrity: sha512-g5oQO8Jgi2kFS3tTub7wLvfLztr1s8tdXmRd8PiL/hLMLzTIAyMR2sANkTggM/rdEDAg3d63nYRRVepwBiCw5A==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
+    dev: true
+
+  /@types/form-data@2.5.0:
+    resolution: {integrity: sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg==}
+    deprecated: This is a stub types definition. form-data provides its own type definitions, so you do not need this installed.
+    dependencies:
+      form-data: 4.0.0
     dev: true
 
   /@types/formidable@2.0.6:
     resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: false
 
   /@types/glob-stream@8.0.0:
     resolution: {integrity: sha512-fxTWwdQmX9LWSHD7ZLlv3BHR992mKcVcDnT/2v+l/QZZo7TfDdyasqlSYVzOnMGWhRbrWeWkbj/mgezFjKynhw==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       '@types/picomatch': 2.3.0
       '@types/streamx': 2.9.1
     dev: true
@@ -3579,25 +4049,26 @@ packages:
     resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==}
     dependencies:
       '@types/minimatch': 5.1.2
-      '@types/node': 20.4.9
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/graceful-fs@4.1.6:
-    resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
+  /@types/graceful-fs@4.1.8:
+    resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/gulp-rename@2.0.2:
-    resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==}
+  /@types/gulp-rename@2.0.5:
+    resolution: {integrity: sha512-rD03kpi7CXZ5pTza4AtWqM3Btbte9y5yAPmqWGgHLNSMPbDCJVUGjQ2Ul6P48X7Sw9JDZlPtW6cXHntTmKeywA==}
     dependencies:
-      '@types/node': 20.4.9
+      '@types/node': 20.9.0
       '@types/vinyl': 2.0.7
     dev: true
 
-  /@types/gulp@4.0.13:
-    resolution: {integrity: sha512-Ms20Q2tZ3MpThZGn4Ag6e7ifz/oQJFxsuiopqz5oHmhE6q2ohnELgafi5K/pKX/4ntlpidS61v/TXAguYsVcaA==}
+  /@types/gulp@4.0.17:
+    resolution: {integrity: sha512-+pKQynu2C/HS16kgmDlAicjtFYP8kaa86eE9P0Ae7GB5W29we/E2TIdbOWtEZD5XkpY+jr8fyqfwO6SWZecLpQ==}
     dependencies:
+      '@types/node': 20.9.0
       '@types/undertaker': 1.2.8
       '@types/vinyl-fs': 3.0.2
       chokidar: 3.5.3
@@ -3612,51 +4083,66 @@ packages:
   /@types/http-errors@2.0.1:
     resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==}
 
-  /@types/istanbul-lib-coverage@2.0.4:
-    resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
+  /@types/insert-text-at-cursor@0.3.2:
+    resolution: {integrity: sha512-S80ZeMGJ1YMwF/CwvvGNCoWS0klVpJmjtyEL1kbYgYXRMPMEfNWXXnnnLQaim3FNp6tJzOhy/yeQXInfC6o1sA==}
     dev: true
 
-  /@types/istanbul-lib-report@3.0.0:
-    resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+  /@types/istanbul-lib-coverage@2.0.5:
+    resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==}
+    dev: true
+
+  /@types/istanbul-lib-report@3.0.2:
+    resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==}
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
+      '@types/istanbul-lib-coverage': 2.0.5
     dev: true
 
-  /@types/istanbul-reports@3.0.1:
-    resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+  /@types/istanbul-reports@3.0.3:
+    resolution: {integrity: sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==}
     dependencies:
-      '@types/istanbul-lib-report': 3.0.0
+      '@types/istanbul-lib-report': 3.0.2
     dev: true
 
-  /@types/jest@27.4.0:
-    resolution: {integrity: sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==}
+  /@types/jest@29.5.6:
+    resolution: {integrity: sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==}
     dependencies:
-      jest-diff: 27.5.1
-      pretty-format: 27.5.1
+      expect: 29.7.0
+      pretty-format: 29.7.0
     dev: true
 
-  /@types/js-yaml@4.0.5:
-    resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==}
+  /@types/jest@29.5.8:
+    resolution: {integrity: sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==}
+    dependencies:
+      expect: 29.7.0
+      pretty-format: 29.7.0
+    dev: true
+
+  /@types/js-yaml@4.0.9:
+    resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
     dev: true
 
   /@types/json-schema@7.0.12:
     resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
     dev: true
 
+  /@types/json-schema@7.0.14:
+    resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==}
+    dev: true
+
   /@types/json5@0.0.29:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: true
 
-  /@types/jsonld@1.5.9:
-    resolution: {integrity: sha512-K76ImkErPYL2wGPZpNFSKp6wE+h/APecZLJrU7UfDaGqt/f+D9Rrg1aR7VdRrQ6k5DUNRZ2vn9yACwmpOr9QcA==}
+  /@types/jsonld@1.5.12:
+    resolution: {integrity: sha512-y2EDlpPhuifmqcijoLV0zu9Pw3fd40RIZqpX4V0v7cq6vVFXjBOMhCGe2SlfTPzTZBJLZUFBidWshTYFfInvDQ==}
     dev: true
 
-  /@types/jsrsasign@10.5.8:
-    resolution: {integrity: sha512-1oZ3TbarAhKtKUpyrCIqXpbx3ZAfoSulleJs6/UzzyYty0ut+kjRX7zHLAaHwVIuw8CBjIymwW4J2LK944HoHQ==}
+  /@types/jsrsasign@10.5.12:
+    resolution: {integrity: sha512-sOA+eVnHU+FziThpMhuqs/tjFKe5gHVJKIS7g1BzhXP+e2FS8OvtzM0K3IzFxVksDOr98Gz5FJiZVxZ9uFoHhw==}
     dev: true
 
-  /@types/katex@0.16.2:
-    resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==}
+  /@types/katex@0.16.6:
+    resolution: {integrity: sha512-rZYO1HInM99rAFYNwGqbYPxHZHxu2IwZYKj4bJ4oh6edVrm1UId8mmbHIZLBtG253qU6y3piag0XYe/joNnwzQ==}
     dev: true
 
   /@types/keygrip@1.0.2:
@@ -3665,148 +4151,85 @@ packages:
   /@types/keyv@3.1.4:
     resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
-  /@types/koa-bodyparser@4.3.10:
-    resolution: {integrity: sha512-6ae05pjhmrmGhUR8GYD5qr5p9LTEMEGfGXCsK8VaSL+totwigm8+H/7MHW7K4854CMeuwRAubT8qcc/EagaeIA==}
+  /@types/koa-bodyparser@4.3.12:
+    resolution: {integrity: sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
   /@types/koa-compose@3.2.5:
     resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
 
-  /@types/koa-cors@0.0.2:
-    resolution: {integrity: sha512-uNaDY26HUVO+2C6arK8ZFODs9mBjYprD8mlvkVe2bYdX9wzEeKtycVXPafXpUkePhMh4sffIMkhRDyedokG/QA==}
+  /@types/koa-cors@0.0.5:
+    resolution: {integrity: sha512-WoxZWHDhYBj2HVUgx9ZMnXRkRbs8KvF7+EOaU6I/8XPI3r/tcuj6ehfH6ZvC3OReOCEqGfQ59n+ahGJJXihRLg==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa-favicon@2.0.21:
-    resolution: {integrity: sha512-paH1nheVhijx/VduoR/RCD/qTCiX+OI/6fHLi3mZae053Ts+gUBOrKtzl3pMTDbdEBqdLolfLje3PZbb6jW0jQ==}
+  /@types/koa-favicon@2.1.3:
+    resolution: {integrity: sha512-L1XAF8k1iOuh3hA/ZjEqWURm9/62a8A1x7BZR9ZCMw8nbnUBt6oZksz2rfKRCEwESqI2e6WVGlF03fs9DbQQXQ==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa-logger@3.1.2:
-    resolution: {integrity: sha512-sioTA1xlKYiIgryANWPRHBkG3XGbWftw9slWADUPC+qvPIY/yRLSrhvX7zkJwMrntub5dPO0GuAoyGGf0yitfQ==}
+  /@types/koa-logger@3.1.5:
+    resolution: {integrity: sha512-N4f9GRdokJ/gLiCSvd3GGar/D74HJWzuvSJiruayCsz2e7gGkG6DQaque+kM3xo6LjyCRVUUt9HHJCSMjsXrIA==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa-mount@4.0.2:
-    resolution: {integrity: sha512-XnuGwV8bzw22nv2WqOs5a8wCHR2VgSnLLLuBQPzNTmhyiAvH0O6c+994rQVbMaBuwQJKefUInkvKoKuk+21uew==}
+  /@types/koa-mount@4.0.5:
+    resolution: {integrity: sha512-pV1njJ7r94iqAFzT9D5sGSYKUHFGudCLAnmr4WFli7V5tJf5MAgRQK9leTPJ4gjvgr+hnTf86fZsKoFN358c7w==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa-send@4.1.3:
-    resolution: {integrity: sha512-daaTqPZlgjIJycSTNjKpHYuKhXYP30atFc1pBcy6HHqB9+vcymDgYTguPdx9tO4HMOqNyz6bz/zqpxt5eLR+VA==}
+  /@types/koa-send@4.1.6:
+    resolution: {integrity: sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa-views@7.0.0(@types/koa@2.13.8)(pug@3.0.2):
-    resolution: {integrity: sha512-AB/NB+oFHcLOZJYFv3bG5Af8YbwYCD9/zK0WcKALsbjI/FRKrcXTUTC64RebDrkyOkBm3bpCgpGndhAH/3YQ2Q==}
-    deprecated: This is a stub types definition. koa-views provides its own type definitions, so you do not need this installed.
-    dependencies:
-      koa-views: 7.0.2(@types/koa@2.13.8)(ejs@3.1.9)(pug@3.0.2)
-    transitivePeerDependencies:
-      - '@types/koa'
-      - arc-templates
-      - atpl
-      - babel-core
-      - bracket-template
-      - coffee-script
-      - dot
-      - dust
-      - dustjs-helpers
-      - dustjs-linkedin
-      - eco
-      - ect
-      - ejs
-      - haml-coffee
-      - hamlet
-      - hamljs
-      - handlebars
-      - hogan.js
-      - htmling
-      - jade
-      - jazz
-      - jqtpl
-      - just
-      - liquid-node
-      - liquor
-      - lodash
-      - marko
-      - mote
-      - mustache
-      - nunjucks
-      - plates
-      - pug
-      - qejs
-      - ractive
-      - razor-tmpl
-      - react
-      - react-dom
-      - slm
-      - squirrelly
-      - supports-color
-      - swig
-      - swig-templates
-      - teacup
-      - templayed
-      - then-jade
-      - then-pug
-      - tinyliquid
-      - toffee
-      - twig
-      - twing
-      - underscore
-      - vash
-      - velocityjs
-      - walrus
-      - whiskers
-    dev: true
-
-  /@types/koa@2.13.8:
-    resolution: {integrity: sha512-Ugmxmgk/yPRW3ptBTh9VjOLwsKWJuGbymo1uGX0qdaqqL18uJiiG1ZoV0rxCOYSaDGhvEp5Ece02Amx0iwaxQQ==}
+  /@types/koa@2.13.11:
+    resolution: {integrity: sha512-0HZSGNdmLlLRvSxv0ngLSp09Hw98c+2XL3ZRYmkE6y8grqTweKEyyaj7LgxkyPUv0gQ5pNS/a7kHXo2Iwha1rA==}
     dependencies:
       '@types/accepts': 1.3.5
-      '@types/content-disposition': 0.5.5
+      '@types/content-disposition': 0.5.8
       '@types/cookies': 0.7.7
       '@types/http-assert': 1.5.3
       '@types/http-errors': 2.0.1
       '@types/keygrip': 1.0.2
       '@types/koa-compose': 3.2.5
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
 
-  /@types/koa__cors@3.3.0:
-    resolution: {integrity: sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA==}
+  /@types/koa__cors@4.0.3:
+    resolution: {integrity: sha512-zj+1sQO/6GGRGINRXlMmoiFwHibKVcjNGdh+p2SpqHDMLyvC+ce0LMHX6UBi1rdpnPZ/+osUwWdGKF945ffrzA==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa__multer@2.0.4:
-    resolution: {integrity: sha512-WRkshXhE5rpYFUbbtAjyMhdOOSdbu1XX+2AQlRNM6AZtgxd0/WXMU4lrP7e9tk5HWVTWbx8DOOsVBmfHjSGJ4w==}
+  /@types/koa__multer@2.0.7:
+    resolution: {integrity: sha512-O7hiAEpdgW1nly93jQ8TVL2nPC7Bg1HHRf1/LGNQb7ygGBjNgZWpliCm7tswNW3MjcgYbTtz0+Sca5wHne+RyA==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
-  /@types/koa__router@8.0.11:
-    resolution: {integrity: sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==}
+  /@types/koa__router@12.0.4:
+    resolution: {integrity: sha512-Y7YBbSmfXZpa/m5UGGzb7XadJIRBRnwNY9cdAojZGp65Cpe5MAP3mOZE7e3bImt8dfKS4UFcR16SLH8L/z7PBw==}
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
     dev: true
 
   /@types/long@4.0.2:
     resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
     dev: false
 
-  /@types/matter-js@0.19.0:
-    resolution: {integrity: sha512-SqgYUc8j68n/R2p8rVgpxTVC6gwCby+93dd5eWqjQdpL3l3JUqxzhbEJH/X0NXv+pmoAeWheH1kPvFIgC904Bw==}
+  /@types/matter-js@0.19.4:
+    resolution: {integrity: sha512-CHKobJ2Kr9GJqr1uvoL4v3DCCgf44b0qJcOctbHtkmPBDMMN0ORnIwNS0WNFxiD0YqtySZH7IgaefGFZ0NUcMA==}
     dev: true
 
   /@types/mdast@3.0.12:
@@ -3825,72 +4248,70 @@ packages:
     resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
     dev: true
 
-  /@types/minimist@1.2.2:
-    resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
+  /@types/minimist@1.2.4:
+    resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==}
     dev: true
 
-  /@types/mocha@9.1.1:
-    resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==}
+  /@types/mocha@10.0.4:
+    resolution: {integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==}
     dev: true
 
   /@types/needle@3.2.0:
     resolution: {integrity: sha512-6XzvzEyJ2ozFNfPajFmqH9JOt0Hp+9TawaYpJT59iIP/zR0U37cfWCRwosyIeEBBZBi021Osq4jGAD3AOju5fg==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/node-fetch@2.6.4:
-    resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
+  /@types/node-fetch@2.6.9:
+    resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==}
     dependencies:
-      '@types/node': 20.5.8
-      form-data: 3.0.1
+      '@types/node': 20.9.0
+      form-data: 4.0.0
+
+  /@types/node@14.18.63:
+    resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
     dev: false
 
-  /@types/node-fetch@3.0.3:
-    resolution: {integrity: sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==}
-    deprecated: This is a stub types definition. node-fetch provides its own type definitions, so you do not need this installed.
-    dependencies:
-      node-fetch: 3.3.2
-    dev: true
-
-  /@types/node@14.18.54:
-    resolution: {integrity: sha512-uq7O52wvo2Lggsx1x21tKZgqkJpvwCseBBPtX/nKQfpVlEsLOb11zZ1CRsWUKvJF0+lzuA9jwvA7Pr2Wt7i3xw==}
-
   /@types/node@18.11.18:
     resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
-
-  /@types/node@20.3.1:
-    resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==}
     dev: true
 
-  /@types/node@20.4.9:
-    resolution: {integrity: sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==}
-    dev: true
-
-  /@types/node@20.5.8:
-    resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==}
-
-  /@types/nodemailer@6.4.9:
-    resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==}
+  /@types/node@18.18.9:
+    resolution: {integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==}
     dependencies:
-      '@types/node': 18.11.18
+      undici-types: 5.26.5
     dev: true
 
-  /@types/normalize-package-data@2.4.1:
-    resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+  /@types/node@20.9.0:
+    resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==}
+    dependencies:
+      undici-types: 5.26.5
+
+  /@types/nodemailer@6.4.14:
+    resolution: {integrity: sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==}
+    dependencies:
+      '@types/node': 20.9.0
+    dev: true
+
+  /@types/normalize-package-data@2.4.3:
+    resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==}
     dev: true
 
   /@types/oauth@0.9.1:
     resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
+    dev: false
+
+  /@types/oauth@0.9.4:
+    resolution: {integrity: sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==}
+    dependencies:
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/oauth@0.9.2:
-    resolution: {integrity: sha512-Nu3/abQ6yR9VlsCdX3aiGsWFkj6OJvJqDvg/36t8Gwf2mFXdBZXPDN3K+2yfeA6Lo2m1Q12F8Qil9TZ48nWhOQ==}
-    dependencies:
-      '@types/node': 20.5.8
-    dev: false
+  /@types/object-assign-deep@0.4.2:
+    resolution: {integrity: sha512-iF6qYKjYdg/kFg3AEM/msyh1+U4zZW043d2TnCS9fwib00nc8Asj+38LgIpkO/UpfUMRgJ0m/tHATwU2F8Bfow==}
+    dev: true
 
   /@types/offscreencanvas@2019.3.0:
     resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==}
@@ -3900,67 +4321,76 @@ packages:
     resolution: {integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==}
     dev: false
 
+  /@types/opencc-js@1.0.3:
+    resolution: {integrity: sha512-TENp7YkI2hNlc4dplhivSHj0hU4DORCK56VY7rniaSfA5f87uD3uv+kPIRuH9h64TGv976iVFi4gEHZZtS2y8Q==}
+    dev: true
+
+  /@types/parse-link-header@2.0.2:
+    resolution: {integrity: sha512-RKU5SIF0oyM2ZI0ubw66FkM/0RJUv/r84I7vJcXkcICcfeOpd1WXfpcqkFJPaWli5z3YdxMsfWojyU5uofT6sA==}
+    dev: true
+
+  /@types/pg@8.10.9:
+    resolution: {integrity: sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ==}
+    dependencies:
+      '@types/node': 20.9.0
+      pg-protocol: 1.6.0
+      pg-types: 4.0.1
+    dev: true
+
   /@types/picomatch@2.3.0:
     resolution: {integrity: sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==}
     dev: true
 
-  /@types/prettier@2.7.3:
-    resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
+  /@types/prismjs@1.26.3:
+    resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==}
     dev: true
 
-  /@types/probe-image-size@7.2.0:
-    resolution: {integrity: sha512-R5H3vw62gHNHrn+JGZbKejb+Z2D/6E5UNVlhCzIaBBLroMQMOFqy5Pap2gM+ZZHdqBtVU0/cx/M6to+mOJcoew==}
+  /@types/probe-image-size@7.2.3:
+    resolution: {integrity: sha512-6OJa/Tj7OjiahwdcfLWvrzGpXLSjLfbfjqdpth2Oy9YKI58A6Ec5YvFcqfVXOSaJPkA3W+nZx6cPheMQrdtz1w==}
     dependencies:
       '@types/needle': 3.2.0
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/pug@2.0.6:
-    resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
+  /@types/pug@2.0.9:
+    resolution: {integrity: sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==}
     dev: true
 
-  /@types/punycode@2.1.0:
-    resolution: {integrity: sha512-PG5aLpW6PJOeV2fHRslP4IOMWn+G+Uq8CfnyJ+PDS8ndCbU+soO+fB3NKCKo0p/Jh2Y4aPaiQZsrOXFdzpcA6g==}
+  /@types/punycode@2.1.2:
+    resolution: {integrity: sha512-KKQ4GjRCpswGPA6ZfvPrC+7h84bAvPkU1kFGJ3FuQOgZIEc8JmO1jcDCaxSiYcN3qzOOp9YqHq+njKEO3Q4BnA==}
     dev: true
 
-  /@types/qrcode@1.5.1:
-    resolution: {integrity: sha512-HpSN675K0PmxIDRpjMI3Mc2GiKo3dNu+X/F5SoItiaDS1lVfgC6Wac1c5lQDfKWbTJUSHWiHKzpJpBZG7k9gaA==}
+  /@types/qrcode@1.5.5:
+    resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/qs@6.9.7:
-    resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
+  /@types/qs@6.9.10:
+    resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==}
 
-  /@types/random-seed@0.3.3:
-    resolution: {integrity: sha512-kHsCbIRHNXJo6EN5W8EA5b4i1hdT6jaZke5crBPLUcLqaLdZ0QBq8QVMbafHzhjFF83Cl9qlee2dChD18d/kPg==}
+  /@types/random-seed@0.3.5:
+    resolution: {integrity: sha512-CftxcDPAHgs0SLHU2dt+ZlDPJfGqLW3sZlC/ATr5vJDSe5tRLeOne7HMvCOJnFyF8e1U41wqzs3h6AMC613xtA==}
     dev: true
 
   /@types/range-parser@1.2.4:
     resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==}
 
-  /@types/ratelimiter@3.4.4:
-    resolution: {integrity: sha512-GSMb93iSA8KKFDgVL2Wzs/kqrHMJcU8xhLdwI5omoACcj7K18SacklLtY1C4G02HC5drd6GygtsIaGbfxJSe0g==}
+  /@types/ratelimiter@3.4.6:
+    resolution: {integrity: sha512-Bv6WLSXPGLVsBjkizXtn+ef78R92e36/DFQo2wXPTHtp1cYXF6rCULMqf9WcZPAtyMZMvQAtIPeYMA1xAyxghw==}
     dev: true
 
-  /@types/redis@4.0.11:
-    resolution: {integrity: sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==}
-    deprecated: This is a stub types definition. redis provides its own type definitions, so you do not need this installed.
-    dependencies:
-      redis: 4.6.7
-    dev: true
-
-  /@types/rename@1.0.4:
-    resolution: {integrity: sha512-eV81+6bVv2mdCBahkMefjEUwAjKDAP3AuyhqWCWRxcRaeVdUeHUBaoq2zSz+5HNHF2jzTajMcfLvJsy4K3cbwA==}
+  /@types/rename@1.0.7:
+    resolution: {integrity: sha512-E9qapfghUGfBMi3jNhsmCKPIp3f2zvNKpaX1BDGLGJNjzpgsZ/RTx7NaNksFjGoJ+r9NvWF1NSM5vVecnNjVmw==}
     dev: true
 
   /@types/responselike@1.0.0:
     resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
-  /@types/sanitize-html@2.9.0:
-    resolution: {integrity: sha512-4fP/kEcKNj2u39IzrxWYuf/FnCCwwQCpif6wwY6ROUS1EPRIfWJjGkY3HIowY1EX/VbX5e86yq8AAE7UPMgATg==}
+  /@types/sanitize-html@2.9.4:
+    resolution: {integrity: sha512-Ym4hjmAFxF/eux7nW2yDPAj2o9RYh0vP/9V5ECoHtgJ/O9nPGslUd20CMn6WatRMlFVfjMTg3lMcWq8YyO6QnA==}
     dependencies:
       htmlparser2: 8.0.2
     dev: true
@@ -3969,63 +4399,71 @@ packages:
     resolution: {integrity: sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==}
     dev: false
 
-  /@types/seedrandom@3.0.5:
-    resolution: {integrity: sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==}
+  /@types/seedrandom@3.0.8:
+    resolution: {integrity: sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==}
     dev: true
 
-  /@types/semver@7.5.0:
-    resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
+  /@types/semver@7.5.5:
+    resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==}
     dev: true
 
   /@types/send@0.17.1:
     resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==}
     dependencies:
       '@types/mime': 1.3.2
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
   /@types/serve-static@1.15.2:
     resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==}
     dependencies:
       '@types/http-errors': 2.0.1
       '@types/mime': 3.0.1
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
 
   /@types/sinonjs__fake-timers@8.1.1:
     resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==}
     dev: true
 
-  /@types/sinonjs__fake-timers@8.1.2:
-    resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==}
+  /@types/sinonjs__fake-timers@8.1.5:
+    resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==}
     dev: true
 
   /@types/sizzle@2.3.3:
     resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==}
     dev: true
 
-  /@types/sortablejs@1.15.1:
-    resolution: {integrity: sha512-g/JwBNToh6oCTAwNS8UGVmjO7NLDKsejVhvE4x1eWiPTC3uCuNsa/TD4ssvX3du+MLiM+SHPNDuijp8y76JzLQ==}
+  /@types/sortablejs@1.15.4:
+    resolution: {integrity: sha512-7oL7CcPSfoyoNx3Ba1+79ykJzpEKVhHUyfAiN5eT/FoeDXOR3eBDLXf9ndDNuxaExmjpI+zVi2dMMuaoXUOzNA==}
     dev: true
 
-  /@types/stack-utils@2.0.1:
-    resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
+  /@types/stack-utils@2.0.2:
+    resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==}
     dev: true
 
   /@types/streamx@2.9.1:
     resolution: {integrity: sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/throttle-debounce@5.0.0:
-    resolution: {integrity: sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==}
+  /@types/syslog-pro@1.0.3:
+    resolution: {integrity: sha512-tI558N5Io/04ya5eO5HJRIHLLJK/2Q1y4j6Fb0POVSNgRFxfJCOZHEyNrpcagdEtw9i25Diq3NXfs1qa0yyMIw==}
     dev: true
 
-  /@types/tinycolor2@1.4.3:
-    resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==}
+  /@types/textarea-caret@3.0.3:
+    resolution: {integrity: sha512-bsA9GdXV1wQsXyDjS5+A+czz8IAR3haH5DU+KctIoXbzobRL2NOiwF/+EbB7pofAyudMytLj4ihPtbmbJT8FWw==}
     dev: true
 
-  /@types/tmp@0.2.3:
-    resolution: {integrity: sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==}
+  /@types/throttle-debounce@5.0.2:
+    resolution: {integrity: sha512-pDzSNulqooSKvSNcksnV72nk8p7gRqN8As71Sp28nov1IgmPKWbOEIwAWvBME5pPTtaXJAvG3O4oc76HlQ4kqQ==}
+    dev: true
+
+  /@types/tinycolor2@1.4.6:
+    resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
+    dev: true
+
+  /@types/tmp@0.2.6:
+    resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==}
     dev: true
 
   /@types/undertaker-registry@1.0.1:
@@ -4035,7 +4473,7 @@ packages:
   /@types/undertaker@1.2.8:
     resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       '@types/undertaker-registry': 1.0.1
       async-done: 1.3.2
     dev: true
@@ -4044,19 +4482,19 @@ packages:
     resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==}
     dev: true
 
-  /@types/uuid@9.0.2:
-    resolution: {integrity: sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==}
-    dev: true
-
   /@types/uuid@9.0.3:
     resolution: {integrity: sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==}
     dev: true
 
+  /@types/uuid@9.0.7:
+    resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==}
+    dev: true
+
   /@types/vinyl-fs@3.0.2:
     resolution: {integrity: sha512-ctNcmmzbMIKooXjRkyyUCOu2Z4AyqibL+RhXoF3pb7K7j+ezItnakmpm31LymkYHSIM5ey0tjIFzTvFOTSBCGw==}
     dependencies:
       '@types/glob-stream': 8.0.0
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       '@types/vinyl': 2.0.7
     dev: true
 
@@ -4064,55 +4502,52 @@ packages:
     resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==}
     dependencies:
       '@types/expect': 1.20.4
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/web-push@3.3.2:
-    resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==}
+  /@types/web-push@3.6.3:
+    resolution: {integrity: sha512-v3oT4mMJsHeJ/rraliZ+7TbZtr5bQQuxcgD7C3/1q/zkAj29c8RE0F9lVZVu3hiQe5Z9fYcBreV7TLnfKR+4mg==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/webgl-ext@0.0.30:
-    resolution: {integrity: sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==}
-    dev: false
-
-  /@types/webgl2@0.0.6:
-    resolution: {integrity: sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==}
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@types/websocket@1.0.5:
-    resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==}
+  /@types/websocket@1.0.9:
+    resolution: {integrity: sha512-xrMBdqdKdlE+7L9Wg2PQblIkZGSgiMlEoP6UAaYKMHbbxqCJ6PV/pTZ2RcMcSSERurU2TtGbmO4lqpFOJd01ww==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
     dev: true
 
   /@types/ws@8.5.5:
     resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==}
     dependencies:
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
+    dev: false
 
-  /@types/yargs-parser@21.0.0:
-    resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
-    dev: true
-
-  /@types/yargs@16.0.5:
-    resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==}
+  /@types/ws@8.5.9:
+    resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==}
     dependencies:
-      '@types/yargs-parser': 21.0.0
+      '@types/node': 20.9.0
     dev: true
 
-  /@types/yauzl@2.10.0:
-    resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
+  /@types/yargs-parser@21.0.2:
+    resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==}
+    dev: true
+
+  /@types/yargs@17.0.29:
+    resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==}
+    dependencies:
+      '@types/yargs-parser': 21.0.2
+    dev: true
+
+  /@types/yauzl@2.10.2:
+    resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==}
     requiresBuild: true
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
     dev: true
     optional: true
 
-  /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.2.2):
+  /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.4):
     resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -4124,24 +4559,52 @@ packages:
         optional: true
     dependencies:
       '@eslint-community/regexpp': 4.6.2
-      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
       '@typescript-eslint/scope-manager': 5.62.0
-      '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
       debug: 4.3.4(supports-color@8.1.1)
       eslint: 8.46.0
       graphemer: 1.4.0
       ignore: 5.2.4
       natural-compare-lite: 1.4.0
       semver: 7.5.4
+      tsutils: 3.21.0(typescript@4.9.4)
+      typescript: 4.9.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^5.0.0
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@eslint-community/regexpp': 4.6.2
+      '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/scope-manager': 5.62.0
+      '@typescript-eslint/type-utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.53.0
+      graphemer: 1.4.0
+      ignore: 5.2.4
+      natural-compare-lite: 1.4.0
+      semver: 7.5.4
       tsutils: 3.21.0(typescript@5.2.2)
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==}
+  /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==}
     engines: {node: ^16.0.0 || >=18.0.0}
     peerDependencies:
       '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
@@ -4151,18 +4614,17 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@eslint-community/regexpp': 4.6.2
-      '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/scope-manager': 6.3.0
-      '@typescript-eslint/type-utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
-      '@typescript-eslint/visitor-keys': 6.3.0
+      '@eslint-community/regexpp': 4.9.1
+      '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/scope-manager': 6.11.0
+      '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      '@typescript-eslint/visitor-keys': 6.11.0
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       graphemer: 1.4.0
       ignore: 5.2.4
       natural-compare: 1.4.0
-      natural-compare-lite: 1.4.0
       semver: 7.5.4
       ts-api-utils: 1.0.1(typescript@5.2.2)
       typescript: 5.2.2
@@ -4170,7 +4632,27 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@5.2.2):
+  /@typescript-eslint/parser@5.62.0(eslint@8.46.0)(typescript@4.9.4):
+    resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/scope-manager': 5.62.0
+      '@typescript-eslint/types': 5.62.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4)
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.46.0
+      typescript: 4.9.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/parser@5.62.0(eslint@8.53.0)(typescript@5.2.2):
     resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -4184,14 +4666,14 @@ packages:
       '@typescript-eslint/types': 5.62.0
       '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser@6.3.0(eslint@8.46.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==}
+  /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==}
     engines: {node: ^16.0.0 || >=18.0.0}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
@@ -4200,12 +4682,12 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/scope-manager': 6.3.0
-      '@typescript-eslint/types': 6.3.0
-      '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2)
-      '@typescript-eslint/visitor-keys': 6.3.0
+      '@typescript-eslint/scope-manager': 6.11.0
+      '@typescript-eslint/types': 6.11.0
+      '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
+      '@typescript-eslint/visitor-keys': 6.11.0
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
@@ -4219,15 +4701,35 @@ packages:
       '@typescript-eslint/visitor-keys': 5.62.0
     dev: true
 
-  /@typescript-eslint/scope-manager@6.3.0:
-    resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==}
+  /@typescript-eslint/scope-manager@6.11.0:
+    resolution: {integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==}
     engines: {node: ^16.0.0 || >=18.0.0}
     dependencies:
-      '@typescript-eslint/types': 6.3.0
-      '@typescript-eslint/visitor-keys': 6.3.0
+      '@typescript-eslint/types': 6.11.0
+      '@typescript-eslint/visitor-keys': 6.11.0
     dev: true
 
-  /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.2.2):
+  /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@4.9.4):
+    resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.46.0
+      tsutils: 3.21.0(typescript@4.9.4)
+      typescript: 4.9.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/type-utils@5.62.0(eslint@8.53.0)(typescript@5.2.2):
     resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -4238,17 +4740,17 @@ packages:
         optional: true
     dependencies:
       '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
-      '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       tsutils: 3.21.0(typescript@5.2.2)
       typescript: 5.2.2
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@typescript-eslint/type-utils@6.3.0(eslint@8.46.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==}
+  /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==}
     engines: {node: ^16.0.0 || >=18.0.0}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
@@ -4257,10 +4759,10 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2)
-      '@typescript-eslint/utils': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
+      '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       ts-api-utils: 1.0.1(typescript@5.2.2)
       typescript: 5.2.2
     transitivePeerDependencies:
@@ -4272,11 +4774,32 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
-  /@typescript-eslint/types@6.3.0:
-    resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==}
+  /@typescript-eslint/types@6.11.0:
+    resolution: {integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==}
     engines: {node: ^16.0.0 || >=18.0.0}
     dev: true
 
+  /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.4):
+    resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 5.62.0
+      '@typescript-eslint/visitor-keys': 5.62.0
+      debug: 4.3.4(supports-color@8.1.1)
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.5.4
+      tsutils: 3.21.0(typescript@4.9.4)
+      typescript: 4.9.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2):
     resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -4298,8 +4821,8 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/typescript-estree@6.3.0(typescript@5.2.2):
-    resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==}
+  /@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2):
+    resolution: {integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==}
     engines: {node: ^16.0.0 || >=18.0.0}
     peerDependencies:
       typescript: '*'
@@ -4307,8 +4830,8 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/types': 6.3.0
-      '@typescript-eslint/visitor-keys': 6.3.0
+      '@typescript-eslint/types': 6.11.0
+      '@typescript-eslint/visitor-keys': 6.11.0
       debug: 4.3.4(supports-color@8.1.1)
       globby: 11.1.0
       is-glob: 4.0.3
@@ -4319,7 +4842,7 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.2.2):
+  /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@4.9.4):
     resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -4327,10 +4850,10 @@ packages:
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
       '@types/json-schema': 7.0.12
-      '@types/semver': 7.5.0
+      '@types/semver': 7.5.5
       '@typescript-eslint/scope-manager': 5.62.0
       '@typescript-eslint/types': 5.62.0
-      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.4)
       eslint: 8.46.0
       eslint-scope: 5.1.1
       semver: 7.5.4
@@ -4339,19 +4862,39 @@ packages:
       - typescript
     dev: true
 
-  /@typescript-eslint/utils@6.3.0(eslint@8.46.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==}
+  /@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.5
+      '@typescript-eslint/scope-manager': 5.62.0
+      '@typescript-eslint/types': 5.62.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
+      eslint: 8.53.0
+      eslint-scope: 5.1.1
+      semver: 7.5.4
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==}
     engines: {node: ^16.0.0 || >=18.0.0}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
-      '@types/json-schema': 7.0.12
-      '@types/semver': 7.5.0
-      '@typescript-eslint/scope-manager': 6.3.0
-      '@typescript-eslint/types': 6.3.0
-      '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.2.2)
-      eslint: 8.46.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      '@types/json-schema': 7.0.14
+      '@types/semver': 7.5.5
+      '@typescript-eslint/scope-manager': 6.11.0
+      '@typescript-eslint/types': 6.11.0
+      '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
+      eslint: 8.53.0
       semver: 7.5.4
     transitivePeerDependencies:
       - supports-color
@@ -4366,114 +4909,118 @@ packages:
       eslint-visitor-keys: 3.4.2
     dev: true
 
-  /@typescript-eslint/visitor-keys@6.3.0:
-    resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==}
+  /@typescript-eslint/visitor-keys@6.11.0:
+    resolution: {integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==}
     engines: {node: ^16.0.0 || >=18.0.0}
     dependencies:
-      '@typescript-eslint/types': 6.3.0
-      eslint-visitor-keys: 3.4.2
+      '@typescript-eslint/types': 6.11.0
+      eslint-visitor-keys: 3.4.3
     dev: true
 
-  /@vitejs/plugin-vue@4.3.4(vite@4.4.9)(vue@3.3.4):
-    resolution: {integrity: sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==}
+  /@ungap/structured-clone@1.2.0:
+    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+    dev: true
+
+  /@vitejs/plugin-vue@4.5.0(vite@5.0.0)(vue@3.3.8):
+    resolution: {integrity: sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
-      vite: ^4.0.0
+      vite: ^4.0.0 || ^5.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 4.4.9(@types/node@20.5.8)(sass@1.66.1)
-      vue: 3.3.4
+      vite: 5.0.0(@types/node@20.9.0)(sass@1.69.5)
+      vue: 3.3.8(typescript@5.2.2)
     dev: true
 
-  /@vue/compiler-core@3.3.4:
-    resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==}
+  /@vue/compiler-core@3.3.8:
+    resolution: {integrity: sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==}
     dependencies:
-      '@babel/parser': 7.22.10
-      '@vue/shared': 3.3.4
+      '@babel/parser': 7.23.0
+      '@vue/shared': 3.3.8
       estree-walker: 2.0.2
       source-map-js: 1.0.2
     dev: true
 
-  /@vue/compiler-dom@3.3.4:
-    resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==}
+  /@vue/compiler-dom@3.3.8:
+    resolution: {integrity: sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==}
     dependencies:
-      '@vue/compiler-core': 3.3.4
-      '@vue/shared': 3.3.4
+      '@vue/compiler-core': 3.3.8
+      '@vue/shared': 3.3.8
     dev: true
 
   /@vue/compiler-sfc@2.7.14:
     resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==}
     dependencies:
-      '@babel/parser': 7.22.10
+      '@babel/parser': 7.23.0
       postcss: 8.4.27
       source-map: 0.6.1
     dev: true
 
-  /@vue/compiler-sfc@3.3.4:
-    resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==}
+  /@vue/compiler-sfc@3.3.8:
+    resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==}
     dependencies:
-      '@babel/parser': 7.22.10
-      '@vue/compiler-core': 3.3.4
-      '@vue/compiler-dom': 3.3.4
-      '@vue/compiler-ssr': 3.3.4
-      '@vue/reactivity-transform': 3.3.4
-      '@vue/shared': 3.3.4
+      '@babel/parser': 7.23.0
+      '@vue/compiler-core': 3.3.8
+      '@vue/compiler-dom': 3.3.8
+      '@vue/compiler-ssr': 3.3.8
+      '@vue/reactivity-transform': 3.3.8
+      '@vue/shared': 3.3.8
       estree-walker: 2.0.2
-      magic-string: 0.30.2
-      postcss: 8.4.27
+      magic-string: 0.30.5
+      postcss: 8.4.31
       source-map-js: 1.0.2
     dev: true
 
-  /@vue/compiler-ssr@3.3.4:
-    resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==}
+  /@vue/compiler-ssr@3.3.8:
+    resolution: {integrity: sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==}
     dependencies:
-      '@vue/compiler-dom': 3.3.4
-      '@vue/shared': 3.3.4
+      '@vue/compiler-dom': 3.3.8
+      '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/reactivity-transform@3.3.4:
-    resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==}
+  /@vue/reactivity-transform@3.3.8:
+    resolution: {integrity: sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==}
     dependencies:
-      '@babel/parser': 7.22.10
-      '@vue/compiler-core': 3.3.4
-      '@vue/shared': 3.3.4
+      '@babel/parser': 7.23.0
+      '@vue/compiler-core': 3.3.8
+      '@vue/shared': 3.3.8
       estree-walker: 2.0.2
-      magic-string: 0.30.2
+      magic-string: 0.30.5
     dev: true
 
-  /@vue/reactivity@3.3.4:
-    resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==}
+  /@vue/reactivity@3.3.8:
+    resolution: {integrity: sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==}
     dependencies:
-      '@vue/shared': 3.3.4
+      '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/runtime-core@3.3.4:
-    resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==}
+  /@vue/runtime-core@3.3.8:
+    resolution: {integrity: sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==}
     dependencies:
-      '@vue/reactivity': 3.3.4
-      '@vue/shared': 3.3.4
+      '@vue/reactivity': 3.3.8
+      '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/runtime-dom@3.3.4:
-    resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==}
+  /@vue/runtime-dom@3.3.8:
+    resolution: {integrity: sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==}
     dependencies:
-      '@vue/runtime-core': 3.3.4
-      '@vue/shared': 3.3.4
+      '@vue/runtime-core': 3.3.8
+      '@vue/shared': 3.3.8
       csstype: 3.1.2
     dev: true
 
-  /@vue/server-renderer@3.3.4(vue@3.3.4):
-    resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==}
+  /@vue/server-renderer@3.3.8(vue@3.3.8):
+    resolution: {integrity: sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==}
     peerDependencies:
-      vue: 3.3.4
+      vue: 3.3.8
     dependencies:
-      '@vue/compiler-ssr': 3.3.4
-      '@vue/shared': 3.3.4
-      vue: 3.3.4
+      '@vue/compiler-ssr': 3.3.8
+      '@vue/shared': 3.3.8
+      vue: 3.3.8(typescript@5.2.2)
     dev: true
 
-  /@vue/shared@3.3.4:
-    resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==}
+  /@vue/shared@3.3.8:
+    resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==}
     dev: true
 
   /@webassemblyjs/ast@1.11.6:
@@ -4582,16 +5129,6 @@ packages:
       '@xtuc/long': 4.2.2
     dev: true
 
-  /@webgpu/types@0.1.16:
-    resolution: {integrity: sha512-9E61voMP4+Rze02jlTXud++Htpjyyk8vw5Hyw9FGRrmhHQg2GqbuOfwf5Klrb8vTxc2XWI3EfO7RUHMpxTj26A==}
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@webgpu/types@0.1.21:
-    resolution: {integrity: sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==}
-    dev: false
-
   /@webgpu/types@0.1.30:
     resolution: {integrity: sha512-9AXJSmL3MzY8ZL//JjudA//q+2kBRGhLBFpkdGksWIuxrMy81nFrCzj2Am+mbh8WoU6rXmv7cY5E3rdlyru2Qg==}
     dev: false
@@ -4604,12 +5141,14 @@ packages:
     resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
     dev: true
 
-  /abab@2.0.6:
-    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
-    dev: true
-
   /abbrev@1.1.1:
     resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+    dev: false
+
+  /abbrev@2.0.0:
+    resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    dev: false
 
   /abort-controller@3.0.0:
     resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
@@ -4626,13 +5165,6 @@ packages:
       negotiator: 0.6.3
     dev: false
 
-  /acorn-globals@6.0.0:
-    resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==}
-    dependencies:
-      acorn: 7.4.1
-      acorn-walk: 7.2.0
-    dev: true
-
   /acorn-import-assertions@1.9.0(acorn@8.10.0):
     resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
     peerDependencies:
@@ -4649,11 +5181,6 @@ packages:
       acorn: 8.10.0
     dev: true
 
-  /acorn-walk@7.2.0:
-    resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
   /acorn-walk@8.2.0:
     resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
     engines: {node: '>=0.4.0'}
@@ -4693,6 +5220,7 @@ packages:
       debug: 4.3.4(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
+    dev: false
 
   /agent-base@7.1.0:
     resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
@@ -4703,13 +5231,6 @@ packages:
       - supports-color
     dev: false
 
-  /agentkeepalive@4.5.0:
-    resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
-    engines: {node: '>= 8.0.0'}
-    dependencies:
-      humanize-ms: 1.2.1
-    dev: false
-
   /aggregate-error@3.1.0:
     resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
     engines: {node: '>=8'}
@@ -4798,6 +5319,10 @@ packages:
     resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
     engines: {node: '>=12'}
 
+  /ansi-sequence-parser@1.1.1:
+    resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==}
+    dev: true
+
   /ansi-styles@2.2.1:
     resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
     engines: {node: '>=0.10.0'}
@@ -4831,6 +5356,7 @@ packages:
 
   /any-promise@1.3.0:
     resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+    dev: false
 
   /anymatch@2.0.0:
     resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==}
@@ -4872,49 +5398,29 @@ packages:
     resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
     dev: true
 
-  /archiver-utils@2.1.0:
-    resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
-    engines: {node: '>= 6'}
+  /archiver-utils@4.0.1:
+    resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==}
+    engines: {node: '>= 12.0.0'}
     dependencies:
-      glob: 7.2.3
+      glob: 8.1.0
       graceful-fs: 4.2.11
       lazystream: 1.0.1
-      lodash.defaults: 4.2.0
-      lodash.difference: 4.5.0
-      lodash.flatten: 4.4.0
-      lodash.isplainobject: 4.0.6
-      lodash.union: 4.6.0
-      normalize-path: 3.0.0
-      readable-stream: 2.3.8
-    dev: false
-
-  /archiver-utils@3.0.4:
-    resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
-    engines: {node: '>= 10'}
-    dependencies:
-      glob: 7.2.3
-      graceful-fs: 4.2.11
-      lazystream: 1.0.1
-      lodash.defaults: 4.2.0
-      lodash.difference: 4.5.0
-      lodash.flatten: 4.4.0
-      lodash.isplainobject: 4.0.6
-      lodash.union: 4.6.0
+      lodash: 4.17.21
       normalize-path: 3.0.0
       readable-stream: 3.6.2
     dev: false
 
-  /archiver@6.0.0:
-    resolution: {integrity: sha512-EPGa+bYaxaMiCT8DCbEDqFz8IjeBSExrJzyUOJx2FBkFJ/OZzJuso3lMSk901M50gMqXxTQcumlGajOFlXhVhw==}
+  /archiver@6.0.1:
+    resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      archiver-utils: 3.0.4
+      archiver-utils: 4.0.1
       async: 3.2.4
       buffer-crc32: 0.2.13
       readable-stream: 3.6.2
       readdir-glob: 1.1.3
-      tar-stream: 2.2.0
-      zip-stream: 4.1.0
+      tar-stream: 3.1.6
+      zip-stream: 5.0.1
     dev: false
 
   /archy@1.0.0:
@@ -4935,14 +5441,6 @@ packages:
       readable-stream: 3.6.2
     dev: false
 
-  /are-we-there-yet@3.0.1:
-    resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-    dependencies:
-      delegates: 1.0.0
-      readable-stream: 3.6.2
-    dev: false
-
   /arg@4.1.3:
     resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
 
@@ -4950,8 +5448,8 @@ packages:
     resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
     dev: true
 
-  /argon2@0.31.1:
-    resolution: {integrity: sha512-ik2xnJrLXazya7m4Nz1XfBSRjXj8Koq8qF9PsQC8059p20ifWc9zx/hgU3ItZh/3TnwXkv0RbhvjodPkmFf0bg==}
+  /argon2@0.31.2:
+    resolution: {integrity: sha512-QSnJ8By5Mth60IEte45w9Y7v6bWcQw3YhRtJKKN8oNCxnTLDiv/AXXkDPf2srTMfxFVn3QJdVv2nhXESsUa+Yg==}
     engines: {node: '>=14.0.0'}
     requiresBuild: true
     dependencies:
@@ -5028,6 +5526,17 @@ packages:
       is-string: 1.0.7
     dev: true
 
+  /array-includes@3.1.7:
+    resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+      get-intrinsic: 1.2.1
+      is-string: 1.0.7
+    dev: true
+
   /array-initial@1.1.0:
     resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==}
     engines: {node: '>=0.10.0'}
@@ -5078,6 +5587,17 @@ packages:
       get-intrinsic: 1.2.1
     dev: true
 
+  /array.prototype.findlastindex@1.2.3:
+    resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+      es-shim-unscopables: 1.0.0
+      get-intrinsic: 1.2.1
+    dev: true
+
   /array.prototype.flat@1.3.1:
     resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
     engines: {node: '>= 0.4'}
@@ -5088,6 +5608,16 @@ packages:
       es-shim-unscopables: 1.0.0
     dev: true
 
+  /array.prototype.flat@1.3.2:
+    resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+      es-shim-unscopables: 1.0.0
+    dev: true
+
   /array.prototype.flatmap@1.3.1:
     resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
     engines: {node: '>= 0.4'}
@@ -5098,6 +5628,16 @@ packages:
       es-shim-unscopables: 1.0.0
     dev: true
 
+  /array.prototype.flatmap@1.3.2:
+    resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+      es-shim-unscopables: 1.0.0
+    dev: true
+
   /arraybuffer.prototype.slice@1.0.1:
     resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==}
     engines: {node: '>= 0.4'}
@@ -5169,6 +5709,10 @@ packages:
       stream-exhaust: 1.0.2
     dev: true
 
+  /async-lock@1.4.0:
+    resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==}
+    dev: false
+
   /async-settle@1.0.0:
     resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==}
     engines: {node: '>= 0.10'}
@@ -5196,6 +5740,7 @@ packages:
   /autobind-decorator@2.4.0:
     resolution: {integrity: sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==}
     engines: {node: '>=8.10', npm: '>=6.4.1'}
+    dev: true
 
   /autolinker@4.0.0:
     resolution: {integrity: sha512-fl5Kh6BmEEZx+IWBfEirnRUU5+cOiV0OK7PEt0RBKvJMJ8GaRseIOeDU3FKf4j3CE5HVefcjHmhYPOcaVt0bZw==}
@@ -5287,8 +5832,8 @@ packages:
     resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
     engines: {node: '>= 0.4'}
 
-  /aws-sdk@2.1413.0:
-    resolution: {integrity: sha512-vKpjC7iRwOhgv7P0xw90mVGO//2rqVPJKyYIs7uxLzSV0JzriVD+yqktOu/Hz6/phOmAd1cMIeFgpEC9ynrppg==}
+  /aws-sdk@2.1498.0:
+    resolution: {integrity: sha512-m3yxYWrXsn9FJRcWBZZ4ySOEKxodP8KMhwoGJMALd0MLtfPUl/Yf0YuwVyTct2ZzRGMU8i7XoZYPY1fr76LD1w==}
     engines: {node: '>= 10.0.0'}
     dependencies:
       buffer: 4.9.2
@@ -5317,16 +5862,8 @@ packages:
       - debug
     dev: false
 
-  /axios@0.25.0(debug@4.3.4):
-    resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
-    dependencies:
-      follow-redirects: 1.15.2(debug@4.3.4)
-    transitivePeerDependencies:
-      - debug
-    dev: true
-
-  /axios@1.4.0:
-    resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==}
+  /axios@1.2.2:
+    resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==}
     dependencies:
       follow-redirects: 1.15.2(debug@4.3.4)
       form-data: 4.0.0
@@ -5335,32 +5872,30 @@ packages:
       - debug
     dev: false
 
-  /axios@1.5.1:
-    resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==}
+  /axios@1.6.2(debug@4.3.4):
+    resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
     dependencies:
       follow-redirects: 1.15.2(debug@4.3.4)
       form-data: 4.0.0
       proxy-from-env: 1.1.0
     transitivePeerDependencies:
       - debug
-    dev: false
 
   /b4a@1.6.4:
     resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
     dev: false
 
-  /babel-jest@27.5.1(@babel/core@7.22.10):
-    resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /babel-jest@29.7.0(@babel/core@7.23.2):
+    resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@babel/core': ^7.8.0
     dependencies:
-      '@babel/core': 7.22.10
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/babel__core': 7.20.1
+      '@babel/core': 7.23.2
+      '@jest/transform': 29.7.0
+      '@types/babel__core': 7.20.3
       babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 27.5.1(@babel/core@7.22.10)
+      babel-preset-jest: 29.6.3(@babel/core@7.23.2)
       chalk: 4.1.2
       graceful-fs: 4.2.11
       slash: 3.0.0
@@ -5381,45 +5916,45 @@ packages:
       - supports-color
     dev: true
 
-  /babel-plugin-jest-hoist@27.5.1:
-    resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /babel-plugin-jest-hoist@29.6.3:
+    resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@babel/template': 7.22.5
-      '@babel/types': 7.22.10
+      '@babel/template': 7.22.15
+      '@babel/types': 7.23.0
       '@types/babel__core': 7.20.1
       '@types/babel__traverse': 7.20.1
     dev: true
 
-  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10):
+  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2):
     resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/core': 7.22.10
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10)
-      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10)
-      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10)
+      '@babel/core': 7.23.2
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2)
     dev: true
 
-  /babel-preset-jest@27.5.1(@babel/core@7.22.10):
-    resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /babel-preset-jest@29.6.3(@babel/core@7.23.2):
+    resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/core': 7.22.10
-      babel-plugin-jest-hoist: 27.5.1
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10)
+      '@babel/core': 7.23.2
+      babel-plugin-jest-hoist: 29.6.3
+      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2)
     dev: true
 
   /babel-walk@3.0.0-canary-5:
@@ -5599,19 +6134,15 @@ packages:
     dependencies:
       fill-range: 7.0.1
 
-  /broadcast-channel@5.3.0:
-    resolution: {integrity: sha512-0PmDYc/iUGZ4QbnCnV7u+WleygiS1bZ4oV6t4rANXYtSgEFtGhB5jimJPLOVpPtce61FVxrH8CYylfO5g7OLKw==}
+  /broadcast-channel@6.0.0:
+    resolution: {integrity: sha512-h8ki6RYXq502Eb+zAt4Kni2ahL/lulh0ip+mpnvsMSRC2biBo6AkSBfO6JFTelT+FX88VL0SDd3RKpqlPNw4ng==}
     dependencies:
-      '@babel/runtime': 7.22.10
-      oblivious-set: 1.1.1
+      '@babel/runtime': 7.23.2
+      oblivious-set: 1.4.0
       p-queue: 6.6.2
       unload: 2.4.1
     dev: true
 
-  /browser-process-hrtime@1.0.0:
-    resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
-    dev: true
-
   /browser-stdout@1.3.1:
     resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
     dev: true
@@ -5641,6 +6172,17 @@ packages:
       node-releases: 2.0.13
       update-browserslist-db: 1.0.11(browserslist@4.21.10)
 
+  /browserslist@4.22.1:
+    resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+    dependencies:
+      caniuse-lite: 1.0.30001551
+      electron-to-chromium: 1.4.561
+      node-releases: 2.0.13
+      update-browserslist-db: 1.0.13(browserslist@4.22.1)
+    dev: true
+
   /bs-logger@0.2.6:
     resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
     engines: {node: '>= 6'}
@@ -5693,7 +6235,7 @@ packages:
     resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==}
     dependencies:
       base64-js: 1.5.1
-      ieee754: 1.1.13
+      ieee754: 1.2.1
       isarray: 1.0.0
     dev: false
 
@@ -5729,15 +6271,15 @@ packages:
       semver: 7.5.4
     dev: true
 
-  /bull@4.11.3:
-    resolution: {integrity: sha512-DhS0XtiAuejkAY08iGOdDK35eex/yGNoezlWqGJTu9FqWFF/oBjUhpsusE9SXiI4culyDbOoFs+l3ar0VXhFqQ==}
+  /bull@4.11.5:
+    resolution: {integrity: sha512-9jazyvBBYr55IRDkfJh/mJjWiq8NJUMoCC5zTuBX4JhkZvVXegnwsaIa1jr3x9xwSxGvWEhwQ9lt1jlCT5j6pQ==}
     engines: {node: '>=12'}
     dependencies:
       cron-parser: 4.8.1
       get-port: 5.1.1
       ioredis: 5.3.2
       lodash: 4.17.21
-      msgpackr: 1.9.7
+      msgpackr: 1.9.9
       semver: 7.5.4
       uuid: 8.3.2
     transitivePeerDependencies:
@@ -5763,15 +6305,15 @@ packages:
     engines: {node: '>= 0.8'}
     dev: false
 
-  /cacache@17.1.3:
-    resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==}
-    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+  /cacache@18.0.0:
+    resolution: {integrity: sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==}
+    engines: {node: ^16.14.0 || >=18.0.0}
     dependencies:
       '@npmcli/fs': 3.1.0
       fs-minipass: 3.0.2
-      glob: 10.3.3
-      lru-cache: 7.18.3
-      minipass: 5.0.0
+      glob: 10.3.10
+      lru-cache: 10.0.2
+      minipass: 7.0.4
       minipass-collect: 1.0.2
       minipass-flush: 1.0.5
       minipass-pipeline: 1.2.4
@@ -5898,6 +6440,10 @@ packages:
   /caniuse-lite@1.0.30001519:
     resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==}
 
+  /caniuse-lite@1.0.30001551:
+    resolution: {integrity: sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==}
+    dev: true
+
   /canonicalize@1.0.8:
     resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==}
     dev: false
@@ -5905,6 +6451,28 @@ packages:
   /caseless@0.12.0:
     resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
 
+  /cbor-extract@2.1.1:
+    resolution: {integrity: sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA==}
+    hasBin: true
+    requiresBuild: true
+    dependencies:
+      node-gyp-build-optional-packages: 5.0.3
+    optionalDependencies:
+      '@cbor-extract/cbor-extract-darwin-arm64': 2.1.1
+      '@cbor-extract/cbor-extract-darwin-x64': 2.1.1
+      '@cbor-extract/cbor-extract-linux-arm': 2.1.1
+      '@cbor-extract/cbor-extract-linux-arm64': 2.1.1
+      '@cbor-extract/cbor-extract-linux-x64': 2.1.1
+      '@cbor-extract/cbor-extract-win32-x64': 2.1.1
+    dev: false
+    optional: true
+
+  /cbor-x@1.5.4:
+    resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==}
+    optionalDependencies:
+      cbor-extract: 2.1.1
+    dev: false
+
   /cbor@8.1.0:
     resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==}
     engines: {node: '>=12.19'}
@@ -5912,11 +6480,11 @@ packages:
       nofilter: 3.1.0
     dev: true
 
-  /chalk-template@0.4.0:
-    resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
-    engines: {node: '>=12'}
+  /chalk-template@1.1.0:
+    resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==}
+    engines: {node: '>=14.16'}
     dependencies:
-      chalk: 4.1.2
+      chalk: 5.3.0
     dev: false
 
   /chalk@1.1.3:
@@ -5938,13 +6506,6 @@ packages:
       escape-string-regexp: 1.0.5
       supports-color: 5.5.0
 
-  /chalk@4.0.0:
-    resolution: {integrity: sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-styles: 4.3.0
-      supports-color: 7.2.0
-
   /chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
@@ -6076,7 +6637,7 @@ packages:
       normalize-path: 3.0.0
       readdirp: 3.6.0
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: 2.3.3
     dev: true
 
   /chownr@1.1.4:
@@ -6103,6 +6664,11 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /ci-info@3.9.0:
+    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+    engines: {node: '>=8'}
+    dev: true
+
   /ci-parallel-vars@1.0.1:
     resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==}
     dev: true
@@ -6273,6 +6839,7 @@ packages:
   /cluster-key-slot@1.1.2:
     resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
     engines: {node: '>=0.10.0'}
+    dev: false
 
   /co-body@5.2.0:
     resolution: {integrity: sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==}
@@ -6407,11 +6974,6 @@ packages:
     engines: {node: '>=0.1.90'}
     dev: true
 
-  /colors@1.2.5:
-    resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==}
-    engines: {node: '>=0.1.90'}
-    dev: true
-
   /combined-stream@1.0.8:
     resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
     engines: {node: '>= 0.8'}
@@ -6421,12 +6983,13 @@ packages:
   /commander@10.0.1:
     resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
     engines: {node: '>=14'}
+    dev: false
 
   /commander@2.20.3:
     resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
 
-  /commander@5.1.0:
-    resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+  /commander@6.2.1:
+    resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
     engines: {node: '>= 6'}
     dev: true
 
@@ -6443,10 +7006,11 @@ packages:
   /commander@9.5.0:
     resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
     engines: {node: ^12.20.0 || >=14}
+    requiresBuild: true
     dev: true
 
-  /comment-parser@1.4.0:
-    resolution: {integrity: sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==}
+  /comment-parser@1.4.1:
+    resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
     engines: {node: '>= 12.0.0'}
     dev: true
 
@@ -6467,12 +7031,12 @@ packages:
     resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
     dev: true
 
-  /compress-commons@4.1.1:
-    resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==}
-    engines: {node: '>= 10'}
+  /compress-commons@5.0.1:
+    resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==}
+    engines: {node: '>= 12.0.0'}
     dependencies:
-      buffer-crc32: 0.2.13
-      crc32-stream: 4.0.2
+      crc-32: 1.2.2
+      crc32-stream: 5.0.0
       normalize-path: 3.0.0
       readable-stream: 3.6.2
     dev: false
@@ -6510,12 +7074,14 @@ packages:
       extend-shallow: 2.0.1
       is-whitespace: 0.3.0
       kind-of: 3.2.2
+    dev: false
 
   /config-chain@1.1.13:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
     dependencies:
       ini: 1.3.8
       proto-list: 1.2.4
+    dev: false
 
   /console-control-strings@1.1.0:
     resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
@@ -6690,6 +7256,7 @@ packages:
       bluebird: 3.7.2
       ejs: 3.1.9
       pug: 3.0.2
+    dev: false
 
   /constantinople@4.0.1:
     resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
@@ -6711,6 +7278,10 @@ packages:
   /convert-source-map@1.9.0:
     resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
 
+  /convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+    dev: true
+
   /convert-to-spaces@2.0.1:
     resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -6745,9 +7316,10 @@ packages:
     requiresBuild: true
     dev: false
 
-  /core-js@3.32.0:
-    resolution: {integrity: sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==}
+  /core-js@3.33.0:
+    resolution: {integrity: sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==}
     requiresBuild: true
+    dev: true
 
   /core-util-is@1.0.2:
     resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
@@ -6761,14 +7333,52 @@ packages:
     hasBin: true
     dev: false
 
-  /crc32-stream@4.0.2:
-    resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==}
-    engines: {node: '>= 10'}
+  /crc32-stream@5.0.0:
+    resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==}
+    engines: {node: '>= 12.0.0'}
     dependencies:
       crc-32: 1.2.2
       readable-stream: 3.6.2
     dev: false
 
+  /create-jest@29.7.0(@types/node@18.11.18):
+    resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    dependencies:
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-config: 29.7.0(@types/node@18.11.18)
+      jest-util: 29.7.0
+      prompts: 2.4.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+    dev: true
+
+  /create-jest@29.7.0(@types/node@20.9.0)(ts-node@10.9.1):
+    resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    dependencies:
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+      jest-util: 29.7.0
+      prompts: 2.4.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+    dev: true
+
   /create-require@1.1.1:
     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
 
@@ -6902,21 +7512,6 @@ packages:
       source-map: 0.5.7
     dev: true
 
-  /cssom@0.3.8:
-    resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
-    dev: true
-
-  /cssom@0.4.4:
-    resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==}
-    dev: true
-
-  /cssstyle@2.3.0:
-    resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
-    engines: {node: '>=8'}
-    dependencies:
-      cssom: 0.3.8
-    dev: true
-
   /csstype@3.1.2:
     resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
     dev: true
@@ -6938,15 +7533,15 @@ packages:
       uniq: 1.0.1
     dev: false
 
-  /cypress@10.11.0:
-    resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==}
-    engines: {node: '>=12.0.0'}
+  /cypress@13.5.1:
+    resolution: {integrity: sha512-yqLViT0D/lPI8Kkm7ciF/x/DCK/H/DnogdGyiTnQgX4OVR2aM30PtK+kvklTOD1u3TuItiD9wUQAF8EYWtyZug==}
+    engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0}
     hasBin: true
     requiresBuild: true
     dependencies:
-      '@cypress/request': 2.88.12
+      '@cypress/request': 3.0.1
       '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
-      '@types/node': 14.18.54
+      '@types/node': 18.18.9
       '@types/sinonjs__fake-timers': 8.1.1
       '@types/sizzle': 2.3.3
       arch: 2.2.0
@@ -6958,9 +7553,9 @@ packages:
       check-more-types: 2.24.0
       cli-cursor: 3.1.0
       cli-table3: 0.6.3
-      commander: 5.1.0
+      commander: 6.2.1
       common-tags: 1.8.2
-      dayjs: 1.11.9
+      dayjs: 1.11.10
       debug: 4.3.4(supports-color@8.1.1)
       enquirer: 2.4.1
       eventemitter2: 6.4.7
@@ -6979,6 +7574,7 @@ packages:
       minimist: 1.2.8
       ospath: 1.2.2
       pretty-bytes: 5.6.0
+      process: 0.11.10
       proxy-from-env: 1.0.0
       request-progress: 3.0.0
       semver: 7.5.4
@@ -7007,15 +7603,7 @@ packages:
   /data-uri-to-buffer@4.0.1:
     resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
     engines: {node: '>= 12'}
-
-  /data-urls@2.0.0:
-    resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      abab: 2.0.6
-      whatwg-mimetype: 2.3.0
-      whatwg-url: 8.7.0
-    dev: true
+    dev: false
 
   /date-fns@2.30.0:
     resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
@@ -7032,11 +7620,6 @@ packages:
 
   /dayjs@1.11.10:
     resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
-    dev: false
-
-  /dayjs@1.11.9:
-    resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==}
-    dev: true
 
   /debug@2.6.9:
     resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
@@ -7100,10 +7683,6 @@ packages:
     engines: {node: '>=10'}
     dev: true
 
-  /decimal.js@10.4.3:
-    resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
-    dev: true
-
   /decode-uri-component@0.2.2:
     resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
     engines: {node: '>=0.10'}
@@ -7168,8 +7747,13 @@ packages:
       strip-dirs: 2.1.0
     dev: false
 
-  /dedent@0.7.0:
-    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+  /dedent@1.5.1:
+    resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
+    peerDependencies:
+      babel-plugin-macros: ^3.1.0
+    peerDependenciesMeta:
+      babel-plugin-macros:
+        optional: true
     dev: true
 
   /deep-email-validator@0.1.21:
@@ -7309,6 +7893,7 @@ packages:
   /depd@1.1.2:
     resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
     engines: {node: '>= 0.6'}
+    dev: false
 
   /depd@2.0.0:
     resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
@@ -7342,13 +7927,8 @@ packages:
       wrappy: 1.0.2
     dev: false
 
-  /diff-sequences@27.5.1:
-    resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dev: true
-
-  /diff-sequences@29.4.3:
-    resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==}
+  /diff-sequences@29.6.3:
+    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dev: true
 
@@ -7414,13 +7994,6 @@ packages:
   /domelementtype@2.3.0:
     resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
 
-  /domexception@2.0.1:
-    resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
-    engines: {node: '>=8'}
-    dependencies:
-      webidl-conversions: 5.0.0
-    dev: true
-
   /domhandler@2.4.2:
     resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
     dependencies:
@@ -7502,6 +8075,7 @@ packages:
       commander: 10.0.1
       minimatch: 9.0.1
       semver: 7.5.4
+    dev: false
 
   /ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
@@ -7513,13 +8087,18 @@ packages:
     hasBin: true
     dependencies:
       jake: 10.8.7
+    dev: false
 
   /electron-to-chromium@1.4.488:
     resolution: {integrity: sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==}
 
-  /emittery@0.8.1:
-    resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
-    engines: {node: '>=10'}
+  /electron-to-chromium@1.4.561:
+    resolution: {integrity: sha512-eS5t4ulWOBfVHdq9SW2dxEaFarj1lPjvJ8PaYMOjY0DecBaj/t4ARziL2IPpDr4atyWwjLFGQ2vo/VCgQFezVQ==}
+    dev: true
+
+  /emittery@0.13.1:
+    resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+    engines: {node: '>=12'}
     dev: true
 
   /emittery@1.0.1:
@@ -7725,34 +8304,34 @@ packages:
       es6-symbol: 3.1.3
     dev: true
 
-  /esbuild@0.18.20:
-    resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+  /esbuild@0.19.5:
+    resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/android-arm': 0.18.20
-      '@esbuild/android-arm64': 0.18.20
-      '@esbuild/android-x64': 0.18.20
-      '@esbuild/darwin-arm64': 0.18.20
-      '@esbuild/darwin-x64': 0.18.20
-      '@esbuild/freebsd-arm64': 0.18.20
-      '@esbuild/freebsd-x64': 0.18.20
-      '@esbuild/linux-arm': 0.18.20
-      '@esbuild/linux-arm64': 0.18.20
-      '@esbuild/linux-ia32': 0.18.20
-      '@esbuild/linux-loong64': 0.18.20
-      '@esbuild/linux-mips64el': 0.18.20
-      '@esbuild/linux-ppc64': 0.18.20
-      '@esbuild/linux-riscv64': 0.18.20
-      '@esbuild/linux-s390x': 0.18.20
-      '@esbuild/linux-x64': 0.18.20
-      '@esbuild/netbsd-x64': 0.18.20
-      '@esbuild/openbsd-x64': 0.18.20
-      '@esbuild/sunos-x64': 0.18.20
-      '@esbuild/win32-arm64': 0.18.20
-      '@esbuild/win32-ia32': 0.18.20
-      '@esbuild/win32-x64': 0.18.20
+      '@esbuild/android-arm': 0.19.5
+      '@esbuild/android-arm64': 0.19.5
+      '@esbuild/android-x64': 0.19.5
+      '@esbuild/darwin-arm64': 0.19.5
+      '@esbuild/darwin-x64': 0.19.5
+      '@esbuild/freebsd-arm64': 0.19.5
+      '@esbuild/freebsd-x64': 0.19.5
+      '@esbuild/linux-arm': 0.19.5
+      '@esbuild/linux-arm64': 0.19.5
+      '@esbuild/linux-ia32': 0.19.5
+      '@esbuild/linux-loong64': 0.19.5
+      '@esbuild/linux-mips64el': 0.19.5
+      '@esbuild/linux-ppc64': 0.19.5
+      '@esbuild/linux-riscv64': 0.19.5
+      '@esbuild/linux-s390x': 0.19.5
+      '@esbuild/linux-x64': 0.19.5
+      '@esbuild/netbsd-x64': 0.19.5
+      '@esbuild/openbsd-x64': 0.19.5
+      '@esbuild/sunos-x64': 0.19.5
+      '@esbuild/win32-arm64': 0.19.5
+      '@esbuild/win32-ia32': 0.19.5
+      '@esbuild/win32-x64': 0.19.5
     dev: true
 
   /escalade@3.1.1:
@@ -7784,16 +8363,13 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
-  /escodegen@2.1.0:
-    resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
-    engines: {node: '>=6.0'}
-    hasBin: true
+  /eslint-compat-utils@0.1.2(eslint@8.53.0):
+    resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
     dependencies:
-      esprima: 4.0.1
-      estraverse: 5.3.0
-      esutils: 2.0.3
-    optionalDependencies:
-      source-map: 0.6.1
+      eslint: 8.53.0
     dev: true
 
   /eslint-config-prettier@8.9.0(eslint@8.46.0):
@@ -7805,13 +8381,36 @@ packages:
       eslint: 8.46.0
     dev: true
 
-  /eslint-config-prettier@9.0.0(eslint@8.46.0):
+  /eslint-config-prettier@8.9.0(eslint@8.53.0):
+    resolution: {integrity: sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+    dependencies:
+      eslint: 8.53.0
+    dev: true
+
+  /eslint-config-prettier@9.0.0(eslint@8.53.0):
     resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
+    dependencies:
+      eslint: 8.53.0
+    dev: true
+
+  /eslint-config-standard@16.0.3(eslint-plugin-import@2.28.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.46.0):
+    resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==}
+    peerDependencies:
+      eslint: ^7.12.1
+      eslint-plugin-import: ^2.22.1
+      eslint-plugin-node: ^11.1.0
+      eslint-plugin-promise: ^4.2.1 || ^5.0.0
     dependencies:
       eslint: 8.46.0
+      eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)
+      eslint-plugin-node: 11.1.0(eslint@8.46.0)
+      eslint-plugin-promise: 6.1.1(eslint@8.46.0)
     dev: true
 
   /eslint-formatter-pretty@4.1.0:
@@ -7859,7 +8458,7 @@ packages:
       eslint-import-resolver-webpack:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
       debug: 3.2.7(supports-color@8.1.1)
       eslint: 8.46.0
       eslint-import-resolver-node: 0.3.9
@@ -7867,7 +8466,7 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0):
+  /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0):
     resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
     engines: {node: '>=4'}
     peerDependencies:
@@ -7888,27 +8487,56 @@ packages:
       eslint-import-resolver-webpack:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
       debug: 3.2.7(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       eslint-import-resolver-node: 0.3.9
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /eslint-plugin-es-x@7.2.0(eslint@8.46.0):
+  /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0):
+    resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: '*'
+      eslint-import-resolver-node: '*'
+      eslint-import-resolver-typescript: '*'
+      eslint-import-resolver-webpack: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+      eslint:
+        optional: true
+      eslint-import-resolver-node:
+        optional: true
+      eslint-import-resolver-typescript:
+        optional: true
+      eslint-import-resolver-webpack:
+        optional: true
+    dependencies:
+      '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      debug: 3.2.7(supports-color@8.1.1)
+      eslint: 8.53.0
+      eslint-import-resolver-node: 0.3.9
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-plugin-es-x@7.2.0(eslint@8.53.0):
     resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=8'
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
-      '@eslint-community/regexpp': 4.6.2
-      eslint: 8.46.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      '@eslint-community/regexpp': 4.9.1
+      eslint: 8.53.0
     dev: true
 
-  /eslint-plugin-es@4.1.0(eslint@8.46.0):
-    resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==}
+  /eslint-plugin-es@3.0.1(eslint@8.46.0):
+    resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==}
     engines: {node: '>=8.10.0'}
     peerDependencies:
       eslint: '>=4.19.1'
@@ -7918,24 +8546,35 @@ packages:
       regexpp: 3.2.0
     dev: true
 
-  /eslint-plugin-eslint-comments@3.2.0(eslint@8.46.0):
+  /eslint-plugin-es@4.1.0(eslint@8.53.0):
+    resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==}
+    engines: {node: '>=8.10.0'}
+    peerDependencies:
+      eslint: '>=4.19.1'
+    dependencies:
+      eslint: 8.53.0
+      eslint-utils: 2.1.0
+      regexpp: 3.2.0
+    dev: true
+
+  /eslint-plugin-eslint-comments@3.2.0(eslint@8.53.0):
     resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==}
     engines: {node: '>=6.5.0'}
     peerDependencies:
       eslint: '>=4.19.1'
     dependencies:
       escape-string-regexp: 1.0.5
-      eslint: 8.46.0
+      eslint: 8.53.0
       ignore: 5.2.4
     dev: true
 
-  /eslint-plugin-file-progress@1.3.0(eslint@8.46.0):
+  /eslint-plugin-file-progress@1.3.0(eslint@8.53.0):
     resolution: {integrity: sha512-LncpnGHU26KPvCrvDC2Sl9PfjdrsG8qltgiK6BR7KybWtfqrdlsu1ax3+hyPMn5OkKBTF3Wki3oqK1MSMeOtQw==}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
     dependencies:
       chalk: 4.1.2
-      eslint: 8.46.0
+      eslint: 8.53.0
       ora: 5.4.1
     dev: true
 
@@ -7955,7 +8594,7 @@ packages:
       '@typescript-eslint/parser':
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.4)
       array-includes: 3.1.6
       array.prototype.findlastindex: 1.2.2
       array.prototype.flat: 1.3.1
@@ -7981,7 +8620,7 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0):
+  /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.53.0):
     resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==}
     engines: {node: '>=4'}
     peerDependencies:
@@ -7991,16 +8630,16 @@ packages:
       '@typescript-eslint/parser':
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 6.3.0(eslint@8.46.0)(typescript@5.2.2)
+      '@typescript-eslint/parser': 5.62.0(eslint@8.53.0)(typescript@5.2.2)
       array-includes: 3.1.6
       array.prototype.findlastindex: 1.2.2
       array.prototype.flat: 1.3.1
       array.prototype.flatmap: 1.3.1
       debug: 3.2.7(supports-color@8.1.1)
       doctrine: 2.1.0
-      eslint: 8.46.0
+      eslint: 8.53.0
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.46.0)
+      eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0)
       has: 1.0.3
       is-core-module: 2.13.0
       is-glob: 4.0.3
@@ -8017,18 +8656,53 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-plugin-jsdoc@46.4.6(eslint@8.46.0):
-    resolution: {integrity: sha512-z4SWYnJfOqftZI+b3RM9AtWL1vF/sLWE/LlO9yOKDof9yN2+n3zOdOJTGX/pRE/xnPsooOLG2Rq6e4d+XW3lNw==}
+  /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0):
+    resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+    dependencies:
+      '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
+      array-includes: 3.1.7
+      array.prototype.findlastindex: 1.2.3
+      array.prototype.flat: 1.3.2
+      array.prototype.flatmap: 1.3.2
+      debug: 3.2.7(supports-color@8.1.1)
+      doctrine: 2.1.0
+      eslint: 8.53.0
+      eslint-import-resolver-node: 0.3.9
+      eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0)
+      hasown: 2.0.0
+      is-core-module: 2.13.1
+      is-glob: 4.0.3
+      minimatch: 3.1.2
+      object.fromentries: 2.0.7
+      object.groupby: 1.0.1
+      object.values: 1.1.7
+      semver: 6.3.1
+      tsconfig-paths: 3.14.2
+    transitivePeerDependencies:
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - supports-color
+    dev: true
+
+  /eslint-plugin-jsdoc@46.9.0(eslint@8.53.0):
+    resolution: {integrity: sha512-UQuEtbqLNkPf5Nr/6PPRCtr9xypXY+g8y/Q7gPa0YK7eDhh0y2lWprXRnaYbW7ACgIUvpDKy9X2bZqxtGzBG9Q==}
     engines: {node: '>=16'}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0
     dependencies:
-      '@es-joy/jsdoccomment': 0.40.1
+      '@es-joy/jsdoccomment': 0.41.0
       are-docs-informative: 0.0.2
-      comment-parser: 1.4.0
+      comment-parser: 1.4.1
       debug: 4.3.4(supports-color@8.1.1)
       escape-string-regexp: 4.0.0
-      eslint: 8.46.0
+      eslint: 8.53.0
       esquery: 1.5.0
       is-builtin-module: 3.2.1
       semver: 7.5.4
@@ -8037,40 +8711,53 @@ packages:
       - supports-color
     dev: true
 
-  /eslint-plugin-jsonc@2.9.0(eslint@8.46.0):
+  /eslint-plugin-jsonc@2.10.0(eslint@8.53.0):
+    resolution: {integrity: sha512-9d//o6Jyh4s1RxC9fNSt1+MMaFN2ruFdXPG9XZcb/mR2KkfjADYiNL/hbU6W0Cyxfg3tS/XSFuhl5LgtMD8hmw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      eslint: 8.53.0
+      eslint-compat-utils: 0.1.2(eslint@8.53.0)
+      jsonc-eslint-parser: 2.3.0
+      natural-compare: 1.4.0
+    dev: true
+
+  /eslint-plugin-jsonc@2.9.0(eslint@8.53.0):
     resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=6.0.0'
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
-      eslint: 8.46.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      eslint: 8.53.0
       jsonc-eslint-parser: 2.3.0
       natural-compare: 1.4.0
     dev: true
 
-  /eslint-plugin-markdown@3.0.1(eslint@8.46.0):
+  /eslint-plugin-markdown@3.0.1(eslint@8.53.0):
     resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      eslint: 8.46.0
+      eslint: 8.53.0
       mdast-util-from-markdown: 0.8.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /eslint-plugin-n@15.7.0(eslint@8.46.0):
+  /eslint-plugin-n@15.7.0(eslint@8.53.0):
     resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==}
     engines: {node: '>=12.22.0'}
     peerDependencies:
       eslint: '>=7.0.0'
     dependencies:
       builtins: 5.0.1
-      eslint: 8.46.0
-      eslint-plugin-es: 4.1.0(eslint@8.46.0)
-      eslint-utils: 3.0.0(eslint@8.46.0)
+      eslint: 8.53.0
+      eslint-plugin-es: 4.1.0(eslint@8.53.0)
+      eslint-utils: 3.0.0(eslint@8.53.0)
       ignore: 5.2.4
       is-core-module: 2.13.0
       minimatch: 3.1.2
@@ -8078,24 +8765,41 @@ packages:
       semver: 7.5.4
     dev: true
 
-  /eslint-plugin-n@16.0.1(eslint@8.46.0):
-    resolution: {integrity: sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==}
+  /eslint-plugin-n@16.3.1(eslint@8.53.0):
+    resolution: {integrity: sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==}
     engines: {node: '>=16.0.0'}
     peerDependencies:
       eslint: '>=7.0.0'
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
       builtins: 5.0.1
-      eslint: 8.46.0
-      eslint-plugin-es-x: 7.2.0(eslint@8.46.0)
+      eslint: 8.53.0
+      eslint-plugin-es-x: 7.2.0(eslint@8.53.0)
+      get-tsconfig: 4.7.2
       ignore: 5.2.4
+      is-builtin-module: 3.2.1
       is-core-module: 2.13.0
       minimatch: 3.1.2
-      resolve: 1.22.4
+      resolve: 1.22.8
       semver: 7.5.4
     dev: true
 
-  /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@3.0.3):
+  /eslint-plugin-node@11.1.0(eslint@8.46.0):
+    resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==}
+    engines: {node: '>=8.10.0'}
+    peerDependencies:
+      eslint: '>=5.16.0'
+    dependencies:
+      eslint: 8.46.0
+      eslint-plugin-es: 3.0.1(eslint@8.46.0)
+      eslint-utils: 2.1.0
+      ignore: 5.2.4
+      minimatch: 3.1.2
+      resolve: 1.22.4
+      semver: 6.3.1
+    dev: true
+
+  /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.9.0)(eslint@8.46.0)(prettier@2.8.8):
     resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
@@ -8108,12 +8812,29 @@ packages:
     dependencies:
       eslint: 8.46.0
       eslint-config-prettier: 8.9.0(eslint@8.46.0)
-      prettier: 3.0.3
+      prettier: 2.8.8
       prettier-linter-helpers: 1.0.0
     dev: true
 
-  /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.46.0)(prettier@3.0.3):
-    resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==}
+  /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.9.0)(eslint@8.53.0)(prettier@3.1.0):
+    resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      eslint: '>=7.28.0'
+      eslint-config-prettier: '*'
+      prettier: '>=2.0.0'
+    peerDependenciesMeta:
+      eslint-config-prettier:
+        optional: true
+    dependencies:
+      eslint: 8.53.0
+      eslint-config-prettier: 8.9.0(eslint@8.53.0)
+      prettier: 3.1.0
+      prettier-linter-helpers: 1.0.0
+    dev: true
+
+  /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0):
+    resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       '@types/eslint': '>=8.0.0'
@@ -8126,20 +8847,20 @@ packages:
       eslint-config-prettier:
         optional: true
     dependencies:
-      eslint: 8.46.0
-      eslint-config-prettier: 9.0.0(eslint@8.46.0)
-      prettier: 3.0.3
+      eslint: 8.53.0
+      eslint-config-prettier: 9.0.0(eslint@8.53.0)
+      prettier: 3.1.0
       prettier-linter-helpers: 1.0.0
       synckit: 0.8.5
     dev: true
 
-  /eslint-plugin-promise@5.2.0(eslint@8.46.0):
+  /eslint-plugin-promise@5.2.0(eslint@8.53.0):
     resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==}
     engines: {node: ^10.12.0 || >=12.0.0}
     peerDependencies:
       eslint: ^7.0.0
     dependencies:
-      eslint: 8.46.0
+      eslint: 8.53.0
     dev: true
 
   /eslint-plugin-promise@6.1.1(eslint@8.46.0):
@@ -8151,6 +8872,24 @@ packages:
       eslint: 8.46.0
     dev: true
 
+  /eslint-plugin-promise@6.1.1(eslint@8.53.0):
+    resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0
+    dependencies:
+      eslint: 8.53.0
+    dev: true
+
+  /eslint-plugin-standard@5.0.0(eslint@8.46.0):
+    resolution: {integrity: sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==}
+    deprecated: 'standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with ''npm rm eslint-plugin-standard''. More info here: https://github.com/standard/standard/issues/1316'
+    peerDependencies:
+      eslint: '>=5.0.0'
+    dependencies:
+      eslint: 8.46.0
+    dev: true
+
   /eslint-plugin-tsdoc@0.2.17:
     resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==}
     dependencies:
@@ -8158,17 +8897,17 @@ packages:
       '@microsoft/tsdoc-config': 0.16.2
     dev: true
 
-  /eslint-plugin-unicorn@40.1.0(eslint@8.46.0):
+  /eslint-plugin-unicorn@40.1.0(eslint@8.53.0):
     resolution: {integrity: sha512-y5doK2DF9Sr5AqKEHbHxjFllJ167nKDRU01HDcWyv4Tnmaoe9iNxMrBnaybZvWZUaE3OC5Unu0lNIevYamloig==}
     engines: {node: '>=12'}
     peerDependencies:
       eslint: '>=7.32.0'
     dependencies:
-      '@babel/helper-validator-identifier': 7.22.5
-      ci-info: 3.8.0
+      '@babel/helper-validator-identifier': 7.22.20
+      ci-info: 3.9.0
       clean-regexp: 1.0.0
-      eslint: 8.46.0
-      eslint-utils: 3.0.0(eslint@8.46.0)
+      eslint: 8.53.0
+      eslint-utils: 3.0.0(eslint@8.53.0)
       esquery: 1.5.0
       indent-string: 4.0.0
       is-builtin-module: 3.2.1
@@ -8181,17 +8920,17 @@ packages:
       strip-indent: 3.0.0
     dev: true
 
-  /eslint-plugin-unicorn@45.0.2(eslint@8.46.0):
+  /eslint-plugin-unicorn@45.0.2(eslint@8.53.0):
     resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==}
     engines: {node: '>=14.18'}
     peerDependencies:
       eslint: '>=8.28.0'
     dependencies:
       '@babel/helper-validator-identifier': 7.22.5
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
-      ci-info: 3.8.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      ci-info: 3.9.0
       clean-regexp: 1.0.0
-      eslint: 8.46.0
+      eslint: 8.53.0
       esquery: 1.5.0
       indent-string: 4.0.0
       is-builtin-module: 3.2.1
@@ -8210,52 +8949,106 @@ packages:
     resolution: {integrity: sha512-WE+YlK9X9s4vf5EaYRU0Scw7WItDZStm+PapFSYlg2ABNtaQ4zIG7wEqpoUB3SlfM+SgkhgmzR0TeJOO5k3/Nw==}
     dev: true
 
-  /eslint-plugin-vue-scoped-css@2.5.0(eslint@8.46.0)(vue-eslint-parser@9.3.1):
+  /eslint-plugin-vue-scoped-css@2.5.0(eslint@8.53.0)(vue-eslint-parser@9.3.1):
     resolution: {integrity: sha512-vR+raYNE1aQ69lS1lZGiKoz8rXFI3MWf2fxrfns/XCQ0XT5sIguhDtQS+9JmUQJClenLDEe2CQx7P+eeSdF4cA==}
     engines: {node: ^12.22 || ^14.17 || >=16}
     peerDependencies:
       eslint: '>=5.0.0'
       vue-eslint-parser: '>=7.1.0'
     dependencies:
-      eslint: 8.46.0
-      eslint-utils: 3.0.0(eslint@8.46.0)
+      eslint: 8.53.0
+      eslint-utils: 3.0.0(eslint@8.53.0)
       lodash: 4.17.21
       postcss: 8.4.27
       postcss-safe-parser: 6.0.0(postcss@8.4.27)
       postcss-scss: 4.0.6(postcss@8.4.27)
       postcss-selector-parser: 6.0.13
       postcss-styl: 0.12.3
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      vue-eslint-parser: 9.3.1(eslint@8.53.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /eslint-plugin-vue@9.16.1(eslint@8.46.0):
+  /eslint-plugin-vue-scoped-css@2.5.1(eslint@8.53.0)(vue-eslint-parser@9.3.2):
+    resolution: {integrity: sha512-ynbeCHd0dzkUBoL1q10GNpGh/BZD0Frw8Z8txPFyuhiHN2m5ZT6gvfe2GtdEs0Rq3+NE+5yexfz0PDX/bgKuJw==}
+    engines: {node: ^12.22 || ^14.17 || >=16}
+    peerDependencies:
+      eslint: '>=5.0.0'
+      vue-eslint-parser: '>=7.1.0'
+    dependencies:
+      eslint: 8.53.0
+      eslint-utils: 3.0.0(eslint@8.53.0)
+      lodash: 4.17.21
+      postcss: 8.4.31
+      postcss-safe-parser: 6.0.0(postcss@8.4.31)
+      postcss-scss: 4.0.6(postcss@8.4.31)
+      postcss-selector-parser: 6.0.13
+      postcss-styl: 0.12.3
+      vue-eslint-parser: 9.3.2(eslint@8.53.0)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-plugin-vue@9.16.1(eslint@8.53.0):
     resolution: {integrity: sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0)
-      eslint: 8.46.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      eslint: 8.53.0
       natural-compare: 1.4.0
       nth-check: 2.1.1
       postcss-selector-parser: 6.0.13
       semver: 7.5.4
-      vue-eslint-parser: 9.3.1(eslint@8.46.0)
+      vue-eslint-parser: 9.3.1(eslint@8.53.0)
       xml-name-validator: 4.0.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /eslint-plugin-yml@1.8.0(eslint@8.46.0):
+  /eslint-plugin-vue@9.18.1(eslint@8.53.0):
+    resolution: {integrity: sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      eslint: 8.53.0
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 6.0.13
+      semver: 7.5.4
+      vue-eslint-parser: 9.3.2(eslint@8.53.0)
+      xml-name-validator: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-plugin-yml@1.10.0(eslint@8.53.0):
+    resolution: {integrity: sha512-53SUwuNDna97lVk38hL/5++WXDuugPM9SUQ1T645R0EHMRCdBIIxGye/oOX2qO3FQ7aImxaUZJU/ju+NMUBrLQ==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.53.0
+      eslint-compat-utils: 0.1.2(eslint@8.53.0)
+      lodash: 4.17.21
+      natural-compare: 1.4.0
+      yaml-eslint-parser: 1.2.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-plugin-yml@1.8.0(eslint@8.53.0):
     resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=6.0.0'
     dependencies:
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       lodash: 4.17.21
       natural-compare: 1.4.0
       yaml-eslint-parser: 1.2.2
@@ -8290,13 +9083,13 @@ packages:
       eslint-visitor-keys: 1.3.0
     dev: true
 
-  /eslint-utils@3.0.0(eslint@8.46.0):
+  /eslint-utils@3.0.0(eslint@8.53.0):
     resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
     engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
     peerDependencies:
       eslint: '>=5'
     dependencies:
-      eslint: 8.46.0
+      eslint: 8.53.0
       eslint-visitor-keys: 2.1.0
     dev: true
 
@@ -8315,6 +9108,11 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
+  /eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
   /eslint@8.46.0:
     resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -8361,13 +9159,60 @@ packages:
       - supports-color
     dev: true
 
+  /eslint@8.53.0:
+    resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
+      '@eslint-community/regexpp': 4.9.1
+      '@eslint/eslintrc': 2.1.3
+      '@eslint/js': 8.53.0
+      '@humanwhocodes/config-array': 0.11.13
+      '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
+      '@ungap/structured-clone': 1.2.0
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.4(supports-color@8.1.1)
+      doctrine: 3.0.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.5.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      globals: 13.23.0
+      graphemer: 1.4.0
+      ignore: 5.2.4
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-yaml: 4.1.0
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.3
+      strip-ansi: 6.0.1
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /espree@9.6.1:
     resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
       acorn: 8.10.0
       acorn-jsx: 5.3.2(acorn@8.10.0)
-      eslint-visitor-keys: 3.4.2
+      eslint-visitor-keys: 3.4.3
     dev: true
 
   /esprima@2.7.3:
@@ -8438,10 +9283,10 @@ packages:
 
   /eventemitter3@4.0.7:
     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+    dev: true
 
   /eventemitter3@5.0.1:
     resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
-    dev: true
 
   /events@1.1.1:
     resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==}
@@ -8496,21 +9341,6 @@ packages:
       strip-final-newline: 2.0.0
     dev: true
 
-  /execa@6.1.0:
-    resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 3.0.1
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.1.0
-      onetime: 6.0.0
-      signal-exit: 3.0.7
-      strip-final-newline: 3.0.0
-    dev: true
-
   /execa@7.2.0:
     resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
     engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
@@ -8526,6 +9356,21 @@ packages:
       strip-final-newline: 3.0.0
     dev: true
 
+  /execa@8.0.1:
+    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+    engines: {node: '>=16.17'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 8.0.1
+      human-signals: 5.0.0
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.1.0
+      onetime: 6.0.0
+      signal-exit: 4.1.0
+      strip-final-newline: 3.0.0
+    dev: true
+
   /executable@4.1.1:
     resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
     engines: {node: '>=4'}
@@ -8571,14 +9416,15 @@ packages:
       homedir-polyfill: 1.0.3
     dev: true
 
-  /expect@27.5.1:
-    resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /expect@29.7.0:
+    resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      jest-get-type: 27.5.1
-      jest-matcher-utils: 27.5.1
-      jest-message-util: 27.5.1
+      '@jest/expect-utils': 29.7.0
+      jest-get-type: 29.6.3
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
     dev: true
 
   /exponential-backoff@3.1.1:
@@ -8647,7 +9493,7 @@ packages:
       get-stream: 5.2.0
       yauzl: 2.10.0
     optionalDependencies:
-      '@types/yauzl': 2.10.0
+      '@types/yauzl': 2.10.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -8740,6 +9586,7 @@ packages:
     dependencies:
       node-domexception: 1.0.0
       web-streams-polyfill: 3.2.1
+    dev: false
 
   /figures@3.2.0:
     resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
@@ -8772,8 +9619,8 @@ packages:
       token-types: 5.0.1
     dev: true
 
-  /file-type@18.5.0:
-    resolution: {integrity: sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==}
+  /file-type@18.7.0:
+    resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==}
     engines: {node: '>=14.16'}
     dependencies:
       readable-web-to-node-stream: 3.0.2
@@ -8800,6 +9647,7 @@ packages:
     resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
     dependencies:
       minimatch: 5.1.6
+    dev: false
 
   /filename-reserved-regex@3.0.0:
     resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==}
@@ -8956,18 +9804,18 @@ packages:
       readable-stream: 2.3.8
     dev: true
 
-  /focus-trap-vue@4.0.2(focus-trap@7.5.2)(vue@3.3.4):
-    resolution: {integrity: sha512-2iQN2xKCSCzyhcD90VpueQcTIAhaCRxxo67fkz7RSqLmEd16QKjfGslCr3KxvBx0LfpVN9j0IAyKKuJKw3Intg==}
+  /focus-trap-vue@4.0.3(focus-trap@7.5.4)(vue@3.3.8):
+    resolution: {integrity: sha512-cIX5rybkCAlNZ4IHYJ3nCFIsipDDljJHHjtTO2IgYWkVYg7X9ipUVdab3HzYp88kmHgMwjcB71LYnXRRsF6ZqQ==}
     peerDependencies:
       focus-trap: ^7.0.0
       vue: ^3.0.0
     dependencies:
-      focus-trap: 7.5.2
-      vue: 3.3.4
+      focus-trap: 7.5.4
+      vue: 3.3.8(typescript@5.2.2)
     dev: true
 
-  /focus-trap@7.5.2:
-    resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==}
+  /focus-trap@7.5.4:
+    resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==}
     dependencies:
       tabbable: 6.2.0
     dev: true
@@ -9024,14 +9872,6 @@ packages:
       combined-stream: 1.0.8
       mime-types: 2.1.35
 
-  /form-data@3.0.1:
-    resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
-    engines: {node: '>= 6'}
-    dependencies:
-      asynckit: 0.4.0
-      combined-stream: 1.0.8
-      mime-types: 2.1.35
-
   /form-data@4.0.0:
     resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
     engines: {node: '>= 6'}
@@ -9039,13 +9879,13 @@ packages:
       asynckit: 0.4.0
       combined-stream: 1.0.8
       mime-types: 2.1.35
-    dev: false
 
   /formdata-polyfill@4.0.10:
     resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
     engines: {node: '>=12.20.0'}
     dependencies:
       fetch-blob: 3.2.0
+    dev: false
 
   /formidable@2.1.2:
     resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==}
@@ -9085,15 +9925,6 @@ packages:
       universalify: 2.0.0
     dev: true
 
-  /fs-extra@7.0.1:
-    resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
-    engines: {node: '>=6 <7 || >=8'}
-    dependencies:
-      graceful-fs: 4.2.11
-      jsonfile: 4.0.0
-      universalify: 0.1.2
-    dev: true
-
   /fs-extra@8.1.0:
     resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
     engines: {node: '>=6 <7 || >=8'}
@@ -9154,8 +9985,8 @@ packages:
     requiresBuild: true
     optional: true
 
-  /fsevents@2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
     os: [darwin]
     requiresBuild: true
@@ -9170,6 +10001,10 @@ packages:
   /function-bind@1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
 
+  /function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+    dev: true
+
   /function.prototype.name@1.1.5:
     resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
     engines: {node: '>= 0.4'}
@@ -9200,25 +10035,6 @@ packages:
       wide-align: 1.1.5
     dev: false
 
-  /gauge@4.0.4:
-    resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-    dependencies:
-      aproba: 2.0.0
-      color-support: 1.1.3
-      console-control-strings: 1.1.0
-      has-unicode: 2.0.1
-      signal-exit: 3.0.7
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      wide-align: 1.1.5
-    dev: false
-
-  /generic-pool@3.9.0:
-    resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==}
-    engines: {node: '>= 4'}
-    dev: true
-
   /gensync@1.0.0-beta.2:
     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
     engines: {node: '>=6.9.0'}
@@ -9249,6 +10065,7 @@ packages:
     engines: {node: '>=6.4'}
     dependencies:
       pify: 4.0.1
+    dev: false
 
   /get-pixels-frame-info-update@3.3.2:
     resolution: {integrity: sha512-LzVij57X/gK4Y6LpcDdqj+R9WCpD6Sv3ZH85GMA+S3xgPGCz81mHql4GiSnF4GijRjk7TE0ja2sDr8FFYKLe2g==}
@@ -9294,6 +10111,11 @@ packages:
     resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
     engines: {node: '>=10'}
 
+  /get-stream@8.0.1:
+    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+    engines: {node: '>=16'}
+    dev: true
+
   /get-symbol-description@1.0.0:
     resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
     engines: {node: '>= 0.4'}
@@ -9302,6 +10124,12 @@ packages:
       get-intrinsic: 1.2.1
     dev: true
 
+  /get-tsconfig@4.7.2:
+    resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==}
+    dependencies:
+      resolve-pkg-maps: 1.0.0
+    dev: true
+
   /get-value@2.0.6:
     resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
     engines: {node: '>=0.10.0'}
@@ -9384,13 +10212,13 @@ packages:
       - supports-color
     dev: true
 
-  /glob@10.3.3:
-    resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==}
+  /glob@10.3.10:
+    resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
     engines: {node: '>=16 || 14 >=14.17'}
     hasBin: true
     dependencies:
       foreground-child: 3.1.1
-      jackspeak: 2.2.2
+      jackspeak: 2.3.6
       minimatch: 9.0.3
       minipass: 5.0.0
       path-scurry: 1.10.1
@@ -9426,6 +10254,7 @@ packages:
       inherits: 2.0.4
       minimatch: 5.1.6
       once: 1.4.0
+    dev: false
 
   /global-dirs@3.0.1:
     resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
@@ -9465,6 +10294,13 @@ packages:
       type-fest: 0.20.2
     dev: true
 
+  /globals@13.23.0:
+    resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.20.2
+    dev: true
+
   /globalthis@1.0.3:
     resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
     engines: {node: '>= 0.4'}
@@ -9621,7 +10457,7 @@ packages:
     resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==}
     engines: {node: '>=10'}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       '@types/vinyl': 2.0.7
       istextorbinary: 3.3.0
       replacestream: 4.0.3
@@ -9675,8 +10511,8 @@ packages:
     engines: {node: '>=0.8.0'}
     dev: true
 
-  /happy-dom@11.2.0:
-    resolution: {integrity: sha512-z4PshcYIIH6SkymSNRcDFwYUJOENe+FOQDx5BbHgg/wQUgxF5p9I9/BN45Jff34bbhXV8yJgkC5N99eyOzXK3w==}
+  /happy-dom@12.10.3:
+    resolution: {integrity: sha512-JzUXOh0wdNGY54oKng5hliuBkq/+aT1V3YpTM+lrN/GoLQTANZsMaIvmHiHe612rauHvPJnDZkZ+5GZR++1Abg==}
     dependencies:
       css.escape: 1.5.1
       entities: 4.5.0
@@ -9790,6 +10626,13 @@ packages:
     dependencies:
       function-bind: 1.1.1
 
+  /hasown@2.0.0:
+    resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      function-bind: 1.1.2
+    dev: true
+
   /he@1.2.0:
     resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
     hasBin: true
@@ -9822,10 +10665,6 @@ packages:
       lru-cache: 6.0.0
     dev: true
 
-  /hpagent@0.1.2:
-    resolution: {integrity: sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==}
-    dev: false
-
   /hpagent@1.2.0:
     resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==}
     engines: {node: '>=14'}
@@ -9835,13 +10674,6 @@ packages:
     resolution: {integrity: sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==}
     dev: true
 
-  /html-encoding-sniffer@2.0.1:
-    resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      whatwg-encoding: 1.0.5
-    dev: true
-
   /html-entities@2.3.2:
     resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==}
     dev: false
@@ -9888,6 +10720,7 @@ packages:
       inherits: 2.0.3
       setprototypeof: 1.1.0
       statuses: 1.5.0
+    dev: false
 
   /http-errors@1.8.1:
     resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
@@ -9898,6 +10731,7 @@ packages:
       setprototypeof: 1.2.0
       statuses: 1.5.0
       toidentifier: 1.0.1
+    dev: false
 
   /http-errors@2.0.0:
     resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
@@ -9910,23 +10744,11 @@ packages:
       toidentifier: 1.0.1
     dev: false
 
-  /http-proxy-agent@4.0.1:
-    resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
-    engines: {node: '>= 6'}
+  /http-proxy-agent@7.0.0:
+    resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
+    engines: {node: '>= 14'}
     dependencies:
-      '@tootallnate/once': 1.1.2
-      agent-base: 6.0.2
-      debug: 4.3.4(supports-color@8.1.1)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /http-proxy-agent@5.0.0:
-    resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
-    engines: {node: '>= 6'}
-    dependencies:
-      '@tootallnate/once': 2.0.0
-      agent-base: 6.0.2
+      agent-base: 7.1.0
       debug: 4.3.4(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
@@ -9992,6 +10814,7 @@ packages:
       debug: 4.3.4(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
+    dev: false
 
   /https-proxy-agent@7.0.1:
     resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==}
@@ -10003,16 +10826,6 @@ packages:
       - supports-color
     dev: false
 
-  /https-proxy-agent@7.0.2:
-    resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
-    engines: {node: '>= 14'}
-    dependencies:
-      agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
   /human-signals@1.1.1:
     resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
     engines: {node: '>=8.12.0'}
@@ -10023,21 +10836,15 @@ packages:
     engines: {node: '>=10.17.0'}
     dev: true
 
-  /human-signals@3.0.1:
-    resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
-    engines: {node: '>=12.20.0'}
-    dev: true
-
   /human-signals@4.3.1:
     resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
     engines: {node: '>=14.18.0'}
     dev: true
 
-  /humanize-ms@1.2.1:
-    resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
-    dependencies:
-      ms: 2.1.3
-    dev: false
+  /human-signals@5.0.0:
+    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+    engines: {node: '>=16.17.0'}
+    dev: true
 
   /humanize-number@0.0.2:
     resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==}
@@ -10048,6 +10855,7 @@ packages:
     engines: {node: '>=0.10.0'}
     dependencies:
       safer-buffer: 2.1.2
+    dev: false
 
   /iconv-lite@0.6.3:
     resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
@@ -10088,11 +10896,6 @@ packages:
       resolve-from: 4.0.0
     dev: true
 
-  /import-lazy@4.0.0:
-    resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
-    engines: {node: '>=8'}
-    dev: true
-
   /import-local@3.1.0:
     resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
     engines: {node: '>=8'}
@@ -10132,6 +10935,7 @@ packages:
 
   /inherits@2.0.3:
     resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+    dev: false
 
   /inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -10148,8 +10952,8 @@ packages:
     resolution: {integrity: sha512-/nPtyeX9xPUvxZf+r0518B7uqNKlP+LqNJqSiXFEaa2T71rWIwTVXGH7hB9xO/EVdwa5/pWlFCPwShOW81XIxQ==}
     dev: true
 
-  /install-artifact-from-github@1.3.3:
-    resolution: {integrity: sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ==}
+  /install-artifact-from-github@1.3.5:
+    resolution: {integrity: sha512-gZHC7f/cJgXz7MXlHFBxPVMsvIbev1OQN1uKQYKVJDydGNm9oYf9JstbU4Atnh/eSvk41WtEovoRm+8IF686xg==}
     hasBin: true
     dev: false
 
@@ -10340,7 +11144,7 @@ packages:
     resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
     hasBin: true
     dependencies:
-      ci-info: 3.8.0
+      ci-info: 3.9.0
     dev: true
 
   /is-core-module@2.13.0:
@@ -10348,6 +11152,12 @@ packages:
     dependencies:
       has: 1.0.3
 
+  /is-core-module@2.13.1:
+    resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+    dependencies:
+      hasown: 2.0.0
+    dev: true
+
   /is-data-descriptor@0.1.4:
     resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==}
     engines: {node: '>=0.10.0'}
@@ -10591,10 +11401,6 @@ packages:
     resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
     engines: {node: '>=0.10.0'}
 
-  /is-potential-custom-element-name@1.0.1:
-    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
-    dev: true
-
   /is-promise@2.2.2:
     resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
 
@@ -10712,6 +11518,7 @@ packages:
   /is-whitespace@0.3.0:
     resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==}
     engines: {node: '>=0.10.0'}
+    dev: false
 
   /is-windows@1.0.2:
     resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
@@ -10739,6 +11546,11 @@ packages:
   /isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
+  /isexe@3.1.1:
+    resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
+    engines: {node: '>=16'}
+    dev: false
+
   /isobject@2.1.0:
     resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
     engines: {node: '>=0.10.0'}
@@ -10764,7 +11576,7 @@ packages:
     engines: {node: '>=8'}
     dependencies:
       '@babel/core': 7.22.10
-      '@babel/parser': 7.22.10
+      '@babel/parser': 7.23.0
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.0
       semver: 6.3.1
@@ -10772,6 +11584,19 @@ packages:
       - supports-color
     dev: true
 
+  /istanbul-lib-instrument@6.0.1:
+    resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@babel/core': 7.23.2
+      '@babel/parser': 7.23.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-coverage: 3.2.0
+      semver: 7.5.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /istanbul-lib-report@3.0.1:
     resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
     engines: {node: '>=10'}
@@ -10808,8 +11633,8 @@ packages:
       textextensions: 3.3.0
     dev: true
 
-  /jackspeak@2.2.2:
-    resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==}
+  /jackspeak@2.3.6:
+    resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
     engines: {node: '>=14'}
     dependencies:
       '@isaacs/cliui': 8.0.2
@@ -10826,46 +11651,49 @@ packages:
       chalk: 4.1.2
       filelist: 1.0.4
       minimatch: 3.1.2
+    dev: false
 
-  /jest-changed-files@27.5.1:
-    resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-changed-files@29.7.0:
+    resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
       execa: 5.1.1
-      throat: 6.0.2
+      jest-util: 29.7.0
+      p-limit: 3.1.0
     dev: true
 
-  /jest-circus@27.5.1:
-    resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-circus@29.7.0:
+    resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/environment': 29.7.0
+      '@jest/expect': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       chalk: 4.1.2
       co: 4.6.0
-      dedent: 0.7.0
-      expect: 27.5.1
+      dedent: 1.5.1
       is-generator-fn: 2.1.0
-      jest-each: 27.5.1
-      jest-matcher-utils: 27.5.1
-      jest-message-util: 27.5.1
-      jest-runtime: 27.5.1
-      jest-snapshot: 27.5.1
-      jest-util: 27.5.1
-      pretty-format: 27.5.1
+      jest-each: 29.7.0
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-runtime: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
+      p-limit: 3.1.0
+      pretty-format: 29.7.0
+      pure-rand: 6.0.4
       slash: 3.0.0
       stack-utils: 2.0.6
-      throat: 6.0.2
     transitivePeerDependencies:
+      - babel-plugin-macros
       - supports-color
     dev: true
 
-  /jest-cli@27.5.1(ts-node@10.4.0):
-    resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-cli@29.7.0(@types/node@18.11.18):
+    resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
@@ -10873,133 +11701,171 @@ packages:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/core': 27.5.1(ts-node@10.4.0)
-      '@jest/test-result': 27.5.1
-      '@jest/types': 27.5.1
+      '@jest/core': 29.7.0(ts-node@10.9.1)
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
       chalk: 4.1.2
+      create-jest: 29.7.0(@types/node@18.11.18)
       exit: 0.1.2
-      graceful-fs: 4.2.11
       import-local: 3.1.0
-      jest-config: 27.5.1(ts-node@10.4.0)
-      jest-util: 27.5.1
-      jest-validate: 27.5.1
-      prompts: 2.4.2
-      yargs: 16.2.0
+      jest-config: 29.7.0(@types/node@18.11.18)
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      yargs: 17.7.2
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
+      - '@types/node'
+      - babel-plugin-macros
       - supports-color
       - ts-node
-      - utf-8-validate
     dev: true
 
-  /jest-config@27.5.1(ts-node@10.4.0):
-    resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-cli@29.7.0(@types/node@20.9.0)(ts-node@10.9.1):
+    resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
     peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@jest/core': 29.7.0(ts-node@10.9.1)
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      create-jest: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+      exit: 0.1.2
+      import-local: 3.1.0
+      jest-config: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+    dev: true
+
+  /jest-config@29.7.0(@types/node@18.11.18):
+    resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@types/node': '*'
       ts-node: '>=9.0.0'
     peerDependenciesMeta:
+      '@types/node':
+        optional: true
       ts-node:
         optional: true
     dependencies:
-      '@babel/core': 7.22.10
-      '@jest/test-sequencer': 27.5.1
-      '@jest/types': 27.5.1
-      babel-jest: 27.5.1(@babel/core@7.22.10)
+      '@babel/core': 7.23.2
+      '@jest/test-sequencer': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.11.18
+      babel-jest: 29.7.0(@babel/core@7.23.2)
       chalk: 4.1.2
-      ci-info: 3.8.0
+      ci-info: 3.9.0
       deepmerge: 4.3.1
       glob: 7.2.3
       graceful-fs: 4.2.11
-      jest-circus: 27.5.1
-      jest-environment-jsdom: 27.5.1
-      jest-environment-node: 27.5.1
-      jest-get-type: 27.5.1
-      jest-jasmine2: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-resolve: 27.5.1
-      jest-runner: 27.5.1
-      jest-util: 27.5.1
-      jest-validate: 27.5.1
+      jest-circus: 29.7.0
+      jest-environment-node: 29.7.0
+      jest-get-type: 29.6.3
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-runner: 29.7.0
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
       micromatch: 4.0.5
       parse-json: 5.2.0
-      pretty-format: 27.5.1
+      pretty-format: 29.7.0
       slash: 3.0.0
       strip-json-comments: 3.1.1
-      ts-node: 10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3)
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
+      - babel-plugin-macros
       - supports-color
-      - utf-8-validate
     dev: true
 
-  /jest-diff@27.5.1:
-    resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-config@29.7.0(@types/node@20.9.0)(ts-node@10.9.1):
+    resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@types/node': '*'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      ts-node:
+        optional: true
     dependencies:
+      '@babel/core': 7.23.2
+      '@jest/test-sequencer': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
+      babel-jest: 29.7.0(@babel/core@7.23.2)
       chalk: 4.1.2
-      diff-sequences: 27.5.1
-      jest-get-type: 27.5.1
-      pretty-format: 27.5.1
+      ci-info: 3.9.0
+      deepmerge: 4.3.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-circus: 29.7.0
+      jest-environment-node: 29.7.0
+      jest-get-type: 29.6.3
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-runner: 29.7.0
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      micromatch: 4.0.5
+      parse-json: 5.2.0
+      pretty-format: 29.7.0
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+      ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.9.0)(typescript@5.2.2)
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
     dev: true
 
-  /jest-diff@29.6.2:
-    resolution: {integrity: sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==}
+  /jest-diff@29.7.0:
+    resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       chalk: 4.1.2
-      diff-sequences: 29.4.3
-      jest-get-type: 29.4.3
-      pretty-format: 29.6.2
+      diff-sequences: 29.6.3
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
     dev: true
 
-  /jest-docblock@27.5.1:
-    resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-docblock@29.7.0:
+    resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       detect-newline: 3.1.0
     dev: true
 
-  /jest-each@27.5.1:
-    resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-each@29.7.0:
+    resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
+      '@jest/types': 29.6.3
       chalk: 4.1.2
-      jest-get-type: 27.5.1
-      jest-util: 27.5.1
-      pretty-format: 27.5.1
+      jest-get-type: 29.6.3
+      jest-util: 29.7.0
+      pretty-format: 29.7.0
     dev: true
 
-  /jest-environment-jsdom@27.5.1:
-    resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-environment-node@29.7.0:
+    resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/fake-timers': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
-      jest-mock: 27.5.1
-      jest-util: 27.5.1
-      jsdom: 16.7.0
-    transitivePeerDependencies:
-      - bufferutil
-      - canvas
-      - supports-color
-      - utf-8-validate
-    dev: true
-
-  /jest-environment-node@27.5.1:
-    resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/fake-timers': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
-      jest-mock: 27.5.1
-      jest-util: 27.5.1
+      '@jest/environment': 29.7.0
+      '@jest/fake-timers': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
+      jest-mock: 29.7.0
+      jest-util: 29.7.0
     dev: true
 
   /jest-fetch-mock@3.0.3:
@@ -11011,103 +11877,73 @@ packages:
       - encoding
     dev: true
 
-  /jest-get-type@27.5.1:
-    resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dev: true
-
-  /jest-get-type@29.4.3:
-    resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==}
+  /jest-get-type@29.6.3:
+    resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dev: true
 
-  /jest-haste-map@27.5.1:
-    resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-haste-map@29.7.0:
+    resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      '@types/graceful-fs': 4.1.6
-      '@types/node': 20.5.8
+      '@jest/types': 29.6.3
+      '@types/graceful-fs': 4.1.8
+      '@types/node': 20.9.0
       anymatch: 3.1.3
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
-      jest-regex-util: 27.5.1
-      jest-serializer: 27.5.1
-      jest-util: 27.5.1
-      jest-worker: 27.5.1
+      jest-regex-util: 29.6.3
+      jest-util: 29.7.0
+      jest-worker: 29.7.0
       micromatch: 4.0.5
       walker: 1.0.8
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: 2.3.3
     dev: true
 
-  /jest-jasmine2@27.5.1:
-    resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-leak-detector@29.7.0:
+    resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/source-map': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
-      chalk: 4.1.2
-      co: 4.6.0
-      expect: 27.5.1
-      is-generator-fn: 2.1.0
-      jest-each: 27.5.1
-      jest-matcher-utils: 27.5.1
-      jest-message-util: 27.5.1
-      jest-runtime: 27.5.1
-      jest-snapshot: 27.5.1
-      jest-util: 27.5.1
-      pretty-format: 27.5.1
-      throat: 6.0.2
-    transitivePeerDependencies:
-      - supports-color
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
     dev: true
 
-  /jest-leak-detector@27.5.1:
-    resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dependencies:
-      jest-get-type: 27.5.1
-      pretty-format: 27.5.1
-    dev: true
-
-  /jest-matcher-utils@27.5.1:
-    resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-matcher-utils@29.7.0:
+    resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       chalk: 4.1.2
-      jest-diff: 27.5.1
-      jest-get-type: 27.5.1
-      pretty-format: 27.5.1
+      jest-diff: 29.7.0
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
     dev: true
 
-  /jest-message-util@27.5.1:
-    resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-message-util@29.7.0:
+    resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@babel/code-frame': 7.22.10
-      '@jest/types': 27.5.1
-      '@types/stack-utils': 2.0.1
+      '@babel/code-frame': 7.22.13
+      '@jest/types': 29.6.3
+      '@types/stack-utils': 2.0.2
       chalk: 4.1.2
       graceful-fs: 4.2.11
       micromatch: 4.0.5
-      pretty-format: 27.5.1
+      pretty-format: 29.7.0
       slash: 3.0.0
       stack-utils: 2.0.6
     dev: true
 
-  /jest-mock@27.5.1:
-    resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-mock@29.7.0:
+    resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
+      jest-util: 29.7.0
     dev: true
 
-  /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1):
+  /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
     resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
     engines: {node: '>=6'}
     peerDependencies:
@@ -11116,199 +11952,193 @@ packages:
       jest-resolve:
         optional: true
     dependencies:
-      jest-resolve: 27.5.1
+      jest-resolve: 29.7.0
     dev: true
 
-  /jest-regex-util@27.5.1:
-    resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-regex-util@29.6.3:
+    resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dev: true
 
-  /jest-resolve-dependencies@27.5.1:
-    resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-resolve-dependencies@29.7.0:
+    resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      jest-regex-util: 27.5.1
-      jest-snapshot: 27.5.1
+      jest-regex-util: 29.6.3
+      jest-snapshot: 29.7.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /jest-resolve@27.5.1:
-    resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-resolve@29.7.0:
+    resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
       chalk: 4.1.2
       graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1)
-      jest-util: 27.5.1
-      jest-validate: 27.5.1
-      resolve: 1.22.4
-      resolve.exports: 1.1.1
+      jest-haste-map: 29.7.0
+      jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      resolve: 1.22.8
+      resolve.exports: 2.0.2
       slash: 3.0.0
     dev: true
 
-  /jest-runner@27.5.1:
-    resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-runner@29.7.0:
+    resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/console': 27.5.1
-      '@jest/environment': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/console': 29.7.0
+      '@jest/environment': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       chalk: 4.1.2
-      emittery: 0.8.1
+      emittery: 0.13.1
       graceful-fs: 4.2.11
-      jest-docblock: 27.5.1
-      jest-environment-jsdom: 27.5.1
-      jest-environment-node: 27.5.1
-      jest-haste-map: 27.5.1
-      jest-leak-detector: 27.5.1
-      jest-message-util: 27.5.1
-      jest-resolve: 27.5.1
-      jest-runtime: 27.5.1
-      jest-util: 27.5.1
-      jest-worker: 27.5.1
-      source-map-support: 0.5.21
-      throat: 6.0.2
+      jest-docblock: 29.7.0
+      jest-environment-node: 29.7.0
+      jest-haste-map: 29.7.0
+      jest-leak-detector: 29.7.0
+      jest-message-util: 29.7.0
+      jest-resolve: 29.7.0
+      jest-runtime: 29.7.0
+      jest-util: 29.7.0
+      jest-watcher: 29.7.0
+      jest-worker: 29.7.0
+      p-limit: 3.1.0
+      source-map-support: 0.5.13
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
       - supports-color
-      - utf-8-validate
     dev: true
 
-  /jest-runtime@27.5.1:
-    resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-runtime@29.7.0:
+    resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/fake-timers': 27.5.1
-      '@jest/globals': 27.5.1
-      '@jest/source-map': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
+      '@jest/environment': 29.7.0
+      '@jest/fake-timers': 29.7.0
+      '@jest/globals': 29.7.0
+      '@jest/source-map': 29.6.3
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       chalk: 4.1.2
       cjs-module-lexer: 1.2.3
       collect-v8-coverage: 1.0.2
-      execa: 5.1.1
       glob: 7.2.3
       graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-message-util: 27.5.1
-      jest-mock: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-resolve: 27.5.1
-      jest-snapshot: 27.5.1
-      jest-util: 27.5.1
+      jest-haste-map: 29.7.0
+      jest-message-util: 29.7.0
+      jest-mock: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
       slash: 3.0.0
       strip-bom: 4.0.0
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /jest-serializer@27.5.1:
-    resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-snapshot@29.7.0:
+    resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@types/node': 20.5.8
-      graceful-fs: 4.2.11
-    dev: true
-
-  /jest-snapshot@27.5.1:
-    resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dependencies:
-      '@babel/core': 7.22.10
-      '@babel/generator': 7.22.10
-      '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10)
-      '@babel/traverse': 7.22.10
-      '@babel/types': 7.22.10
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/babel__traverse': 7.20.1
-      '@types/prettier': 2.7.3
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10)
+      '@babel/core': 7.23.2
+      '@babel/generator': 7.23.0
+      '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2)
+      '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2)
+      '@babel/types': 7.23.0
+      '@jest/expect-utils': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2)
       chalk: 4.1.2
-      expect: 27.5.1
+      expect: 29.7.0
       graceful-fs: 4.2.11
-      jest-diff: 27.5.1
-      jest-get-type: 27.5.1
-      jest-haste-map: 27.5.1
-      jest-matcher-utils: 27.5.1
-      jest-message-util: 27.5.1
-      jest-util: 27.5.1
+      jest-diff: 29.7.0
+      jest-get-type: 29.6.3
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
       natural-compare: 1.4.0
-      pretty-format: 27.5.1
+      pretty-format: 29.7.0
       semver: 7.5.4
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /jest-util@27.5.1:
-    resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-util@29.7.0:
+    resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       chalk: 4.1.2
-      ci-info: 3.8.0
+      ci-info: 3.9.0
       graceful-fs: 4.2.11
       picomatch: 2.3.1
     dev: true
 
-  /jest-validate@27.5.1:
-    resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-validate@29.7.0:
+    resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 27.5.1
+      '@jest/types': 29.6.3
       camelcase: 6.3.0
       chalk: 4.1.2
-      jest-get-type: 27.5.1
+      jest-get-type: 29.6.3
       leven: 3.1.0
-      pretty-format: 27.5.1
+      pretty-format: 29.7.0
     dev: true
 
-  /jest-watcher@27.5.1:
-    resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-watcher@29.7.0:
+    resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/test-result': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.5.8
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 20.9.0
       ansi-escapes: 4.3.2
       chalk: 4.1.2
-      jest-util: 27.5.1
+      emittery: 0.13.1
+      jest-util: 29.7.0
       string-length: 4.0.2
     dev: true
 
-  /jest-websocket-mock@2.2.1(mock-socket@9.0.8):
-    resolution: {integrity: sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==}
-    peerDependencies:
-      mock-socket: ^8||^9
+  /jest-websocket-mock@2.5.0:
+    resolution: {integrity: sha512-a+UJGfowNIWvtIKIQBHoEWIUqRxxQHFx4CXT+R5KxxKBtEQ5rS3pPOV/5299sHzqbmeCzxxY5qE4+yfXePePig==}
     dependencies:
-      jest-diff: 27.5.1
-      mock-socket: 9.0.8
+      jest-diff: 29.7.0
+      mock-socket: 9.3.1
     dev: true
 
   /jest-worker@27.5.1:
     resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
     engines: {node: '>= 10.13.0'}
     dependencies:
-      '@types/node': 20.5.8
+      '@types/node': 20.9.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
     dev: true
 
-  /jest@27.4.5(ts-node@10.4.0):
-    resolution: {integrity: sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /jest-worker@29.7.0:
+    resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@types/node': 20.9.0
+      jest-util: 29.7.0
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+    dev: true
+
+  /jest@29.7.0(@types/node@18.11.18):
+    resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
@@ -11316,15 +12146,36 @@ packages:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/core': 27.5.1(ts-node@10.4.0)
+      '@jest/core': 29.7.0(ts-node@10.9.1)
+      '@jest/types': 29.6.3
       import-local: 3.1.0
-      jest-cli: 27.5.1(ts-node@10.4.0)
+      jest-cli: 29.7.0(@types/node@18.11.18)
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+    dev: true
+
+  /jest@29.7.0(@types/node@20.9.0)(ts-node@10.9.1):
+    resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@jest/core': 29.7.0(ts-node@10.9.1)
+      '@jest/types': 29.6.3
+      import-local: 3.1.0
+      jest-cli: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
       - supports-color
       - ts-node
-      - utf-8-validate
     dev: true
 
   /jju@1.4.0:
@@ -11336,8 +12187,8 @@ packages:
     engines: {node: '>= 0.6.0'}
     dev: false
 
-  /joi@17.9.2:
-    resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==}
+  /joi@17.11.0:
+    resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==}
     dependencies:
       '@hapi/hoek': 9.3.0
       '@hapi/topo': 5.1.0
@@ -11367,6 +12218,7 @@ packages:
       editorconfig: 1.0.4
       glob: 8.1.0
       nopt: 6.0.0
+    dev: false
 
   /js-levenshtein@1.1.6:
     resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
@@ -11384,14 +12236,6 @@ packages:
   /js-tokens@4.0.0:
     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
 
-  /js-yaml@3.13.1:
-    resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==}
-    hasBin: true
-    dependencies:
-      argparse: 1.0.10
-      esprima: 4.0.1
-    dev: true
-
   /js-yaml@3.14.1:
     resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
     hasBin: true
@@ -11431,48 +12275,6 @@ packages:
     engines: {node: '>=12.0.0'}
     dev: true
 
-  /jsdom@16.7.0:
-    resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      canvas: ^2.5.0
-    peerDependenciesMeta:
-      canvas:
-        optional: true
-    dependencies:
-      abab: 2.0.6
-      acorn: 8.10.0
-      acorn-globals: 6.0.0
-      cssom: 0.4.4
-      cssstyle: 2.3.0
-      data-urls: 2.0.0
-      decimal.js: 10.4.3
-      domexception: 2.0.1
-      escodegen: 2.1.0
-      form-data: 3.0.1
-      html-encoding-sniffer: 2.0.1
-      http-proxy-agent: 4.0.1
-      https-proxy-agent: 5.0.1
-      is-potential-custom-element-name: 1.0.1
-      nwsapi: 2.2.7
-      parse5: 6.0.1
-      saxes: 5.0.1
-      symbol-tree: 3.2.4
-      tough-cookie: 4.1.3
-      w3c-hr-time: 1.0.2
-      w3c-xmlserializer: 2.0.0
-      webidl-conversions: 6.1.0
-      whatwg-encoding: 1.0.5
-      whatwg-mimetype: 2.3.0
-      whatwg-url: 8.7.0
-      ws: 7.5.9
-      xml-name-validator: 3.0.0
-    transitivePeerDependencies:
-      - bufferutil
-      - supports-color
-      - utf-8-validate
-    dev: true
-
   /jsesc@0.5.0:
     resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
     hasBin: true
@@ -11513,7 +12315,7 @@ packages:
   /json-stringify-safe@5.0.1:
     resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
 
-  /json5-loader@4.0.1(webpack@5.88.2):
+  /json5-loader@4.0.1(webpack@5.89.0):
     resolution: {integrity: sha512-c9viNZlZTz0MTIcf/4qvek5Dz1/PU3DNCB4PwUhlEZIV3qb1bSD6vQQymlV17/Wm6ncra1aCvmIPsuRj+KfEEg==}
     engines: {node: '>= 10.13.0'}
     peerDependencies:
@@ -11522,7 +12324,7 @@ packages:
       json5: 2.2.3
       loader-utils: 2.0.4
       schema-utils: 3.3.0
-      webpack: 5.88.2(@swc/core@1.3.78)
+      webpack: 5.89.0(@swc/core@1.3.78)
     dev: true
 
   /json5@1.0.2:
@@ -11547,6 +12349,10 @@ packages:
       semver: 7.5.4
     dev: true
 
+  /jsonc-parser@3.2.0:
+    resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
+    dev: true
+
   /jsonfile@4.0.0:
     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
     optionalDependencies:
@@ -11567,8 +12373,8 @@ packages:
       graceful-fs: 4.2.11
     dev: true
 
-  /jsonld@8.2.1:
-    resolution: {integrity: sha512-hCnY98LwTp0gJ0oEp41wytYYbU96ZX6SR3QwE8A+1V9dKVCSXrOR1WXF21Vq/Bgx46l2baPRvJ5cix5Gd4EX5A==}
+  /jsonld@8.3.1:
+    resolution: {integrity: sha512-tYfKpWL56meSJCHS91Ph0+EUThHZOZ8bKuboME4998SF+Kkukp2PhCPdRCvA7tsGUKr9FvSoyIRqJPuImBcBuA==}
     engines: {node: '>=14'}
     dependencies:
       '@digitalbazaar/http-client': 3.4.1
@@ -11632,8 +12438,8 @@ packages:
       safe-buffer: 5.2.1
     dev: false
 
-  /katex@0.16.8:
-    resolution: {integrity: sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==}
+  /katex@0.16.9:
+    resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==}
     hasBin: true
     dependencies:
       commander: 8.3.0
@@ -11684,7 +12490,7 @@ packages:
     dependencies:
       '@types/co-body': 6.1.0
       '@types/formidable': 2.0.6
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
       co-body: 6.1.0
       formidable: 2.1.2
       zod: 3.21.4
@@ -11751,6 +12557,7 @@ packages:
   /koa-router@10.1.1:
     resolution: {integrity: sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==}
     engines: {node: '>= 8.0.0'}
+    deprecated: '**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173'
     dependencies:
       debug: 4.3.4(supports-color@8.1.1)
       http-errors: 1.8.1
@@ -11770,6 +12577,7 @@ packages:
       resolve-path: 1.4.0
     transitivePeerDependencies:
       - supports-color
+    dev: false
 
   /koa-slow@2.1.0:
     resolution: {integrity: sha512-ii6s1zuZ51p+SY7WIrwjRi1tmPrNpeHEaw5UYi4h1QzAPmIcNk16e9zwKd9+eNNzI9n+Q2LXHAvt1MCfs7j/8w==}
@@ -11789,7 +12597,7 @@ packages:
       - supports-color
     dev: false
 
-  /koa-views@7.0.2(@types/koa@2.13.8)(ejs@3.1.9)(pug@3.0.2):
+  /koa-views@7.0.2(@types/koa@2.13.11)(ejs@3.1.9)(pug@3.0.2):
     resolution: {integrity: sha512-dvx3mdVeSVuIPEaKAoGbxLcenudvhl821xxyuRbcoA+bOJ2dvN8wlGjkLu0ZFMlkCscXZV6lzxy28rafeazI/w==}
     deprecated: This package is deprecated, please use the new fork @ladjs/koa-views. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/koa-views for updates and release changelog
     peerDependencies:
@@ -11798,7 +12606,7 @@ packages:
       '@types/koa':
         optional: true
     dependencies:
-      '@types/koa': 2.13.8
+      '@types/koa': 2.13.11
       consolidate: 0.16.0(ejs@3.1.9)(pug@3.0.2)
       debug: 4.3.4(supports-color@8.1.1)
       get-paths: 0.0.7
@@ -11861,6 +12669,7 @@ packages:
       - velocityjs
       - walrus
       - whiskers
+    dev: false
 
   /koa@2.13.4:
     resolution: {integrity: sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==}
@@ -12064,9 +12873,12 @@ packages:
     resolution: {integrity: sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==}
     dev: true
 
-  /local-pkg@0.4.3:
-    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+  /local-pkg@0.5.0:
+    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
     engines: {node: '>=14'}
+    dependencies:
+      mlly: 1.4.2
+      pkg-types: 1.0.3
     dev: true
 
   /locate-path@5.0.0:
@@ -12101,10 +12913,6 @@ packages:
     resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
     dev: false
 
-  /lodash.difference@4.5.0:
-    resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
-    dev: false
-
   /lodash.filter@4.6.0:
     resolution: {integrity: sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==}
     dev: false
@@ -12117,19 +12925,12 @@ packages:
     resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
     dev: false
 
-  /lodash.get@4.4.2:
-    resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
-    dev: true
-
   /lodash.isarguments@3.1.0:
     resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
     dev: false
 
   /lodash.isequal@4.5.0:
     resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
-
-  /lodash.isplainobject@4.0.6:
-    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
     dev: false
 
   /lodash.isregexp@3.0.5:
@@ -12171,10 +12972,6 @@ packages:
     resolution: {integrity: sha512-s8xEQdsp2Tu5zUqVdFSe9C0kR8YlnAJYLqMdkh+pIRBRxF6/apWseLdHl3/+jv2I61dhPwtI/Ff+EqvCpc+N8w==}
     dev: true
 
-  /lodash.union@4.6.0:
-    resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
-    dev: false
-
   /lodash.uniq@4.5.0:
     resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
     dev: true
@@ -12218,6 +13015,13 @@ packages:
     engines: {node: 14 || >=16.14}
     dev: false
 
+  /lru-cache@10.0.2:
+    resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==}
+    engines: {node: 14 || >=16.14}
+    dependencies:
+      semver: 7.5.4
+    dev: false
+
   /lru-cache@4.1.5:
     resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
     dependencies:
@@ -12236,18 +13040,17 @@ packages:
     dependencies:
       yallist: 4.0.0
 
-  /lru-cache@7.18.3:
-    resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
-    engines: {node: '>=12'}
-    dev: false
+  /lunr@2.3.9:
+    resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
+    dev: true
 
   /luxon@3.3.0:
     resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==}
     engines: {node: '>=12'}
     dev: false
 
-  /magic-string@0.30.2:
-    resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==}
+  /magic-string@0.30.5:
+    resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
     engines: {node: '>=12'}
     dependencies:
       '@jridgewell/sourcemap-codec': 1.4.15
@@ -12281,24 +13084,20 @@ packages:
   /make-error@1.3.6:
     resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
 
-  /make-fetch-happen@11.1.1:
-    resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==}
-    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+  /make-fetch-happen@13.0.0:
+    resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==}
+    engines: {node: ^16.14.0 || >=18.0.0}
     dependencies:
-      agentkeepalive: 4.5.0
-      cacache: 17.1.3
+      '@npmcli/agent': 2.2.0
+      cacache: 18.0.0
       http-cache-semantics: 4.1.1
-      http-proxy-agent: 5.0.0
-      https-proxy-agent: 5.0.1
       is-lambda: 1.0.1
-      lru-cache: 7.18.3
-      minipass: 5.0.0
+      minipass: 7.0.4
       minipass-fetch: 3.0.3
       minipass-flush: 1.0.5
       minipass-pipeline: 1.2.4
       negotiator: 0.6.3
       promise-retry: 2.0.1
-      socks-proxy-agent: 7.0.0
       ssri: 10.0.4
     transitivePeerDependencies:
       - supports-color
@@ -12350,6 +13149,12 @@ packages:
       object-visit: 1.0.1
     dev: true
 
+  /marked@4.3.0:
+    resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
+    engines: {node: '>= 12'}
+    hasBin: true
+    dev: true
+
   /matchdep@2.0.0:
     resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==}
     engines: {node: '>= 0.10.0'}
@@ -12405,32 +13210,8 @@ packages:
     engines: {node: '>= 0.6'}
     dev: false
 
-  /megalodon@8.1.1:
-    resolution: {integrity: sha512-K7YjGmRbNkJao2E0hadJCW3IDloufVPUbYA/3+RFDFZvZO5v1MBz3rU4OixIgrHHY74PVTkSU8YHzyv7KA4rhA==}
-    engines: {node: '>=15.0.0'}
-    dependencies:
-      '@types/oauth': 0.9.2
-      '@types/ws': 8.5.5
-      axios: 1.5.1
-      dayjs: 1.11.10
-      form-data: 4.0.0
-      https-proxy-agent: 7.0.2
-      oauth: 0.10.0
-      object-assign-deep: 0.4.0
-      parse-link-header: 2.0.0
-      socks-proxy-agent: 8.0.2
-      typescript: 5.2.2
-      uuid: 9.0.1
-      ws: 8.14.2
-    transitivePeerDependencies:
-      - bufferutil
-      - debug
-      - supports-color
-      - utf-8-validate
-    dev: false
-
-  /meilisearch@0.34.1:
-    resolution: {integrity: sha512-7mrLp88JfrbvhAMhOjNPzHGd2iCLHgzNhkveMxppMOToMLQw4Ygof4ksQ9uFi7SKq3UwEhIoMoFT1rUHLD3vWQ==}
+  /meilisearch@0.35.0:
+    resolution: {integrity: sha512-gF1I6K5/Wpe7BWfjBnG+o19y/FIpJ9HbN+byON6CB9U3uE7qc6GvwUbjKOllh7LKXQVVxH/kCu7Jn0ODCUwqbQ==}
     dependencies:
       cross-fetch: 3.1.8
     transitivePeerDependencies:
@@ -12449,7 +13230,7 @@ packages:
     resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==}
     engines: {node: '>=10'}
     dependencies:
-      '@types/minimist': 1.2.2
+      '@types/minimist': 1.2.4
       camelcase-keys: 6.2.2
       decamelize: 1.2.0
       decamelize-keys: 1.1.1
@@ -12579,12 +13360,21 @@ packages:
     engines: {node: '>=10'}
     dependencies:
       brace-expansion: 2.0.1
+    dev: false
+
+  /minimatch@7.4.6:
+    resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
+    engines: {node: '>=10'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: true
 
   /minimatch@9.0.1:
     resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
     engines: {node: '>=16 || 14 >=14.17'}
     dependencies:
       brace-expansion: 2.0.1
+    dev: false
 
   /minimatch@9.0.3:
     resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
@@ -12665,6 +13455,11 @@ packages:
     engines: {node: '>=8'}
     dev: false
 
+  /minipass@7.0.4:
+    resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dev: false
+
   /minizlib@1.3.3:
     resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
     requiresBuild: true
@@ -12719,6 +13514,15 @@ packages:
     hasBin: true
     dev: false
 
+  /mlly@1.4.2:
+    resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
+    dependencies:
+      acorn: 8.10.0
+      pathe: 1.1.1
+      pkg-types: 1.0.3
+      ufo: 1.3.2
+    dev: true
+
   /mocha@10.2.0:
     resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==}
     engines: {node: '>= 14.0.0'}
@@ -12747,8 +13551,8 @@ packages:
       yargs-unparser: 2.0.0
     dev: true
 
-  /mock-socket@9.0.8:
-    resolution: {integrity: sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==}
+  /mock-socket@9.3.1:
+    resolution: {integrity: sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==}
     engines: {node: '>= 8'}
     dev: true
 
@@ -12781,14 +13585,14 @@ packages:
     dev: false
     optional: true
 
-  /msgpackr@1.9.7:
-    resolution: {integrity: sha512-baUNaLvKQvVhzfWTNO07njwbZK1Lxjtb0P1JL6/EhXdLTHzR57/mZqqJC39TtQKvOmkJA4pcejS4dbk7BDgLLA==}
+  /msgpackr@1.9.9:
+    resolution: {integrity: sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==}
     optionalDependencies:
       msgpackr-extract: 3.0.2
     dev: false
 
-  /multer@1.4.4-lts.1:
-    resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==}
+  /multer@1.4.5-lts.1:
+    resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==}
     engines: {node: '>= 6.0.0'}
     dependencies:
       append-field: 1.0.0
@@ -12820,9 +13624,10 @@ packages:
       any-promise: 1.3.0
       object-assign: 4.1.1
       thenify-all: 1.6.0
+    dev: false
 
-  /nan@2.17.0:
-    resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==}
+  /nan@2.18.0:
+    resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==}
     dev: false
 
   /nanoid@3.3.3:
@@ -12950,6 +13755,7 @@ packages:
   /node-domexception@1.0.0:
     resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
     engines: {node: '>=10.5.0'}
+    dev: false
 
   /node-fetch@2.6.12:
     resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==}
@@ -12969,6 +13775,14 @@ packages:
       data-uri-to-buffer: 4.0.1
       fetch-blob: 3.2.0
       formdata-polyfill: 4.0.10
+    dev: false
+
+  /node-gyp-build-optional-packages@5.0.3:
+    resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==}
+    hasBin: true
+    requiresBuild: true
+    dev: false
+    optional: true
 
   /node-gyp-build-optional-packages@5.0.7:
     resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==}
@@ -12982,22 +13796,21 @@ packages:
     hasBin: true
     dev: false
 
-  /node-gyp@9.4.0:
-    resolution: {integrity: sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==}
-    engines: {node: ^12.13 || ^14.13 || >=16}
+  /node-gyp@10.0.1:
+    resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
+    engines: {node: ^16.14.0 || >=18.0.0}
     hasBin: true
     dependencies:
       env-paths: 2.2.1
       exponential-backoff: 3.1.1
-      glob: 7.2.3
+      glob: 10.3.10
       graceful-fs: 4.2.11
-      make-fetch-happen: 11.1.1
-      nopt: 6.0.0
-      npmlog: 6.0.2
-      rimraf: 3.0.2
+      make-fetch-happen: 13.0.0
+      nopt: 7.2.0
+      proc-log: 3.0.0
       semver: 7.5.4
       tar: 6.1.15
-      which: 2.0.2
+      which: 4.0.0
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -13009,8 +13822,8 @@ packages:
   /node-releases@2.0.13:
     resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
 
-  /nodemailer@6.9.4:
-    resolution: {integrity: sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==}
+  /nodemailer@6.9.7:
+    resolution: {integrity: sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==}
     engines: {node: '>=6.0.0'}
     dev: false
 
@@ -13033,12 +13846,21 @@ packages:
     hasBin: true
     dependencies:
       abbrev: 1.1.1
+    dev: false
+
+  /nopt@7.2.0:
+    resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    hasBin: true
+    dependencies:
+      abbrev: 2.0.0
+    dev: false
 
   /normalize-package-data@2.5.0:
     resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
     dependencies:
       hosted-git-info: 2.8.9
-      resolve: 1.22.4
+      resolve: 1.22.8
       semver: 5.7.2
       validate-npm-package-license: 3.0.4
     dev: true
@@ -13125,23 +13947,13 @@ packages:
       set-blocking: 2.0.0
     dev: false
 
-  /npmlog@6.0.2:
-    resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-    dependencies:
-      are-we-there-yet: 3.0.1
-      console-control-strings: 1.1.0
-      gauge: 4.0.4
-      set-blocking: 2.0.0
-    dev: false
-
-  /nsfwjs@2.4.2(@tensorflow/tfjs@4.2.0):
+  /nsfwjs@2.4.2(@tensorflow/tfjs@4.13.0):
     resolution: {integrity: sha512-i4Pp2yt59qPQgeZFyg3wXFBX52uSeu/hkDoqdZfe+sILRxNBUu0VDogj7Lmqak0GlrXviS/wLiVeIx40IDUu7A==}
     peerDependencies:
       '@tensorflow/tfjs': ^3.18.0
     dependencies:
       '@nsfw-filter/gif-frames': 1.0.2
-      '@tensorflow/tfjs': 4.2.0(seedrandom@3.0.5)
+      '@tensorflow/tfjs': 4.13.0(seedrandom@3.0.5)
     dev: false
 
   /nth-check@1.0.2:
@@ -13165,10 +13977,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /nwsapi@2.2.7:
-    resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==}
-    dev: true
-
   /oauth-sign@0.9.0:
     resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
     dev: false
@@ -13243,6 +14051,15 @@ packages:
       es-abstract: 1.22.1
     dev: true
 
+  /object.fromentries@2.0.7:
+    resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+    dev: true
+
   /object.groupby@1.0.0:
     resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==}
     dependencies:
@@ -13252,6 +14069,15 @@ packages:
       get-intrinsic: 1.2.1
     dev: true
 
+  /object.groupby@1.0.1:
+    resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+      get-intrinsic: 1.2.1
+    dev: true
+
   /object.map@1.0.1:
     resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==}
     engines: {node: '>=0.10.0'}
@@ -13284,8 +14110,22 @@ packages:
       es-abstract: 1.22.1
     dev: true
 
-  /oblivious-set@1.1.1:
-    resolution: {integrity: sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==}
+  /object.values@1.1.7:
+    resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.22.1
+    dev: true
+
+  /oblivious-set@1.4.0:
+    resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==}
+    engines: {node: '>=16'}
+    dev: true
+
+  /obuf@1.1.2:
+    resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
     dev: true
 
   /omggif@1.0.10:
@@ -13401,8 +14241,8 @@ packages:
     resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
     dev: true
 
-  /otpauth@9.1.4:
-    resolution: {integrity: sha512-T6T0E1WlzwKWESq8K0Ja47u01XjmDmRY/AiUoMAc6xZI/OsTsD4cqBrfpt2WfJ29W5pRiWkuUuyHdNQl0/Ic+Q==}
+  /otpauth@9.2.0:
+    resolution: {integrity: sha512-vbiHaeTJHrRG4fWRAZwVVrCnQz9SEzNINk2Hfx8BZY8UxTJEnqpOHxr11KfrRVAqWZdD6Y5jdyXW6Xp/ls9O/w==}
     dependencies:
       jssha: 3.3.1
     dev: false
@@ -13562,7 +14402,7 @@ packages:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
     dependencies:
-      '@babel/code-frame': 7.22.10
+      '@babel/code-frame': 7.22.13
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
@@ -13605,6 +14445,7 @@ packages:
 
   /parse5@6.0.1:
     resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+    dev: false
 
   /parse5@7.1.2:
     resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
@@ -13705,6 +14546,10 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /pathe@1.1.1:
+    resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==}
+    dev: true
+
   /pause-stream@0.0.11:
     resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
     dependencies:
@@ -13742,7 +14587,11 @@ packages:
   /pg-int8@1.0.1:
     resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
     engines: {node: '>=4.0.0'}
-    dev: false
+
+  /pg-numeric@1.0.2:
+    resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==}
+    engines: {node: '>=4'}
+    dev: true
 
   /pg-pool@3.6.1(pg@8.11.3):
     resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==}
@@ -13754,7 +14603,6 @@ packages:
 
   /pg-protocol@1.6.0:
     resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==}
-    dev: false
 
   /pg-types@2.2.0:
     resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
@@ -13767,6 +14615,19 @@ packages:
       postgres-interval: 1.2.0
     dev: false
 
+  /pg-types@4.0.1:
+    resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==}
+    engines: {node: '>=10'}
+    dependencies:
+      pg-int8: 1.0.1
+      pg-numeric: 1.0.2
+      postgres-array: 3.0.2
+      postgres-bytea: 3.0.0
+      postgres-date: 2.0.1
+      postgres-interval: 3.0.0
+      postgres-range: 1.1.3
+    dev: true
+
   /pg@8.11.3:
     resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==}
     engines: {node: '>= 8.0.0'}
@@ -13793,8 +14654,8 @@ packages:
       split2: 4.2.0
     dev: false
 
-  /photoswipe@5.3.9:
-    resolution: {integrity: sha512-z9ACLW9472gAawrIXXiliuz9xNZ3xEl7cIPHqY/lAeFQT9X+N9sgCwa86WK9wnK8cuk/F3QEO45n+QSiZnKd2A==}
+  /photoswipe@5.4.2:
+    resolution: {integrity: sha512-z5hr36nAIPOZbHJPbCJ/mQ3+ZlizttF9za5gKXKH/us1k4KNHaRbC63K1Px5sVVKUtGb/2+ixHpKqtwl0WAwvA==}
     engines: {node: '>= 0.12.0'}
     dev: true
 
@@ -13817,6 +14678,7 @@ packages:
   /pify@4.0.1:
     resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
     engines: {node: '>=6'}
+    dev: false
 
   /pinkie-promise@2.0.1:
     resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
@@ -13848,6 +14710,14 @@ packages:
       find-up: 4.1.0
     dev: true
 
+  /pkg-types@1.0.3:
+    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+    dependencies:
+      jsonc-parser: 3.2.0
+      mlly: 1.4.2
+      pathe: 1.1.1
+    dev: true
+
   /plimit-lit@1.5.0:
     resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==}
     dependencies:
@@ -13902,8 +14772,8 @@ packages:
     engines: {node: '>=14.19.0'}
     dev: false
 
-  /pnpm@8.8.0:
-    resolution: {integrity: sha512-eY5rMiZpzmPI2oVr1irR97bzb036oKwCWvK91wDQndXcqUPlytPtrF0bO668Syw/uA+7hTf5NnM8Mr4ux4BRRA==}
+  /pnpm@8.10.5:
+    resolution: {integrity: sha512-nBYfQz2FVRxY8bOhCxjMPfcrWgLSyu5lZswFtvIK3e+UfnldkMOQM7+S3lUXfq1p2H9iqdqtyR56LjtY9JNToA==}
     engines: {node: '>=16.14'}
     hasBin: true
     dev: true
@@ -14086,6 +14956,15 @@ packages:
       postcss: 8.4.27
     dev: true
 
+  /postcss-safe-parser@6.0.0(postcss@8.4.31):
+    resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.3.3
+    dependencies:
+      postcss: 8.4.31
+    dev: true
+
   /postcss-scss@4.0.6(postcss@8.4.27):
     resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==}
     engines: {node: '>=12.0'}
@@ -14095,6 +14974,15 @@ packages:
       postcss: 8.4.27
     dev: true
 
+  /postcss-scss@4.0.6(postcss@8.4.31):
+    resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.4.19
+    dependencies:
+      postcss: 8.4.31
+    dev: true
+
   /postcss-selector-parser@2.2.3:
     resolution: {integrity: sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==}
     dependencies:
@@ -14171,21 +15059,47 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.0.2
 
+  /postcss@8.4.31:
+    resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.6
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+    dev: true
+
   /postgres-array@2.0.0:
     resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
     engines: {node: '>=4'}
     dev: false
 
+  /postgres-array@3.0.2:
+    resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==}
+    engines: {node: '>=12'}
+    dev: true
+
   /postgres-bytea@1.0.0:
     resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
     engines: {node: '>=0.10.0'}
     dev: false
 
+  /postgres-bytea@3.0.0:
+    resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==}
+    engines: {node: '>= 6'}
+    dependencies:
+      obuf: 1.1.2
+    dev: true
+
   /postgres-date@1.0.7:
     resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
     engines: {node: '>=0.10.0'}
     dev: false
 
+  /postgres-date@2.0.1:
+    resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==}
+    engines: {node: '>=12'}
+    dev: true
+
   /postgres-interval@1.2.0:
     resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
     engines: {node: '>=0.10.0'}
@@ -14193,6 +15107,15 @@ packages:
       xtend: 4.0.2
     dev: false
 
+  /postgres-interval@3.0.0:
+    resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /postgres-range@1.1.3:
+    resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==}
+    dev: true
+
   /prebuild-install@7.1.1:
     resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
     engines: {node: '>=10'}
@@ -14241,8 +15164,8 @@ packages:
     hasBin: true
     dev: true
 
-  /prettier@3.0.3:
-    resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==}
+  /prettier@3.1.0:
+    resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==}
     engines: {node: '>=14'}
     hasBin: true
     dev: true
@@ -14252,20 +15175,11 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /pretty-format@27.5.1:
-    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dependencies:
-      ansi-regex: 5.0.1
-      ansi-styles: 5.2.0
-      react-is: 17.0.2
-    dev: true
-
-  /pretty-format@29.6.2:
-    resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==}
+  /pretty-format@29.7.0:
+    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/schemas': 29.6.0
+      '@jest/schemas': 29.6.3
       ansi-styles: 5.2.0
       react-is: 18.2.0
     dev: true
@@ -14289,6 +15203,7 @@ packages:
       condense-newlines: 0.2.1
       extend-shallow: 2.0.1
       js-beautify: 1.14.9
+    dev: false
 
   /prismjs@1.29.0:
     resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
@@ -14324,9 +15239,19 @@ packages:
       - supports-color
     dev: false
 
+  /proc-log@3.0.0:
+    resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    dev: false
+
   /process-nextick-args@2.0.1:
     resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
 
+  /process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+    dev: true
+
   /progress@2.0.3:
     resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
     engines: {node: '>=0.4.0'}
@@ -14365,6 +15290,7 @@ packages:
 
   /proto-list@1.2.4:
     resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+    dev: false
 
   /proxy-from-env@1.0.0:
     resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
@@ -14372,7 +15298,6 @@ packages:
 
   /proxy-from-env@1.1.0:
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-    dev: false
 
   /ps-tree@1.2.0:
     resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
@@ -14491,12 +15416,16 @@ packages:
     resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==}
     dev: false
 
-  /punycode@2.3.0:
-    resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+  /punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
     engines: {node: '>=6'}
 
-  /pureimage@0.4.8:
-    resolution: {integrity: sha512-/yNBs67VB4moPB7tqfupxFhYYaSlpnBpDb5995B0FP+vTqKwR2KD2uEIvch9NmpqUpVnsXcDOsFgmuGTgLX/Lg==}
+  /pure-rand@6.0.4:
+    resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==}
+    dev: true
+
+  /pureimage@0.4.13:
+    resolution: {integrity: sha512-P8aonTNAnXWJn2pBIqyeWw0I/D4YDOfEavCVvbDG+wx3dCujQX0ENZiW5OcHfbd8HKLfVhCf4F/3Xivf1yWDiA==}
     engines: {node: '>=14.19.0'}
     dependencies:
       jpeg-js: 0.4.4
@@ -14634,21 +15563,17 @@ packages:
       setimmediate: 1.0.5
     dev: false
 
-  /re2@1.20.3:
-    resolution: {integrity: sha512-g5j4YjygwGEccP9SCuDI90uPlgALLEYLotfL0K+kqL3XKB4ht7Nm1JuXfOTG96c7JozpvCUxTz1T7oTNwwMI6w==}
+  /re2@1.20.8:
+    resolution: {integrity: sha512-5GArE3towC0ZyinRkkaZARZxlbX3K+z2REXSVltGSW+F/ID8SLrbh1okTXEcTFBp9zsAhKcGH1Vm+zJ2IwMb7Q==}
     requiresBuild: true
     dependencies:
-      install-artifact-from-github: 1.3.3
-      nan: 2.17.0
-      node-gyp: 9.4.0
+      install-artifact-from-github: 1.3.5
+      nan: 2.18.0
+      node-gyp: 10.0.1
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /react-is@17.0.2:
-    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
-    dev: true
-
   /react-is@18.2.0:
     resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
     dev: true
@@ -14683,7 +15608,7 @@ packages:
     resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
     engines: {node: '>=8'}
     dependencies:
-      '@types/normalize-package-data': 2.4.1
+      '@types/normalize-package-data': 2.4.3
       normalize-package-data: 2.5.0
       parse-json: 5.2.0
       type-fest: 0.6.0
@@ -14749,8 +15674,8 @@ packages:
       resolve: 1.22.4
     dev: true
 
-  /reconnecting-websocket@4.4.0:
-    resolution: {integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==}
+  /reconnecting@4.4.1:
+    resolution: {integrity: sha512-2GU8WqGpWVB0FcqJNbTDdRVSTw8W2205r+tWx8EVkFa8Oi5N2pbJeNPm9jHQNjDeQcqVILRNZfUX2RRHu6Zdog==}
     dev: false
 
   /redent@3.0.0:
@@ -14791,17 +15716,6 @@ packages:
       - supports-color
     dev: false
 
-  /redis@4.6.7:
-    resolution: {integrity: sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==}
-    dependencies:
-      '@redis/bloom': 1.2.0(@redis/client@1.5.8)
-      '@redis/client': 1.5.8
-      '@redis/graph': 1.1.0(@redis/client@1.5.8)
-      '@redis/json': 1.0.4(@redis/client@1.5.8)
-      '@redis/search': 1.1.3(@redis/client@1.5.8)
-      '@redis/time-series': 1.0.4(@redis/client@1.5.8)
-    dev: true
-
   /reduce-css-calc@1.3.0:
     resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==}
     dependencies:
@@ -15022,14 +15936,19 @@ packages:
     dependencies:
       http-errors: 1.6.3
       path-is-absolute: 1.0.1
+    dev: false
+
+  /resolve-pkg-maps@1.0.0:
+    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+    dev: true
 
   /resolve-url@0.2.1:
     resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
     deprecated: https://github.com/lydell/resolve-url#deprecated
     dev: true
 
-  /resolve.exports@1.1.1:
-    resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==}
+  /resolve.exports@2.0.2:
+    resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
     engines: {node: '>=10'}
     dev: true
 
@@ -15048,6 +15967,15 @@ packages:
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
 
+  /resolve@1.22.8:
+    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.13.0
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+    dev: true
+
   /responselike@2.0.1:
     resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
     dependencies:
@@ -15108,12 +16036,24 @@ packages:
       rangestr: 0.0.1
       seedrandom: 2.4.2
 
-  /rollup@3.28.1:
-    resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==}
-    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+  /rollup@4.4.1:
+    resolution: {integrity: sha512-idZzrUpWSblPJX66i+GzrpjKE3vbYrlWirUHteoAbjKReZwa0cohAErOYA5efoMmNCdvG9yrJS+w9Kl6csaH4w==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: 2.3.2
+      '@rollup/rollup-android-arm-eabi': 4.4.1
+      '@rollup/rollup-android-arm64': 4.4.1
+      '@rollup/rollup-darwin-arm64': 4.4.1
+      '@rollup/rollup-darwin-x64': 4.4.1
+      '@rollup/rollup-linux-arm-gnueabihf': 4.4.1
+      '@rollup/rollup-linux-arm64-gnu': 4.4.1
+      '@rollup/rollup-linux-arm64-musl': 4.4.1
+      '@rollup/rollup-linux-x64-gnu': 4.4.1
+      '@rollup/rollup-linux-x64-musl': 4.4.1
+      '@rollup/rollup-win32-arm64-msvc': 4.4.1
+      '@rollup/rollup-win32-ia32-msvc': 4.4.1
+      '@rollup/rollup-win32-x64-msvc': 4.4.1
+      fsevents: 2.3.3
     dev: true
 
   /rss-parser@3.13.0:
@@ -15196,8 +16136,8 @@ packages:
       postcss: 8.4.27
     dev: false
 
-  /sass@1.66.1:
-    resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==}
+  /sass@1.69.5:
+    resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==}
     engines: {node: '>=14.0.0'}
     hasBin: true
     dependencies:
@@ -15213,13 +16153,6 @@ packages:
   /sax@1.2.4:
     resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
 
-  /saxes@5.0.1:
-    resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
-    engines: {node: '>=10'}
-    dependencies:
-      xmlchars: 2.2.0
-    dev: true
-
   /schema-utils@3.3.0:
     resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
     engines: {node: '>= 10.13.0'}
@@ -15274,14 +16207,6 @@ packages:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
 
-  /semver@7.3.8:
-    resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dependencies:
-      lru-cache: 6.0.0
-    dev: true
-
   /semver@7.5.4:
     resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
     engines: {node: '>=10'}
@@ -15327,9 +16252,11 @@ packages:
 
   /setprototypeof@1.1.0:
     resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
+    dev: false
 
   /setprototypeof@1.2.0:
     resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+    dev: false
 
   /sha.js@2.4.11:
     resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
@@ -15346,8 +16273,8 @@ packages:
       crypt: 0.0.2
     dev: true
 
-  /sharp@0.32.5:
-    resolution: {integrity: sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==}
+  /sharp@0.32.6:
+    resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==}
     engines: {node: '>=14.15.0'}
     requiresBuild: true
     dependencies:
@@ -15383,6 +16310,15 @@ packages:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
 
+  /shiki@0.14.5:
+    resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==}
+    dependencies:
+      ansi-sequence-parser: 1.1.1
+      jsonc-parser: 3.2.0
+      vscode-oniguruma: 1.7.0
+      vscode-textmate: 8.0.0
+    dev: true
+
   /side-channel@1.0.4:
     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
     dependencies:
@@ -15564,6 +16500,13 @@ packages:
       decode-uri-component: 0.2.2
     dev: true
 
+  /source-map-support@0.5.13:
+    resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+    dev: true
+
   /source-map-support@0.5.21:
     resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
     dependencies:
@@ -15600,7 +16543,7 @@ packages:
     resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
     dependencies:
       spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.13
+      spdx-license-ids: 3.0.16
     dev: true
 
   /spdx-exceptions@2.3.0:
@@ -15618,6 +16561,10 @@ packages:
     resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
     dev: true
 
+  /spdx-license-ids@3.0.16:
+    resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==}
+    dev: true
+
   /split-string@3.1.0:
     resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
     engines: {node: '>=0.10.0'}
@@ -15680,9 +16627,9 @@ packages:
     resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
     dev: false
 
-  /start-server-and-test@1.15.2:
-    resolution: {integrity: sha512-t5xJX04Hg7hqxiKHMJBz/n4zIMsE6G7hpAcerFAH+4Vh9le/LeyFcJERJM7WLiPygWF9TOg33oroJF1XOzJtYQ==}
-    engines: {node: '>=6'}
+  /start-server-and-test@2.0.3:
+    resolution: {integrity: sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg==}
+    engines: {node: '>=16'}
     hasBin: true
     dependencies:
       arg: 5.0.2
@@ -15692,7 +16639,7 @@ packages:
       execa: 5.1.1
       lazy-ass: 1.6.0
       ps-tree: 1.2.0
-      wait-on: 6.0.1(debug@4.3.4)
+      wait-on: 7.2.0(debug@4.3.4)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -15708,6 +16655,7 @@ packages:
   /statuses@1.5.0:
     resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
     engines: {node: '>= 0.6'}
+    dev: false
 
   /statuses@2.0.1:
     resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
@@ -15756,11 +16704,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /string-argv@0.3.2:
-    resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
-    engines: {node: '>=0.6.19'}
-    dev: true
-
   /string-length@4.0.2:
     resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
     engines: {node: '>=10'}
@@ -16034,25 +16977,21 @@ packages:
       whet.extend: 0.9.9
     dev: true
 
-  /swc-loader@0.2.3(@swc/core@1.3.78)(webpack@5.88.2):
+  /swc-loader@0.2.3(@swc/core@1.3.78)(webpack@5.89.0):
     resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==}
     peerDependencies:
       '@swc/core': ^1.2.147
       webpack: '>=2'
     dependencies:
       '@swc/core': 1.3.78
-      webpack: 5.88.2(@swc/core@1.3.78)
+      webpack: 5.89.0(@swc/core@1.3.78)
     dev: true
 
-  /swiper@10.2.0:
-    resolution: {integrity: sha512-nktQsOtBInJjr3f5DicxC8eHYGcLXDVIGPSon0QoXRaO6NjKnATCbQ8SZsD3dN1Ph1RH4EhVPwSYCcuDRFWHGQ==}
+  /swiper@11.0.4:
+    resolution: {integrity: sha512-qtUxILrD4aD++rpKzGrkz3IAWL92f9uTrDwjb6HaNLmPvJhZCE/83DL+9w4kIgDDJeF6QKalV47rMBN77UOVYQ==}
     engines: {node: '>= 4.7.0'}
     dev: true
 
-  /symbol-tree@3.2.4:
-    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
-    dev: true
-
   /synckit@0.8.5:
     resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
     engines: {node: ^14.18.0 || >=16.0.0}
@@ -16068,8 +17007,8 @@ packages:
       moment: 2.29.4
     dev: false
 
-  /systeminformation@5.21.3:
-    resolution: {integrity: sha512-+Xjja4LLZa6z/YdqHrzE6lDZLle/k+X1NLHCJhXux1ykMqIj++Nq5YbtjsYjn0p+M3Z/OLFqjLw15D2DrjP3ug==}
+  /systeminformation@5.21.17:
+    resolution: {integrity: sha512-JZYRCbIjk3WuBV59A9/rTla2rROX+aAJ9uo2Z1dI+bjieORcukClN8rlM1zE9NYKpULSbaGc+KKct/870lO0DA==}
     engines: {node: '>=8.0.0'}
     os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
     hasBin: true
@@ -16169,15 +17108,7 @@ packages:
     engines: {node: '>=14.16'}
     dev: true
 
-  /terminal-link@2.1.1:
-    resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      ansi-escapes: 4.3.2
-      supports-hyperlinks: 2.3.0
-    dev: true
-
-  /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(webpack@5.88.2):
+  /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(webpack@5.89.0):
     resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==}
     engines: {node: '>= 10.13.0'}
     peerDependencies:
@@ -16193,13 +17124,13 @@ packages:
       uglify-js:
         optional: true
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.19
+      '@jridgewell/trace-mapping': 0.3.20
       '@swc/core': 1.3.78
       jest-worker: 27.5.1
       schema-utils: 3.3.0
       serialize-javascript: 6.0.1
       terser: 5.19.2
-      webpack: 5.88.2(@swc/core@1.3.78)
+      webpack: 5.89.0(@swc/core@1.3.78)
     dev: true
 
   /terser@5.19.2:
@@ -16213,12 +17144,12 @@ packages:
       source-map-support: 0.5.21
     dev: true
 
-  /tesseract.js-core@4.0.4:
-    resolution: {integrity: sha512-MJ+vtktjAaT0681uPl6TDUPhbRbpD/S9emko5rtorgHRZpQo7R3BG7h+3pVHgn1KjfNf1bvnx4B7KxEK8YKqpg==}
+  /tesseract.js-core@5.0.0:
+    resolution: {integrity: sha512-lJur5LzjinW5VYMKlVNnBU2JPLpO+A9VqAYBeuV+ZgH0hKvsnm+536Yyp+/zRTBdLe7D6Kok0FN9g+TE4J8qGA==}
     dev: false
 
-  /tesseract.js@4.1.1:
-    resolution: {integrity: sha512-2a9ej6FmtNtRKdFpjvjUpz0zGJRQgPlj/oyJxRBzMN7+2dXKeZwrIDF1b4B7xslrhlE5xpL0TYLpwhpMwsb/rw==}
+  /tesseract.js@5.0.3:
+    resolution: {integrity: sha512-UcEaIRQ+KSjxl57SS2WQgnac8hON0uJgqR6418MYLBeFPGqrAooNwcKVIoSVCzflO3CxTKPg5Ic7z7JuW7wOGA==}
     requiresBuild: true
     dependencies:
       bmp-js: 0.1.0
@@ -16228,7 +17159,7 @@ packages:
       node-fetch: 2.6.12
       opencollective-postinstall: 2.0.3
       regenerator-runtime: 0.13.11
-      tesseract.js-core: 4.0.4
+      tesseract.js-core: 5.0.0
       wasm-feature-detect: 1.5.1
       zlibjs: 0.3.1
     transitivePeerDependencies:
@@ -16262,18 +17193,16 @@ packages:
     engines: {node: '>=0.8'}
     dependencies:
       thenify: 3.3.1
+    dev: false
 
   /thenify@3.3.1:
     resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
     dependencies:
       any-promise: 1.3.0
+    dev: false
 
-  /three@0.156.0:
-    resolution: {integrity: sha512-r6meetGWDk3aYjDRh6NpKuUkzoPlI3yldDQe2SkwCcqTTB5NZn7vKQBUXyMExvlwZShaLmvAbsVWaFzp1rkk3A==}
-    dev: true
-
-  /throat@6.0.2:
-    resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==}
+  /three@0.158.0:
+    resolution: {integrity: sha512-TALj4EOpdDPF1henk2Q+s17K61uEAAWQ7TJB68nr7FKxqwyDr3msOt5IWdbGm4TaWKjrtWS8DJJWe9JnvsWOhQ==}
     dev: true
 
   /throttle-debounce@5.0.0:
@@ -16401,6 +17330,7 @@ packages:
   /toidentifier@1.0.1:
     resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
     engines: {node: '>=0.6'}
+    dev: false
 
   /token-stream@1.0.0:
     resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
@@ -16417,7 +17347,7 @@ packages:
     engines: {node: '>=0.8'}
     dependencies:
       psl: 1.9.0
-      punycode: 2.3.0
+      punycode: 2.3.1
     dev: false
 
   /tough-cookie@4.1.3:
@@ -16425,7 +17355,7 @@ packages:
     engines: {node: '>=6'}
     dependencies:
       psl: 1.9.0
-      punycode: 2.3.0
+      punycode: 2.3.1
       universalify: 0.2.0
       url-parse: 1.5.10
     dev: true
@@ -16433,13 +17363,6 @@ packages:
   /tr46@0.0.3:
     resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
 
-  /tr46@2.1.0:
-    resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
-    engines: {node: '>=8'}
-    dependencies:
-      punycode: 2.3.0
-    dev: true
-
   /trace-redirect@1.0.6:
     resolution: {integrity: sha512-UUfa1DjjU5flcjMdaFIiIEGDTyu2y/IiMjOX4uGXa7meKBS4vD4f2Uy/tken9Qkd4Jsm4sRsfZcIIPqrRVF3Mg==}
     dev: false
@@ -16465,43 +17388,76 @@ packages:
       typescript: 5.2.2
     dev: true
 
-  /ts-jest@27.1.2(@babel/core@7.22.10)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3):
-    resolution: {integrity: sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@4.9.4):
+    resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
     peerDependencies:
       '@babel/core': '>=7.0.0-beta.0 <8'
-      '@types/jest': ^27.0.0
-      babel-jest: '>=27.0.0 <28'
-      esbuild: ~0.14.0
-      jest: ^27.0.0
-      typescript: '>=3.8 <5.0'
+      '@jest/types': ^29.0.0
+      babel-jest: ^29.0.0
+      esbuild: '*'
+      jest: ^29.0.0
+      typescript: '>=4.3 <6'
     peerDependenciesMeta:
       '@babel/core':
         optional: true
-      '@types/jest':
+      '@jest/types':
         optional: true
       babel-jest:
         optional: true
       esbuild:
         optional: true
     dependencies:
-      '@babel/core': 7.22.10
-      '@types/jest': 27.4.0
+      '@babel/core': 7.23.2
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
-      jest: 27.4.5(ts-node@10.4.0)
-      jest-util: 27.5.1
+      jest: 29.7.0(@types/node@18.11.18)
+      jest-util: 29.7.0
       json5: 2.2.3
       lodash.memoize: 4.1.2
       make-error: 1.3.6
       semver: 7.5.4
-      typescript: 5.1.3
-      yargs-parser: 20.2.9
+      typescript: 4.9.4
+      yargs-parser: 21.1.1
     dev: true
 
-  /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.2):
-    resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==}
+  /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.2.2):
+    resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      '@babel/core': '>=7.0.0-beta.0 <8'
+      '@jest/types': ^29.0.0
+      babel-jest: ^29.0.0
+      esbuild: '*'
+      jest: ^29.0.0
+      typescript: '>=4.3 <6'
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+      '@jest/types':
+        optional: true
+      babel-jest:
+        optional: true
+      esbuild:
+        optional: true
+    dependencies:
+      '@babel/core': 7.23.2
+      bs-logger: 0.2.6
+      fast-json-stable-stringify: 2.1.0
+      jest: 29.7.0(@types/node@20.9.0)(ts-node@10.9.1)
+      jest-util: 29.7.0
+      json5: 2.2.3
+      lodash.memoize: 4.1.2
+      make-error: 1.3.6
+      semver: 7.5.4
+      typescript: 5.2.2
+      yargs-parser: 21.1.1
+    dev: true
+
+  /ts-loader@9.5.1(typescript@5.2.2)(webpack@5.89.0):
+    resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==}
     engines: {node: '>=12.0.0'}
     peerDependencies:
       typescript: '*'
@@ -16511,42 +17467,12 @@ packages:
       enhanced-resolve: 5.15.0
       micromatch: 4.0.5
       semver: 7.5.4
-      typescript: 5.1.6
-      webpack: 5.88.2(@swc/core@1.3.78)
+      source-map: 0.7.4
+      typescript: 5.2.2
+      webpack: 5.89.0(@swc/core@1.3.78)
     dev: true
 
-  /ts-node@10.4.0(@swc/core@1.3.78)(@types/node@20.3.1)(typescript@5.1.3):
-    resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==}
-    hasBin: true
-    peerDependencies:
-      '@swc/core': '>=1.2.50'
-      '@swc/wasm': '>=1.2.50'
-      '@types/node': '*'
-      typescript: '>=2.7'
-    peerDependenciesMeta:
-      '@swc/core':
-        optional: true
-      '@swc/wasm':
-        optional: true
-    dependencies:
-      '@cspotcode/source-map-support': 0.7.0
-      '@swc/core': 1.3.78
-      '@tsconfig/node10': 1.0.9
-      '@tsconfig/node12': 1.0.11
-      '@tsconfig/node14': 1.0.3
-      '@tsconfig/node16': 1.0.4
-      '@types/node': 20.3.1
-      acorn: 8.10.0
-      acorn-walk: 8.2.0
-      arg: 4.1.3
-      create-require: 1.1.1
-      diff: 4.0.2
-      make-error: 1.3.6
-      typescript: 5.1.3
-      yn: 3.1.1
-    dev: true
-
-  /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6):
+  /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.9.0)(typescript@5.2.2):
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -16566,19 +17492,19 @@ packages:
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 18.11.18
+      '@types/node': 20.9.0
       acorn: 8.10.0
       acorn-walk: 8.2.0
       arg: 4.1.3
       create-require: 1.1.1
       diff: 4.0.2
       make-error: 1.3.6
-      typescript: 5.1.6
+      typescript: 5.2.2
       v8-compile-cache-lib: 3.0.1
       yn: 3.1.1
 
-  /tsc-alias@1.8.7:
-    resolution: {integrity: sha512-59Q/zUQa3miTf99mLbSqaW0hi1jt4WoG8Uhe5hSZJHQpSoFW9eEwvW7jlKMHXWvT+zrzy3SN9PE/YBhQ+WVydA==}
+  /tsc-alias@1.8.8:
+    resolution: {integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==}
     hasBin: true
     dependencies:
       chokidar: 3.5.3
@@ -16607,15 +17533,15 @@ packages:
       strip-bom: 3.0.0
     dev: true
 
-  /tsd@0.28.1:
-    resolution: {integrity: sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==}
+  /tsd@0.29.0:
+    resolution: {integrity: sha512-5B7jbTj+XLMg6rb9sXRBGwzv7h8KJlGOkTHxY63eWpZJiQ5vJbXEjL0u7JkIxwi5EsrRE1kRVUWmy6buK/ii8A==}
     engines: {node: '>=14.16'}
     hasBin: true
     dependencies:
-      '@tsd/typescript': 5.0.4
+      '@tsd/typescript': 5.2.2
       eslint-formatter-pretty: 4.1.0
       globby: 11.1.0
-      jest-diff: 29.6.2
+      jest-diff: 29.7.0
       meow: 9.0.0
       path-exists: 4.0.0
       read-pkg-up: 7.0.1
@@ -16633,6 +17559,16 @@ packages:
     engines: {node: '>=0.6.x'}
     dev: false
 
+  /tsutils@3.21.0(typescript@4.9.4):
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+    dependencies:
+      tslib: 1.14.1
+      typescript: 4.9.4
+    dev: true
+
   /tsutils@3.21.0(typescript@5.2.2):
     resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
     engines: {node: '>= 6'}
@@ -16751,10 +17687,25 @@ packages:
     resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
     dependencies:
       is-typedarray: 1.0.0
+    dev: false
 
   /typedarray@0.0.6:
     resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
 
+  /typedoc@0.23.28(typescript@4.9.4):
+    resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==}
+    engines: {node: '>= 14.14'}
+    hasBin: true
+    peerDependencies:
+      typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x
+    dependencies:
+      lunr: 2.3.9
+      marked: 4.3.0
+      minimatch: 7.4.6
+      shiki: 0.14.5
+      typescript: 4.9.4
+    dev: true
+
   /typeorm@0.3.17(ioredis@5.3.2)(pg@8.11.3)(ts-node@10.9.1):
     resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==}
     engines: {node: '>= 12.9.0'}
@@ -16827,29 +17778,17 @@ packages:
       pg: 8.11.3
       reflect-metadata: 0.1.13
       sha.js: 2.4.11
-      ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@18.11.18)(typescript@5.1.6)
+      ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.9.0)(typescript@5.2.2)
       tslib: 2.6.1
-      uuid: 9.0.0
+      uuid: 9.0.1
       yargs: 17.7.2
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /typescript@5.0.4:
-    resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
-    engines: {node: '>=12.20'}
-    hasBin: true
-    dev: true
-
-  /typescript@5.1.3:
-    resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==}
-    engines: {node: '>=14.17'}
-    hasBin: true
-    dev: true
-
-  /typescript@5.1.6:
-    resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
-    engines: {node: '>=14.17'}
+  /typescript@4.9.4:
+    resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
+    engines: {node: '>=4.2.0'}
     hasBin: true
 
   /typescript@5.2.2:
@@ -16857,6 +17796,10 @@ packages:
     engines: {node: '>=14.17'}
     hasBin: true
 
+  /ufo@1.3.2:
+    resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
+    dev: true
+
   /ulid@2.3.0:
     resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==}
     hasBin: true
@@ -16904,6 +17847,9 @@ packages:
       undertaker-registry: 1.0.1
     dev: true
 
+  /undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
   /undici@5.23.0:
     resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==}
     engines: {node: '>=14.0'}
@@ -17005,10 +17951,21 @@ packages:
       escalade: 3.1.1
       picocolors: 1.0.0
 
+  /update-browserslist-db@1.0.13(browserslist@4.22.1):
+    resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+    dependencies:
+      browserslist: 4.22.1
+      escalade: 3.1.1
+      picocolors: 1.0.0
+    dev: true
+
   /uri-js@4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
     dependencies:
-      punycode: 2.3.0
+      punycode: 2.3.1
 
   /urix@0.1.0:
     resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
@@ -17069,10 +18026,6 @@ packages:
     hasBin: true
     dev: false
 
-  /uuid@7.0.3:
-    resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==}
-    hasBin: true
-
   /uuid@8.0.0:
     resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==}
     hasBin: true
@@ -17085,22 +18038,22 @@ packages:
   /uuid@9.0.0:
     resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
     hasBin: true
+    dev: false
 
   /uuid@9.0.1:
     resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
     hasBin: true
-    dev: false
 
   /v8-compile-cache-lib@3.0.1:
     resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
 
-  /v8-to-istanbul@8.1.1:
-    resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==}
+  /v8-to-istanbul@9.1.3:
+    resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==}
     engines: {node: '>=10.12.0'}
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
-      convert-source-map: 1.9.0
-      source-map: 0.7.4
+      '@jridgewell/trace-mapping': 0.3.20
+      '@types/istanbul-lib-coverage': 2.0.5
+      convert-source-map: 2.0.0
     dev: true
 
   /v8flags@3.2.0:
@@ -17117,11 +18070,6 @@ packages:
       spdx-expression-parse: 3.0.1
     dev: true
 
-  /validator@13.11.0:
-    resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
-    engines: {node: '>= 0.10'}
-    dev: true
-
   /value-or-function@3.0.0:
     resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==}
     engines: {node: '>= 0.10'}
@@ -17202,7 +18150,7 @@ packages:
       replace-ext: 1.0.1
     dev: true
 
-  /vite-plugin-compression@0.5.1(vite@4.4.9):
+  /vite-plugin-compression@0.5.1(vite@5.0.0):
     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -17210,17 +18158,17 @@ packages:
       chalk: 4.1.2
       debug: 4.3.4(supports-color@8.1.1)
       fs-extra: 10.1.0
-      vite: 4.4.9(@types/node@20.5.8)(sass@1.66.1)
+      vite: 5.0.0(@types/node@20.9.0)(sass@1.69.5)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /vite@4.4.9(@types/node@20.5.8)(sass@1.66.1):
-    resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
-    engines: {node: ^14.18.0 || >=16.0.0}
+  /vite@5.0.0(@types/node@20.9.0)(sass@1.69.5):
+    resolution: {integrity: sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==}
+    engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:
-      '@types/node': '>= 14'
+      '@types/node': ^18.0.0 || >=20.0.0
       less: '*'
       lightningcss: ^1.21.0
       sass: '*'
@@ -17243,21 +18191,29 @@ packages:
       terser:
         optional: true
     dependencies:
-      '@types/node': 20.5.8
-      esbuild: 0.18.20
-      postcss: 8.4.27
-      rollup: 3.28.1
-      sass: 1.66.1
+      '@types/node': 20.9.0
+      esbuild: 0.19.5
+      postcss: 8.4.31
+      rollup: 4.4.1
+      sass: 1.69.5
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: 2.3.3
     dev: true
 
   /void-elements@3.1.0:
     resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
     engines: {node: '>=0.10.0'}
 
-  /vue-draggable-plus@0.2.6(@types/sortablejs@1.15.1):
-    resolution: {integrity: sha512-d+0omKIBIfLiJFggc6H4ePRaifbX+33+OiCMsxn8rG59yWXlJGrobexxgXetnSo/1NLTd0TkYZKNc4CA6iwJZw==}
+  /vscode-oniguruma@1.7.0:
+    resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
+    dev: true
+
+  /vscode-textmate@8.0.0:
+    resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
+    dev: true
+
+  /vue-draggable-plus@0.2.7(@types/sortablejs@1.15.4):
+    resolution: {integrity: sha512-asNQ4OxTQtN91+m45lh8QEwscXhVveaLvPAzaRXHD8JIk1+SOg7NWPQ9EmUTeNhSP3SGkJ2Agvp5WRDt7vXM8w==}
     peerDependencies:
       '@types/sortablejs': ^1.15.0
       '@vue/composition-api': '*'
@@ -17265,17 +18221,17 @@ packages:
       '@vue/composition-api':
         optional: true
     dependencies:
-      '@types/sortablejs': 1.15.1
+      '@types/sortablejs': 1.15.4
     dev: true
 
-  /vue-eslint-parser@9.3.1(eslint@8.46.0):
+  /vue-eslint-parser@9.3.1(eslint@8.53.0):
     resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: '>=6.0.0'
     dependencies:
       debug: 4.3.4(supports-color@8.1.1)
-      eslint: 8.46.0
+      eslint: 8.53.0
       eslint-scope: 7.2.2
       eslint-visitor-keys: 3.4.2
       espree: 9.6.1
@@ -17286,6 +18242,24 @@ packages:
       - supports-color
     dev: true
 
+  /vue-eslint-parser@9.3.2(eslint@8.53.0):
+    resolution: {integrity: sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+    dependencies:
+      debug: 4.3.4(supports-color@8.1.1)
+      eslint: 8.53.0
+      eslint-scope: 7.2.2
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      esquery: 1.5.0
+      lodash: 4.17.21
+      semver: 7.5.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /vue-isyourpasswordsafe@2.0.0:
     resolution: {integrity: sha512-j3ORj18R9AgFiP2UOM35KuZbSeJAUiwCSyeRBFN3CGFYTJSKsxqU9qGqOHOz6OhLAYKMTin8JOmqugAbF9O+Bg==}
     dependencies:
@@ -17299,13 +18273,13 @@ packages:
       vue: 2.7.14
     dev: true
 
-  /vue-prism-editor@2.0.0-alpha.2(vue@3.3.4):
+  /vue-prism-editor@2.0.0-alpha.2(vue@3.3.8):
     resolution: {integrity: sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==}
     engines: {node: '>=10'}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
-      vue: 3.3.4
+      vue: 3.3.8(typescript@5.2.2)
     dev: true
 
   /vue@2.7.14:
@@ -17315,37 +18289,29 @@ packages:
       csstype: 3.1.2
     dev: true
 
-  /vue@3.3.4:
-    resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
+  /vue@3.3.8(typescript@5.2.2):
+    resolution: {integrity: sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
     dependencies:
-      '@vue/compiler-dom': 3.3.4
-      '@vue/compiler-sfc': 3.3.4
-      '@vue/runtime-dom': 3.3.4
-      '@vue/server-renderer': 3.3.4(vue@3.3.4)
-      '@vue/shared': 3.3.4
+      '@vue/compiler-dom': 3.3.8
+      '@vue/compiler-sfc': 3.3.8
+      '@vue/runtime-dom': 3.3.8
+      '@vue/server-renderer': 3.3.8(vue@3.3.8)
+      '@vue/shared': 3.3.8
+      typescript: 5.2.2
     dev: true
 
-  /w3c-hr-time@1.0.2:
-    resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
-    deprecated: Use your platform's native performance.now() and performance.timeOrigin.
-    dependencies:
-      browser-process-hrtime: 1.0.0
-    dev: true
-
-  /w3c-xmlserializer@2.0.0:
-    resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
-    engines: {node: '>=10'}
-    dependencies:
-      xml-name-validator: 3.0.0
-    dev: true
-
-  /wait-on@6.0.1(debug@4.3.4):
-    resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==}
-    engines: {node: '>=10.0.0'}
+  /wait-on@7.2.0(debug@4.3.4):
+    resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==}
+    engines: {node: '>=12.0.0'}
     hasBin: true
     dependencies:
-      axios: 0.25.0(debug@4.3.4)
-      joi: 17.9.2
+      axios: 1.6.2(debug@4.3.4)
+      joi: 17.11.0
       lodash: 4.17.21
       minimist: 1.2.8
       rxjs: 7.8.1
@@ -17377,8 +18343,8 @@ packages:
       defaults: 1.0.4
     dev: true
 
-  /web-push@3.6.5:
-    resolution: {integrity: sha512-rc/i0LRwA4EAeajRVHQp6+RW+NlCMuk3CgFLb+IR/NJ1RleeNzQ9iwayVHgc4LmcxaaWeslHBM1qLUq1yi0O6A==}
+  /web-push@3.6.6:
+    resolution: {integrity: sha512-SyteEck9fiCskNmPxs/GFhJsZrIyLfRvjWNmcUwULLJyCU0f1oxo2sWTokXA1mDAq9vxk4e4gVcb/8agq73NkQ==}
     engines: {node: '>= 16'}
     hasBin: true
     dependencies:
@@ -17394,20 +18360,11 @@ packages:
   /web-streams-polyfill@3.2.1:
     resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
     engines: {node: '>= 8'}
+    dev: false
 
   /webidl-conversions@3.0.1:
     resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
 
-  /webidl-conversions@5.0.0:
-    resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /webidl-conversions@6.1.0:
-    resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
-    engines: {node: '>=10.4'}
-    dev: true
-
   /webidl-conversions@7.0.0:
     resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
     engines: {node: '>=12'}
@@ -17418,8 +18375,8 @@ packages:
     engines: {node: '>=10.13.0'}
     dev: true
 
-  /webpack@5.88.2(@swc/core@1.3.78):
-    resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==}
+  /webpack@5.89.0(@swc/core@1.3.78):
+    resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==}
     engines: {node: '>=10.13.0'}
     hasBin: true
     peerDependencies:
@@ -17429,13 +18386,13 @@ packages:
         optional: true
     dependencies:
       '@types/eslint-scope': 3.7.4
-      '@types/estree': 1.0.1
+      '@types/estree': 1.0.3
       '@webassemblyjs/ast': 1.11.6
       '@webassemblyjs/wasm-edit': 1.11.6
       '@webassemblyjs/wasm-parser': 1.11.6
       acorn: 8.10.0
       acorn-import-assertions: 1.9.0(acorn@8.10.0)
-      browserslist: 4.21.10
+      browserslist: 4.22.1
       chrome-trace-event: 1.0.3
       enhanced-resolve: 5.15.0
       es-module-lexer: 1.3.0
@@ -17449,7 +18406,7 @@ packages:
       neo-async: 2.6.2
       schema-utils: 3.3.0
       tapable: 2.2.1
-      terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(webpack@5.88.2)
+      terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(webpack@5.89.0)
       watchpack: 2.4.0
       webpack-sources: 3.2.3
     transitivePeerDependencies:
@@ -17477,12 +18434,6 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /whatwg-encoding@1.0.5:
-    resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
-    dependencies:
-      iconv-lite: 0.4.24
-    dev: true
-
   /whatwg-encoding@2.0.0:
     resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
     engines: {node: '>=12'}
@@ -17490,10 +18441,6 @@ packages:
       iconv-lite: 0.6.3
     dev: false
 
-  /whatwg-mimetype@2.3.0:
-    resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
-    dev: true
-
   /whatwg-mimetype@3.0.0:
     resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
     engines: {node: '>=12'}
@@ -17505,15 +18452,6 @@ packages:
       tr46: 0.0.3
       webidl-conversions: 3.0.1
 
-  /whatwg-url@8.7.0:
-    resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}
-    engines: {node: '>=10'}
-    dependencies:
-      lodash: 4.17.21
-      tr46: 2.1.0
-      webidl-conversions: 6.1.0
-    dev: true
-
   /whet.extend@0.9.9:
     resolution: {integrity: sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==}
     engines: {node: '>=0.6.0'}
@@ -17560,6 +18498,14 @@ packages:
     dependencies:
       isexe: 2.0.0
 
+  /which@4.0.0:
+    resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
+    engines: {node: ^16.13.0 || >=18.0.0}
+    hasBin: true
+    dependencies:
+      isexe: 3.1.1
+    dev: false
+
   /wide-align@1.1.5:
     resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
     dependencies:
@@ -17615,13 +18561,12 @@ packages:
   /wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
-  /write-file-atomic@3.0.3:
-    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+  /write-file-atomic@4.0.2:
+    resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
     dependencies:
       imurmurhash: 0.1.4
-      is-typedarray: 1.0.0
       signal-exit: 3.0.7
-      typedarray-to-buffer: 3.1.5
     dev: true
 
   /write-file-atomic@5.0.1:
@@ -17632,21 +18577,8 @@ packages:
       signal-exit: 4.1.0
     dev: true
 
-  /ws@7.5.9:
-    resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
-    engines: {node: '>=8.3.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-    dev: true
-
-  /ws@8.13.0:
-    resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
+  /ws@8.12.0:
+    resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==}
     engines: {node: '>=10.0.0'}
     peerDependencies:
       bufferutil: ^4.0.1
@@ -17656,7 +18588,7 @@ packages:
         optional: true
       utf-8-validate:
         optional: true
-    dev: true
+    dev: false
 
   /ws@8.14.2:
     resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
@@ -17669,7 +18601,7 @@ packages:
         optional: true
       utf-8-validate:
         optional: true
-    dev: false
+    dev: true
 
   /xev@3.0.2:
     resolution: {integrity: sha512-8kxuH95iMXzHZj+fwqfA4UrPcYOy6bGIgfWzo9Ji23JoEc30ge/Z++Ubkiuy8c0+M64nXmmxrmJ7C8wnuBhluw==}
@@ -17682,10 +18614,6 @@ packages:
       sax: 1.2.4
     dev: false
 
-  /xml-name-validator@3.0.0:
-    resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
-    dev: true
-
   /xml-name-validator@4.0.0:
     resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
     engines: {node: '>=12'}
@@ -17704,10 +18632,6 @@ packages:
     engines: {node: '>=4.0'}
     dev: false
 
-  /xmlchars@2.2.0:
-    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
-    dev: true
-
   /xtend@4.0.2:
     resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
     engines: {node: '>=0.4'}
@@ -17879,24 +18803,12 @@ packages:
     engines: {node: '>=12.20'}
     dev: true
 
-  /z-schema@5.0.5:
-    resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==}
-    engines: {node: '>=8.0.0'}
-    hasBin: true
+  /zip-stream@5.0.1:
+    resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==}
+    engines: {node: '>= 12.0.0'}
     dependencies:
-      lodash.get: 4.4.2
-      lodash.isequal: 4.5.0
-      validator: 13.11.0
-    optionalDependencies:
-      commander: 9.5.0
-    dev: true
-
-  /zip-stream@4.1.0:
-    resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==}
-    engines: {node: '>= 10'}
-    dependencies:
-      archiver-utils: 2.1.0
-      compress-commons: 4.1.1
+      archiver-utils: 4.0.1
+      compress-commons: 5.0.1
       readable-stream: 3.6.2
     dev: false
 
@@ -17932,7 +18844,7 @@ packages:
     name: plyr
     version: 3.7.0
     dependencies:
-      core-js: 3.32.0
+      core-js: 3.33.0
       custom-event-polyfill: 1.0.7
       loadjs: 4.2.0
       rangetouch: 2.0.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index c70c008eaf..fd5cd65e6d 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -4,3 +4,4 @@ packages:
  - 'packages/client'
  - 'packages/sw'
  - 'packages/firefish-js'
+ - 'packages/megalodon'
diff --git a/scripts/clean-all.js b/scripts/clean-all.mjs
similarity index 77%
rename from scripts/clean-all.js
rename to scripts/clean-all.mjs
index 7beed3fe26..f8708f740f 100644
--- a/scripts/clean-all.js
+++ b/scripts/clean-all.mjs
@@ -1,8 +1,11 @@
-const fs = require("node:fs");
-const execa = require("execa");
-const { join } = require("node:path");
+import fs from "node:fs";
+import path, { join } from "node:path";
+import { fileURLToPath } from "node:url";
+import { execa } from "execa";
 
 (async () => {
+	const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
 	fs.rmSync(join(__dirname, "/../packages/backend/built"), {
 		recursive: true,
 		force: true,
@@ -46,6 +49,14 @@ const { join } = require("node:path");
 		recursive: true,
 		force: true,
 	});
+	fs.rmSync(join(__dirname, "/../packages/megalodon/lib"), {
+		recursive: true,
+		force: true,
+	});
+	fs.rmSync(join(__dirname, "/../packages/megalodon/node_modules"), {
+		recursive: true,
+		force: true,
+	});
 
 	fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true });
 	fs.rmSync(join(__dirname, "/../node_modules"), {
diff --git a/scripts/clean.js b/scripts/clean.mjs
similarity index 68%
rename from scripts/clean.js
rename to scripts/clean.mjs
index e4ae085b4c..aa2d0f7393 100644
--- a/scripts/clean.js
+++ b/scripts/clean.mjs
@@ -1,8 +1,10 @@
-const fs = require("node:fs");
-const execa = require("execa");
-const { join } = require("node:path");
+import fs from "node:fs";
+import path, { join } from "node:path";
+import { fileURLToPath } from "node:url";
 
 (async () => {
+	const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
 	fs.rmSync(join(__dirname, "/../packages/backend/built"), {
 		recursive: true,
 		force: true,
@@ -23,5 +25,9 @@ const { join } = require("node:path");
 		recursive: true,
 		force: true,
 	});
+	fs.rmSync(join(__dirname, "/../packages/megalodon/lib"), {
+		recursive: true,
+		force: true,
+	});
 	fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true });
 })();
diff --git a/scripts/dev.js b/scripts/dev.mjs
similarity index 67%
rename from scripts/dev.js
rename to scripts/dev.mjs
index 0d6a05fe20..beaa11f8e0 100644
--- a/scripts/dev.js
+++ b/scripts/dev.mjs
@@ -1,32 +1,36 @@
-const execa = require("execa");
+import path, { join } from "node:path";
+import { fileURLToPath } from "node:url";
+import { execa } from "execa";
 
 (async () => {
+	const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
 	await execa("pnpm", ["clean"], {
-		cwd: __dirname + "/../",
+		cwd: join(__dirname, "/../"),
 		stdout: process.stdout,
 		stderr: process.stderr,
 	});
 
 	execa("pnpm", ["dlx", "gulp", "watch"], {
-		cwd: __dirname + "/../",
+		cwd: join(__dirname, "/../"),
 		stdout: process.stdout,
 		stderr: process.stderr,
 	});
 
 	execa("pnpm", ["--filter", "backend", "watch"], {
-		cwd: __dirname + "/../",
+		cwd: join(__dirname, "/../"),
 		stdout: process.stdout,
 		stderr: process.stderr,
 	});
 
 	execa("pnpm", ["--filter", "client", "watch"], {
-		cwd: __dirname + "/../",
+		cwd: join(__dirname, "/../"),
 		stdout: process.stdout,
 		stderr: process.stderr,
 	});
 
 	execa("pnpm", ["--filter", "sw", "watch"], {
-		cwd: __dirname + "/../",
+		cwd: join(__dirname, "/../"),
 		stdout: process.stdout,
 		stderr: process.stderr,
 	});
@@ -34,7 +38,7 @@ const execa = require("execa");
 	const start = async () => {
 		try {
 			await execa("pnpm", ["start"], {
-				cwd: __dirname + "/../",
+				cwd: join(__dirname, "/../"),
 				stdout: process.stdout,
 				stderr: process.stderr,
 			});