diff --git a/CHANGELOG.md b/CHANGELOG.md
index 01213bd8c3..30018a9d23 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,22 @@
+## 2025.10.1
+
+### General
+- 依存関係の更新
+
+### Client
+- Fix: カスタム絵文字画面(beta)のaliasesで使用される区切り文字が一致していないのを修正 #15614
+- Fix: バナー画像の幅が表示領域と一致していない問題を修正
+- Fix: 一部のブラウザでバナー画像が上下中央に表示されない問題を修正
+
+### Server
+-
+
## 2025.10.0
### NOTE
- pnpm 10.16.0 が必要です
+- ロールのインポート機能の利用可否ポリシーのデフォルト値が「いいえ」に変わったため、デフォルトから変更していないサーバーでは適宜設定を変更してください。
+- ロールのアップロード可能なファイル種別ポリシーのデフォルト値に「text/*」が追加されたため、デフォルトから変更していないサーバーでは適宜設定を変更してください。
### General
- Feat: 予約投稿ができるようになりました
@@ -20,9 +35,12 @@
- Enhance: ウォーターマークにアカウントのQRコードを追加できるように
- Enhance: テーマをドラッグ&ドロップできるように
- Enhance: 絵文字ピッカーのサイズをより大きくできるように
+- Enhance: カスタム絵文字が多い場合にサーバーの絵文字一覧ページがフリーズしないように
- Enhance: 時刻計算のための基準値を一か所で管理するようにし、パフォーマンスを向上
+- Enhance: 「お問い合わせ」ページから、バグの調査等に役立つ情報(OSやブラウザのバージョン等)を取得・コピーできるように
- Fix: iOSで、デバイスがダークモードだと初回読み込み時にエラーになる問題を修正
- Fix: アクティビティウィジェットのグラフモードが動作しない問題を修正
+- Fix: ユニコード絵文字の追加辞書をインストールするとユニコード絵文字が絵文字ピッカーで検索できなくなる絵文字があるバグを修正
### Server
- Enhance: ユーザーIPを確実に取得できるために設定ファイルにFastifyOptions.trustProxyを追加しました
diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml
index 117c38b677..98b9810b69 100644
--- a/locales/ar-SA.yml
+++ b/locales/ar-SA.yml
@@ -1010,6 +1010,7 @@ postForm: "أنشئ ملاحظة"
information: "عن"
inMinutes: "د"
inDays: "ي"
+widgets: "التطبيقات المُصغّرة"
_chat:
invitations: "دعوة"
noHistory: "السجل فارغ"
diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml
index 395cee114a..1c61bc73cf 100644
--- a/locales/bn-BD.yml
+++ b/locales/bn-BD.yml
@@ -850,6 +850,7 @@ postForm: "নোট লিখুন"
information: "আপনার সম্পর্কে"
inMinutes: "মিনিট"
inDays: "দিন"
+widgets: "উইজেটগুলি"
_chat:
invitations: "আমন্ত্রণ"
noHistory: "কোনো ইতিহাস নেই"
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml
index bb1a42232d..544aac03ea 100644
--- a/locales/ca-ES.yml
+++ b/locales/ca-ES.yml
@@ -334,6 +334,7 @@ fileName: "Nom del Fitxer"
selectFile: "Selecciona un fitxer"
selectFiles: "Selecciona fitxers"
selectFolder: "Selecció de carpeta"
+unselectFolder: "Deixa de seleccionar la carpeta"
selectFolders: "Selecció de carpetes"
fileNotSelected: "Cap fitxer seleccionat"
renameFile: "Canvia el nom del fitxer"
@@ -346,6 +347,7 @@ addFile: "Afegeix un fitxer"
showFile: "Mostrar fitxer"
emptyDrive: "El teu Disc és buit"
emptyFolder: "La carpeta està buida"
+dropHereToUpload: "Arrossega els arxius fins aquí per pujar-los al servidor"
unableToDelete: "No es pot eliminar"
inputNewFileName: "Introduïu el nom de fitxer nou"
inputNewDescription: "Escriu el peu de foto."
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "Programar una nota per {x}"
scheduledToPostOnX: "S'ha programat la nota per {x}"
schedule: "Programa"
scheduled: "Programat"
+widgets: "Ginys"
+deviceInfo: "Informació del dispositiu"
+deviceInfoDescription: "En fer consultes tècniques influir la següent informació pot ajudar a resoldre'l més ràpidament."
_compression:
_quality:
high: "Qualitat alta"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "Gestiona les decoracions dels avatars "
driveCapacity: "Capacitat del disc"
maxFileSize: "Mida màxima de l'arxiu que es pot carregar"
+ maxFileSize_caption: "Pot haver-hi la possibilitat que existeixin altres opcions de configuració de l'etapa anterior, com podria ser el proxy invers i la CDN."
alwaysMarkNsfw: "Marca sempre els fitxers com a sensibles"
canUpdateBioMedia: "Permet l'edició d'una icona o un bàner"
pinMax: "Nombre màxim de notes fixades"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "Opera com si fossis aquest usuari"
pleaseLogin: "Si us plau, identificat per autoritzar l'aplicació."
byClickingYouWillBeRedirectedToThisUrl: "Si es garanteix l'accés, seràs redirigit automàticament a la següent adreça URL"
+ alreadyAuthorized: "Aquesta aplicació ja té accés."
_antennaSources:
all: "Totes les publicacions"
homeTimeline: "Publicacions dels usuaris seguits"
@@ -2697,6 +2704,8 @@ _notification:
quote: "Citar"
reaction: "Reaccions"
pollEnded: "Enquesta terminada"
+ scheduledNotePosted: "Nota programada amb èxit "
+ scheduledNotePostFailed: "Ha fallat la programació de la nota"
receiveFollowRequest: "Rebuda una petició de seguiment"
followRequestAccepted: "Petició de seguiment acceptada"
roleAssigned: "Rol donat"
diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml
index 0d2ddccc60..6cfbd2024f 100644
--- a/locales/cs-CZ.yml
+++ b/locales/cs-CZ.yml
@@ -1109,6 +1109,7 @@ postForm: "Formulář pro odeslání"
information: "Informace"
inMinutes: "Minut"
inDays: "Dnů"
+widgets: "Widgety"
_chat:
invitations: "Pozvat"
noHistory: "Žádná historie"
diff --git a/locales/de-DE.yml b/locales/de-DE.yml
index ba74564fc3..da19768bee 100644
--- a/locales/de-DE.yml
+++ b/locales/de-DE.yml
@@ -1370,6 +1370,7 @@ defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe"
defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bildqualität, erhöht aber die Dateigröße.
Höhere Werte reduzieren die Dateigröße, verringern aber die Bildqualität."
inMinutes: "Minute(n)"
inDays: "Tag(en)"
+widgets: "Widgets"
_order:
newest: "Neueste zuerst"
oldest: "Älteste zuerst"
diff --git a/locales/el-GR.yml b/locales/el-GR.yml
index 5fc2bd7221..a4874fb156 100644
--- a/locales/el-GR.yml
+++ b/locales/el-GR.yml
@@ -288,6 +288,7 @@ replies: "Απάντηση"
renotes: "Κοινοποίηση σημειώματος"
postForm: "Φόρμα δημοσίευσης"
information: "Πληροφορίες"
+widgets: "Μαραφέτια"
_chat:
members: "Μέλη"
home: "Κεντρικό"
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 049ad54d82..7abec196c4 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -334,6 +334,7 @@ fileName: "Filename"
selectFile: "Select a file"
selectFiles: "Select files"
selectFolder: "Select a folder"
+unselectFolder: "Deselect folder"
selectFolders: "Select folders"
fileNotSelected: "No file selected"
renameFile: "Rename file"
@@ -346,6 +347,7 @@ addFile: "Add a file"
showFile: "Show files"
emptyDrive: "Your Drive is empty"
emptyFolder: "This folder is empty"
+dropHereToUpload: "Drop files here to upload"
unableToDelete: "Unable to delete"
inputNewFileName: "Enter a new filename"
inputNewDescription: "Enter new alt text"
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "Scheduled to note on {x}"
scheduledToPostOnX: "Note is scheduled for {x}"
schedule: "Schedule"
scheduled: "Scheduled"
+widgets: "Widgets"
+deviceInfo: "Device information"
+deviceInfoDescription: "When making technical inquiries, including the following information may help resolve the issue."
_compression:
_quality:
high: "High quality"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "Manage avatar decorations"
driveCapacity: "Drive capacity"
maxFileSize: "Upload-able max file size"
+ maxFileSize_caption: "Reverse proxies, CDNs, and other front-end components may have their own configuration settings."
alwaysMarkNsfw: "Always mark files as NSFW"
canUpdateBioMedia: "Can edit an icon or a banner image"
pinMax: "Maximum number of pinned notes"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "Operate as the following user"
pleaseLogin: "Please log in to authorize applications."
byClickingYouWillBeRedirectedToThisUrl: "When access is granted, you will automatically be redirected to the following URL"
+ alreadyAuthorized: "This application already has access permission."
_antennaSources:
all: "All notes"
homeTimeline: "Notes from followed users"
@@ -2697,6 +2704,8 @@ _notification:
quote: "Quotes"
reaction: "Reactions"
pollEnded: "Polls ending"
+ scheduledNotePosted: "Scheduled note was successful"
+ scheduledNotePostFailed: "Scheduled note failed"
receiveFollowRequest: "Received follow requests"
followRequestAccepted: "Accepted follow requests"
roleAssigned: "Role given"
diff --git a/locales/es-ES.yml b/locales/es-ES.yml
index 5ba924c78a..f00c571d6e 100644
--- a/locales/es-ES.yml
+++ b/locales/es-ES.yml
@@ -334,6 +334,7 @@ fileName: "Nombre de archivo"
selectFile: "Elegir archivo"
selectFiles: "Elegir archivos"
selectFolder: "Seleccione una carpeta"
+unselectFolder: "Deseleccionar carpeta"
selectFolders: "Seleccione carpetas"
fileNotSelected: "Archivo no seleccionado."
renameFile: "Renombrar archivo"
@@ -346,6 +347,7 @@ addFile: "Agregar archivo"
showFile: "Examinar archivos"
emptyDrive: "El drive está vacío"
emptyFolder: "La carpeta está vacía"
+dropHereToUpload: "Arrastra los archivos aquí para subirlos."
unableToDelete: "No se puede borrar"
inputNewFileName: "Ingrese un nuevo nombre de archivo"
inputNewDescription: "Ingrese nueva descripción"
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "Programar una nota para {x}"
scheduledToPostOnX: "La nota está programada para {x}."
schedule: "Programado"
scheduled: "Programado"
+widgets: "Widgets"
+deviceInfo: "Información del dispositivo"
+deviceInfoDescription: "Al realizar consultas técnicas, incluir la siguiente información puede ayudar a resolver el problema."
_compression:
_quality:
high: "Calidad alta"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "Administrar decoraciones de avatar"
driveCapacity: "Capacidad del drive"
maxFileSize: "Tamaño máximo de archivo que se puede cargar."
+ maxFileSize_caption: "Los proxies inversos o las CDN pueden tener diferentes valores de configuración aguas arriba."
alwaysMarkNsfw: "Siempre marcar archivos como NSFW"
canUpdateBioMedia: "Puede editar un icono o una imagen de fondo (banner)"
pinMax: "Máximo de notas fijadas"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "Operar como el siguiente usuario"
pleaseLogin: "Se requiere un inicio de sesión para darle permisos a la aplicación"
byClickingYouWillBeRedirectedToThisUrl: "Cuando el acceso es concedido, serás automáticamente redireccionado a la siguiente URL"
+ alreadyAuthorized: "Esta aplicación ya ha obtenido acceso."
_antennaSources:
all: "Todas las notas"
homeTimeline: "Notas de los usuarios que sigues"
@@ -2697,6 +2704,8 @@ _notification:
quote: "Citar"
reaction: "Reacción"
pollEnded: "La encuesta terminó"
+ scheduledNotePosted: "Publicación programada con éxito"
+ scheduledNotePostFailed: "Publicación programada fallida"
receiveFollowRequest: "Recibió una solicitud de seguimiento"
followRequestAccepted: "El seguimiento fue aceptado"
roleAssigned: "Rol asignado"
diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml
index 23c7ba97bb..a274327691 100644
--- a/locales/fr-FR.yml
+++ b/locales/fr-FR.yml
@@ -1273,6 +1273,7 @@ postForm: "Formulaire de publication"
information: "Informations"
inMinutes: "min"
inDays: "j"
+widgets: "Widgets"
_chat:
invitations: "Inviter"
noHistory: "Pas d'historique"
diff --git a/locales/id-ID.yml b/locales/id-ID.yml
index abb0720c6b..21c77cad58 100644
--- a/locales/id-ID.yml
+++ b/locales/id-ID.yml
@@ -1264,6 +1264,7 @@ postForm: "Buat catatan"
information: "Informasi"
inMinutes: "menit"
inDays: "hari"
+widgets: "Widget"
_chat:
invitations: "Undang"
noHistory: "Tidak ada riwayat"
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 9e51d89760..6f36cba861 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -1354,6 +1354,10 @@ export interface Locale extends ILocale {
* フォルダーを選択
*/
"selectFolder": string;
+ /**
+ * フォルダーの選択を解除
+ */
+ "unselectFolder": string;
/**
* フォルダーを選択
*/
@@ -1402,6 +1406,10 @@ export interface Locale extends ILocale {
* フォルダーは空です
*/
"emptyFolder": string;
+ /**
+ * ここにファイルをドロップしてアップロード
+ */
+ "dropHereToUpload": string;
/**
* 削除できません
*/
@@ -5581,6 +5589,14 @@ export interface Locale extends ILocale {
* ウィジェット
*/
"widgets": string;
+ /**
+ * デバイス情報
+ */
+ "deviceInfo": string;
+ /**
+ * 技術的なお問い合わせの際に、以下の情報を併記すると問題の解決に役立つことがあります。
+ */
+ "deviceInfoDescription": string;
"_compression": {
"_quality": {
/**
@@ -7853,6 +7869,10 @@ export interface Locale extends ILocale {
* アップロード可能な最大ファイルサイズ
*/
"maxFileSize": string;
+ /**
+ * リバースプロキシやCDNなど、前段で別の設定値が存在する場合があります。
+ */
+ "maxFileSize_caption": string;
/**
* ファイルにNSFWを常に付与
*/
@@ -9460,6 +9480,10 @@ export interface Locale extends ILocale {
* アクセスを許可すると、自動で以下のURLに遷移します
*/
"byClickingYouWillBeRedirectedToThisUrl": string;
+ /**
+ * このアプリケーションは既にアクセスが許可されています。
+ */
+ "alreadyAuthorized": string;
};
"_antennaSources": {
/**
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index 8fa481afe8..7245bea88e 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -334,6 +334,7 @@ fileName: "Nome dell'allegato"
selectFile: "Scelta allegato"
selectFiles: "Scelta allegato"
selectFolder: "Seleziona cartella"
+unselectFolder: "Deseleziona la cartella"
selectFolders: "Seleziona cartella"
fileNotSelected: "Nessun file selezionato"
renameFile: "Rinomina file"
@@ -346,6 +347,7 @@ addFile: "Allega"
showFile: "Visualizza file"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
+dropHereToUpload: "Trascina qui il tuo file per caricarlo"
unableToDelete: "Eliminazione impossibile"
inputNewFileName: "Inserisci nome del nuovo file"
inputNewDescription: "Inserisci una nuova descrizione"
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "Pianificare la pubblicazione {x}"
scheduledToPostOnX: "Pubblicazione pianificata {x}"
schedule: "Pianificare"
scheduled: "Pianificata"
+widgets: "Riquadri"
+deviceInfo: "Informazioni sul dispositivo"
+deviceInfoDescription: "Se ci contatti per ricevere supporto tecnico, ti preghiamo di includere le seguenti informazioni per aiutarci a risolvere il tuo problema."
_compression:
_quality:
high: "Alta qualità"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "Gestisce le decorazioni di immagini del profilo"
driveCapacity: "Capienza del Drive"
maxFileSize: "Dimensione massima del file caricabile"
+ maxFileSize_caption: "Potrebbero esserci altre impostazioni nella fase precedente, come reverse proxy o CDN."
alwaysMarkNsfw: "Impostare sempre come esplicito (NSFW)"
canUpdateBioMedia: "Può aggiornare foto profilo e di testata"
pinMax: "Quantità massima di Note in primo piano"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "Sto funzionando per il seguente profilo"
pleaseLogin: "Per favore accedi al tuo account per cambiare i permessi dell'applicazione"
byClickingYouWillBeRedirectedToThisUrl: "Consentendo l'accesso, si verrà reindirizzati presso questo indirizzo URL"
+ alreadyAuthorized: "Questa applicazione è già autorizzata ad accedere."
_antennaSources:
all: "Tutte le note"
homeTimeline: "Note dai tuoi Following"
@@ -2697,6 +2704,8 @@ _notification:
quote: "Cita"
reaction: "Reazioni"
pollEnded: "Sondaggio terminato"
+ scheduledNotePosted: "Nota pianificata correttamente"
+ scheduledNotePostFailed: "La pianificazione della Nota è fallita"
receiveFollowRequest: "Richieste di follow in arrivo"
followRequestAccepted: "Richieste di follow accettate"
roleAssigned: "Ruolo concesso"
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index bfcc98243c..ec27da085f 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -334,6 +334,7 @@ fileName: "ファイル名"
selectFile: "ファイルを選択"
selectFiles: "ファイルを選択"
selectFolder: "フォルダーを選択"
+unselectFolder: "フォルダーの選択を解除"
selectFolders: "フォルダーを選択"
fileNotSelected: "ファイルが選択されていません"
renameFile: "ファイル名を変更"
@@ -346,6 +347,7 @@ addFile: "ファイルを追加"
showFile: "ファイルを表示"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
+dropHereToUpload: "ここにファイルをドロップしてアップロード"
unableToDelete: "削除できません"
inputNewFileName: "新しいファイル名を入力してください"
inputNewDescription: "新しいキャプションを入力してください"
@@ -1390,6 +1392,8 @@ scheduledToPostOnX: "{x}に投稿が予約されています"
schedule: "予約"
scheduled: "予約"
widgets: "ウィジェット"
+deviceInfo: "デバイス情報"
+deviceInfoDescription: "技術的なお問い合わせの際に、以下の情報を併記すると問題の解決に役立つことがあります。"
_compression:
_quality:
@@ -2036,6 +2040,7 @@ _role:
canManageAvatarDecorations: "アバターデコレーションの管理"
driveCapacity: "ドライブ容量"
maxFileSize: "アップロード可能な最大ファイルサイズ"
+ maxFileSize_caption: "リバースプロキシやCDNなど、前段で別の設定値が存在する場合があります。"
alwaysMarkNsfw: "ファイルにNSFWを常に付与"
canUpdateBioMedia: "アイコンとバナーの更新を許可"
pinMax: "ノートのピン留めの最大数"
@@ -2484,6 +2489,7 @@ _auth:
scopeUser: "以下のユーザーとして操作しています"
pleaseLogin: "アプリケーションにアクセス許可を与えるには、ログインが必要です。"
byClickingYouWillBeRedirectedToThisUrl: "アクセスを許可すると、自動で以下のURLに遷移します"
+ alreadyAuthorized: "このアプリケーションは既にアクセスが許可されています。"
_antennaSources:
all: "全てのノート"
diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml
index d781a14b85..a127a554ce 100644
--- a/locales/ja-KS.yml
+++ b/locales/ja-KS.yml
@@ -1337,6 +1337,7 @@ safeModeEnabled: "セーフモードがオンになってるで"
pluginsAreDisabledBecauseSafeMode: "セーフモードがオンやから、プラグインは全部無効化されてるで。"
customCssIsDisabledBecauseSafeMode: "セーフモードがオンやから、カスタムCSSは適用されてへんで。"
themeIsDefaultBecauseSafeMode: "セーフモードがオンの間はデフォルトのテーマを使うで。セーフモードをオフにれば元に戻るで。"
+widgets: "ウィジェット"
_chat:
noMessagesYet: "まだメッセージはあらへんで"
individualChat_description: "特定のユーザーと一対一でチャットができるで。"
diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml
index a29744bad8..77b6476107 100644
--- a/locales/ko-KR.yml
+++ b/locales/ko-KR.yml
@@ -334,6 +334,7 @@ fileName: "파일명"
selectFile: "파일 선택"
selectFiles: "파일 선택"
selectFolder: "폴더 선택"
+unselectFolder: "폴더 선택 해제"
selectFolders: "폴더 선택"
fileNotSelected: "파일을 선택하지 않았습니다"
renameFile: "파일 이름 변경"
@@ -346,6 +347,7 @@ addFile: "파일 추가"
showFile: "파일 표시하기"
emptyDrive: "드라이브가 비어 있습니다"
emptyFolder: "폴더가 비어 있습니다"
+dropHereToUpload: "업로드할 파일을 여기로 드롭하십시오"
unableToDelete: "삭제할 수 없습니다"
inputNewFileName: "바꿀 파일명을 입력해 주세요"
inputNewDescription: "새 캡션을 입력해 주세요"
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "{x}에 게시를 예약합니다."
scheduledToPostOnX: "{x}에 게시가 예약돼있습니다."
schedule: "예약"
scheduled: "예약"
+widgets: "위젯"
+deviceInfo: "장치 정보"
+deviceInfoDescription: "기술적 문의의 경우 아래의 정보를 병기하면 문제의 해결에 도움이 됩니다."
_compression:
_quality:
high: "고품질"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "아바타 꾸미기 관리"
driveCapacity: "드라이브 용량"
maxFileSize: "업로드 가능한 최대 파일 크기"
+ maxFileSize_caption: "리버스 프록시나 CDN 등 전단에서 다른 설정값이 존재하는 경우가 있습니다."
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용"
pinMax: "고정할 수 있는 노트 수"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "다음 유저로 활동하고 있습니다."
pleaseLogin: "어플리케이션의 접근을 허가하려면 로그인하십시오."
byClickingYouWillBeRedirectedToThisUrl: "접근을 허용하면 자동으로 다음 URL로 이동합니다."
+ alreadyAuthorized: "이 애플리케이션은 이미 접근이 허가돼있습니다."
_antennaSources:
all: "모든 노트"
homeTimeline: "팔로우중인 유저의 노트"
@@ -2697,6 +2704,8 @@ _notification:
quote: "인용"
reaction: "리액션"
pollEnded: "투표가 종료됨"
+ scheduledNotePosted: "예약 게시에 성공했습니다"
+ scheduledNotePostFailed: "예약 게시에 실패했습니다"
receiveFollowRequest: "팔로우 요청을 받았을 때"
followRequestAccepted: "팔로우 요청이 승인되었을 때"
roleAssigned: "역할이 부여됨"
diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml
index 40f7aad9fa..82b0f3aae6 100644
--- a/locales/pl-PL.yml
+++ b/locales/pl-PL.yml
@@ -1042,6 +1042,7 @@ postForm: "Formularz tworzenia wpisu"
information: "Informacje"
inMinutes: "minuta"
inDays: "dzień"
+widgets: "Widżety"
_chat:
invitations: "Zaproś"
noHistory: "Brak historii"
diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml
index 0c365068e6..1f14dfb456 100644
--- a/locales/pt-PT.yml
+++ b/locales/pt-PT.yml
@@ -1389,6 +1389,7 @@ scheduleToPostOnX: "Agendar nota para {x}"
scheduledToPostOnX: "A nota está agendada para {x}"
schedule: "Agendar"
scheduled: "Agendado"
+widgets: "Widgets"
_compression:
_quality:
high: "Qualidade alta"
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index 27fc425e3d..8c5698be46 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -1277,6 +1277,7 @@ textCount: "Количество символов"
information: "Описание"
inMinutes: "мин"
inDays: "сут"
+widgets: "Виджеты"
_chat:
invitations: "Пригласить"
noHistory: "История пока пуста"
diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml
index 2b86826703..acac094054 100644
--- a/locales/sk-SK.yml
+++ b/locales/sk-SK.yml
@@ -915,6 +915,7 @@ postForm: "Napísať poznámku"
information: "Informácie"
inMinutes: "min"
inDays: "dní"
+widgets: "Widgety"
_chat:
invitations: "Pozvať"
noHistory: "Žiadna história"
diff --git a/locales/th-TH.yml b/locales/th-TH.yml
index b945decbab..61f367cc1c 100644
--- a/locales/th-TH.yml
+++ b/locales/th-TH.yml
@@ -1389,6 +1389,7 @@ scheduleToPostOnX: "กำหนดเวลาให้โพสต์ไว้
scheduledToPostOnX: "มีการกำหนดเวลาให้โพสต์ไว้ที่ {x}"
schedule: "กำหนดเวลา"
scheduled: "กำหนดเวลา"
+widgets: "วิดเจ็ต"
_compression:
_quality:
high: "คุณภาพสูง"
diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml
index f73ebafa89..9ed6960a57 100644
--- a/locales/tr-TR.yml
+++ b/locales/tr-TR.yml
@@ -1378,6 +1378,7 @@ pluginsAreDisabledBecauseSafeMode: "Güvenli mod etkinleştirildiği için tüm
customCssIsDisabledBecauseSafeMode: "Güvenli mod etkin olduğu için özel CSS uygulanmıyor."
themeIsDefaultBecauseSafeMode: "Güvenli mod etkinken, varsayılan tema kullanılır. Güvenli modu devre dışı bırakmak bu değişiklikleri geri alır."
thankYouForTestingBeta: "Beta sürümünü test ettiğin için teşekkür ederiz!"
+widgets: "Widget'lar"
_order:
newest: "Önce yeni"
oldest: "Önce eski"
diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml
index e33eff637c..08835398e7 100644
--- a/locales/uk-UA.yml
+++ b/locales/uk-UA.yml
@@ -921,6 +921,7 @@ postForm: "Створення нотатки"
information: "Інформація"
inMinutes: "х"
inDays: "д"
+widgets: "Віджети"
_chat:
invitations: "Запросити"
noHistory: "Історія порожня"
diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml
index 639cf92954..f1e5993c48 100644
--- a/locales/vi-VN.yml
+++ b/locales/vi-VN.yml
@@ -1222,6 +1222,7 @@ migrateOldSettings: "Di chuyển cài đặt cũ"
migrateOldSettings_description: "Thông thường, quá trình này diễn ra tự động, nhưng nếu vì lý do nào đó mà quá trình di chuyển không thành công, bạn có thể kích hoạt thủ công quy trình di chuyển, quá trình này sẽ ghi đè lên thông tin cấu hình hiện tại của bạn."
inMinutes: "phút"
inDays: "ngày"
+widgets: "Tiện ích"
_chat:
invitations: "Mời"
noHistory: "Không có dữ liệu"
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index bf59023952..a60aee5f97 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -56,7 +56,7 @@ deleteAndEdit: "删除并编辑"
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。"
addToList: "添加至列表"
addToAntenna: "添加到天线"
-sendMessage: "发送"
+sendMessage: "发送消息"
copyRSS: "复制RSS"
copyUsername: "复制用户名"
copyUserId: "复制用户 ID"
@@ -334,6 +334,7 @@ fileName: "文件名称"
selectFile: "选择文件"
selectFiles: "选择文件"
selectFolder: "选择文件夹"
+unselectFolder: "取消全选文件夹"
selectFolders: "选择多个文件夹"
fileNotSelected: "未选择文件"
renameFile: "重命名文件"
@@ -346,6 +347,7 @@ addFile: "添加文件"
showFile: "显示文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
+dropHereToUpload: "将文件拖动到这里来上传"
unableToDelete: "无法删除"
inputNewFileName: "请输入新文件名"
inputNewDescription: "请输入新标题"
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "预定在 {x} 发出"
scheduledToPostOnX: "已预定在 {x} 发出"
schedule: "定时"
scheduled: "定时"
+widgets: "小工具"
+deviceInfo: "设备信息"
+deviceInfoDescription: "咨询技术问题时,将以下信息一并发送有助于解决问题。"
_compression:
_quality:
high: "高质量"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "管理头像挂件"
driveCapacity: "网盘容量"
maxFileSize: "可上传的最大文件大小"
+ maxFileSize_caption: "可能在反向代理或 CDN 等前端存在其它设定值。"
alwaysMarkNsfw: "总是将文件标记为 NSFW"
canUpdateBioMedia: "可以更新头像和横幅"
pinMax: "帖子置顶数量限制"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "以下面的用户进行操作"
pleaseLogin: "在对应用进行授权许可之前,请先登录"
byClickingYouWillBeRedirectedToThisUrl: "允许访问后将会自动重定向到以下 URL"
+ alreadyAuthorized: "此应用已有访问许可。"
_antennaSources:
all: "所有帖子"
homeTimeline: "已关注用户的帖子"
@@ -2697,6 +2704,8 @@ _notification:
quote: "引用"
reaction: "回应"
pollEnded: "问卷调查结束"
+ scheduledNotePosted: "定时发送成功"
+ scheduledNotePostFailed: "定时发送失败"
receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index 6f67be9741..cd4b91ec04 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -334,6 +334,7 @@ fileName: "檔案名稱"
selectFile: "選擇檔案"
selectFiles: "選擇檔案"
selectFolder: "選擇資料夾"
+unselectFolder: "取消選擇資料夾"
selectFolders: "選擇資料夾"
fileNotSelected: "尚未選擇檔案"
renameFile: "重新命名檔案"
@@ -346,6 +347,7 @@ addFile: "加入附件"
showFile: "瀏覽文件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
+dropHereToUpload: "將檔案拖放至此處即可上傳"
unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題 "
@@ -1389,6 +1391,9 @@ scheduleToPostOnX: "排定在 {x} 發布"
scheduledToPostOnX: "已排定在 {x} 發布貼文"
schedule: "排定"
scheduled: "排定"
+widgets: "小工具"
+deviceInfo: "硬體資訊"
+deviceInfoDescription: "在提出技術性諮詢時,若能同時提供以下資訊,將有助於解決問題。"
_compression:
_quality:
high: "高品質"
@@ -2013,6 +2018,7 @@ _role:
canManageAvatarDecorations: "管理頭像裝飾"
driveCapacity: "雲端硬碟容量"
maxFileSize: "可上傳的最大檔案大小"
+ maxFileSize_caption: "前端可能還有其他設定值,例如反向代理或 CDN。"
alwaysMarkNsfw: "總是將檔案標記為NSFW"
canUpdateBioMedia: "允許更新大頭貼和橫幅"
pinMax: "置頂貼文的最大數量"
@@ -2431,6 +2437,7 @@ _auth:
scopeUser: "以下列使用者身分操作"
pleaseLogin: "必須登入以提供應用程式的存取權限。"
byClickingYouWillBeRedirectedToThisUrl: "如果授予存取權限,就會自動導向到以下的網址"
+ alreadyAuthorized: "此應用程式已被授予存取權限。"
_antennaSources:
all: "全部貼文"
homeTimeline: "來自已追隨使用者的貼文"
@@ -2697,6 +2704,8 @@ _notification:
quote: "引用"
reaction: "反應"
pollEnded: "問卷調查結束"
+ scheduledNotePosted: "預約發佈成功"
+ scheduledNotePostFailed: "預約發佈失敗"
receiveFollowRequest: "已收到追隨請求"
followRequestAccepted: "追隨請求已接受"
roleAssigned: "已授予角色"
diff --git a/package.json b/package.json
index 35409312d2..2f3ea08c68 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "misskey",
- "version": "2025.10.0-beta.1",
+ "version": "2025.10.1-alpha.1",
"codename": "nasubi",
"repository": {
"type": "git",
@@ -58,21 +58,21 @@
"execa": "9.6.0",
"fast-glob": "3.3.3",
"glob": "11.0.3",
- "ignore-walk": "7.0.0",
+ "ignore-walk": "8.0.0",
"js-yaml": "4.1.0",
"postcss": "8.5.6",
"tar": "7.5.1",
"terser": "5.44.0",
- "typescript": "5.9.2"
+ "typescript": "5.9.3"
},
"devDependencies": {
"@misskey-dev/eslint-plugin": "2.1.0",
"@types/js-yaml": "4.0.9",
- "@types/node": "22.18.6",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
- "cross-env": "7.0.3",
- "cypress": "14.5.4",
+ "@types/node": "22.18.8",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
+ "cross-env": "10.1.0",
+ "cypress": "15.3.0",
"eslint": "9.36.0",
"globals": "16.4.0",
"ncp": "2.0.0",
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 07a80abc0f..8fe04a45dd 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -39,17 +39,17 @@
},
"optionalDependencies": {
"@swc/core-android-arm64": "1.3.11",
- "@swc/core-darwin-arm64": "1.13.19",
- "@swc/core-darwin-x64": "1.13.19",
+ "@swc/core-darwin-arm64": "1.13.20",
+ "@swc/core-darwin-x64": "1.13.20",
"@swc/core-freebsd-x64": "1.3.11",
- "@swc/core-linux-arm-gnueabihf": "1.13.19",
- "@swc/core-linux-arm64-gnu": "1.13.19",
- "@swc/core-linux-arm64-musl": "1.13.19",
- "@swc/core-linux-x64-gnu": "1.13.19",
- "@swc/core-linux-x64-musl": "1.13.19",
- "@swc/core-win32-arm64-msvc": "1.13.19",
- "@swc/core-win32-ia32-msvc": "1.13.19",
- "@swc/core-win32-x64-msvc": "1.13.19",
+ "@swc/core-linux-arm-gnueabihf": "1.13.20",
+ "@swc/core-linux-arm64-gnu": "1.13.20",
+ "@swc/core-linux-arm64-musl": "1.13.20",
+ "@swc/core-linux-x64-gnu": "1.13.20",
+ "@swc/core-linux-x64-musl": "1.13.20",
+ "@swc/core-win32-arm64-msvc": "1.13.20",
+ "@swc/core-win32-ia32-msvc": "1.13.20",
+ "@swc/core-win32-x64-msvc": "1.13.20",
"@tensorflow/tfjs": "4.22.0",
"@tensorflow/tfjs-node": "4.22.0",
"bufferutil": "4.0.9",
@@ -69,10 +69,10 @@
"utf-8-validate": "6.0.5"
},
"dependencies": {
- "@aws-sdk/client-s3": "3.896.0",
- "@aws-sdk/lib-storage": "3.895.0",
+ "@aws-sdk/client-s3": "3.901.0",
+ "@aws-sdk/lib-storage": "3.901.0",
"@discordapp/twemoji": "16.0.1",
- "@fastify/accepts": "5.0.2",
+ "@fastify/accepts": "5.0.3",
"@fastify/cookie": "11.0.2",
"@fastify/cors": "10.1.0",
"@fastify/express": "4.0.2",
@@ -81,7 +81,7 @@
"@fastify/static": "8.2.0",
"@fastify/view": "10.0.2",
"@misskey-dev/sharp-read-bmp": "1.2.0",
- "@misskey-dev/summaly": "5.2.3",
+ "@misskey-dev/summaly": "5.2.4",
"@napi-rs/canvas": "0.1.80",
"@nestjs/common": "11.1.6",
"@nestjs/core": "11.1.6",
@@ -103,7 +103,7 @@
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
"body-parser": "1.20.3",
- "bullmq": "5.58.8",
+ "bullmq": "5.59.0",
"cacheable-lookup": "7.0.0",
"cbor": "9.0.2",
"chalk": "5.6.2",
@@ -134,7 +134,7 @@
"json5": "2.2.3",
"jsonld": "8.3.3",
"jsrsasign": "11.1.0",
- "juice": "11.0.1",
+ "juice": "11.0.3",
"meilisearch": "0.53.0",
"mfm-js": "0.25.0",
"microformats-parser": "2.0.4",
@@ -181,7 +181,7 @@
"tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0",
"typeorm": "0.3.27",
- "typescript": "5.9.2",
+ "typescript": "5.9.3",
"ulid": "2.4.0",
"vary": "1.1.2",
"web-push": "3.6.7",
@@ -210,8 +210,8 @@
"@types/jsrsasign": "10.5.15",
"@types/mime-types": "2.1.4",
"@types/ms": "0.7.34",
- "@types/node": "22.18.6",
- "@types/nodemailer": "6.4.19",
+ "@types/node": "22.18.8",
+ "@types/nodemailer": "6.4.20",
"@types/oauth": "0.9.6",
"@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2",
@@ -231,8 +231,8 @@
"@types/vary": "1.1.3",
"@types/web-push": "3.6.4",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
"aws-sdk-client-mock": "4.1.0",
"cross-env": "7.0.3",
"eslint-plugin-import": "2.32.0",
diff --git a/packages/backend/src/core/NoteDraftService.ts b/packages/backend/src/core/NoteDraftService.ts
index 7666407c1e..a346ff7618 100644
--- a/packages/backend/src/core/NoteDraftService.ts
+++ b/packages/backend/src/core/NoteDraftService.ts
@@ -172,6 +172,14 @@ export class NoteDraftService {
me: MiLocalUser,
data: Partial,
): Promise {
+ if (data.isActuallyScheduled) {
+ if (data.scheduledAt == null) {
+ throw new IdentifiableError('94a89a43-3591-400a-9c17-dd166e71fdfa', 'scheduledAt is required when isActuallyScheduled is true');
+ } else if (data.scheduledAt.getTime() < Date.now()) {
+ throw new IdentifiableError('b34d0c1b-996f-4e34-a428-c636d98df457', 'scheduledAt must be in the future');
+ }
+ }
+
if (data.pollExpiresAt != null) {
if (data.pollExpiresAt.getTime() < Date.now()) {
throw new IdentifiableError('04da457d-b083-4055-9082-955525eda5a5', 'Cannot create expired poll');
@@ -320,6 +328,7 @@ export class NoteDraftService {
@bindThis
public async clearSchedule(draftId: MiNoteDraft['id']): Promise {
+ // TODO: 線形探索なのをどうにかする
const jobs = await this.queueService.postScheduledNoteQueue.getJobs(['delayed', 'waiting', 'active']);
for (const job of jobs) {
if (job.data.noteDraftId === draftId) {
diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts
index 6e4ac66e81..f2f7480dfa 100644
--- a/packages/backend/src/core/RoleService.ts
+++ b/packages/backend/src/core/RoleService.ts
@@ -109,8 +109,7 @@ export const DEFAULT_POLICIES: RolePolicies = {
canImportUserLists: false,
chatAvailability: 'available',
uploadableFileTypes: [
- 'text/plain',
- 'text/csv',
+ 'text/*',
'application/json',
'image/*',
'video/*',
diff --git a/packages/backend/src/models/NoteDraft.ts b/packages/backend/src/models/NoteDraft.ts
index 0ece02c943..f078e8c21b 100644
--- a/packages/backend/src/models/NoteDraft.ts
+++ b/packages/backend/src/models/NoteDraft.ts
@@ -153,11 +153,14 @@ export class MiNoteDraft {
//#endregion
+ // 予約日時
+ // これがあるだけでは実際に予約されているかどうかはわからない
@Column('timestamp with time zone', {
nullable: true,
})
public scheduledAt: Date | null;
+ // scheduledAtに基づいて実際にスケジュールされているか
@Column('boolean', {
default: false,
})
diff --git a/packages/backend/src/server/api/endpoints/notes/drafts/create.ts b/packages/backend/src/server/api/endpoints/notes/drafts/create.ts
index 8f2fbf9197..880f4964a1 100644
--- a/packages/backend/src/server/api/endpoints/notes/drafts/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/drafts/create.ts
@@ -192,7 +192,7 @@ export const paramDef = {
scheduledAt: { type: 'integer', nullable: true },
isActuallyScheduled: { type: 'boolean', default: false },
},
- required: ['visibility', 'visibleUserIds', 'cw', 'hashtag', 'localOnly', 'reactionAcceptance', 'replyId', 'renoteId', 'channelId', 'text', 'fileIds', 'poll', 'scheduledAt', 'isActuallyScheduled'],
+ required: [],
} as const;
@Injectable()
@@ -203,22 +203,22 @@ export default class extends Endpoint { // eslint-
) {
super(meta, paramDef, async (ps, me) => {
const draft = await this.noteDraftService.create(me, {
- fileIds: ps.fileIds,
+ fileIds: ps.fileIds ?? [],
pollChoices: ps.poll?.choices ?? [],
pollMultiple: ps.poll?.multiple ?? false,
pollExpiresAt: ps.poll?.expiresAt ? new Date(ps.poll.expiresAt) : null,
pollExpiredAfter: ps.poll?.expiredAfter ?? null,
hasPoll: ps.poll != null,
- text: ps.text,
- replyId: ps.replyId,
- renoteId: ps.renoteId,
- cw: ps.cw,
- hashtag: ps.hashtag,
+ text: ps.text ?? null,
+ replyId: ps.replyId ?? null,
+ renoteId: ps.renoteId ?? null,
+ cw: ps.cw ?? null,
+ hashtag: ps.hashtag ?? null,
localOnly: ps.localOnly,
reactionAcceptance: ps.reactionAcceptance,
visibility: ps.visibility,
- visibleUserIds: ps.visibleUserIds,
- channelId: ps.channelId,
+ visibleUserIds: ps.visibleUserIds ?? [],
+ channelId: ps.channelId ?? null,
scheduledAt: ps.scheduledAt ? new Date(ps.scheduledAt) : null,
isActuallyScheduled: ps.isActuallyScheduled,
}).catch((err) => {
diff --git a/packages/frontend-builder/package.json b/packages/frontend-builder/package.json
index bdaf0d4027..3300a5ff28 100644
--- a/packages/frontend-builder/package.json
+++ b/packages/frontend-builder/package.json
@@ -11,11 +11,11 @@
},
"devDependencies": {
"@types/estree": "1.0.8",
- "@types/node": "22.18.6",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
- "rollup": "4.52.2",
- "typescript": "5.9.2"
+ "@types/node": "22.18.8",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
+ "rollup": "4.52.3",
+ "typescript": "5.9.3"
},
"dependencies": {
"estree-walker": "3.0.3",
diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json
index cd5e5071a6..26557934dd 100644
--- a/packages/frontend-embed/package.json
+++ b/packages/frontend-embed/package.json
@@ -26,37 +26,37 @@
"mfm-js": "0.25.0",
"misskey-js": "workspace:*",
"punycode.js": "2.3.1",
- "rollup": "4.52.2",
+ "rollup": "4.52.3",
"sass": "1.93.2",
"shiki": "3.13.0",
"tinycolor2": "1.6.0",
"tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0",
- "typescript": "5.9.2",
- "uuid": "11.1.0",
+ "typescript": "5.9.3",
+ "uuid": "13.0.0",
"vite": "7.1.7",
"vue": "3.5.22"
},
"devDependencies": {
- "@misskey-dev/summaly": "5.2.3",
+ "@misskey-dev/summaly": "5.2.4",
"@tabler/icons-webfont": "3.35.0",
"@testing-library/vue": "8.1.0",
"@types/estree": "1.0.8",
"@types/micromatch": "4.0.9",
- "@types/node": "22.18.6",
+ "@types/node": "22.18.8",
"@types/punycode.js": "npm:@types/punycode@2.1.4",
"@types/tinycolor2": "1.4.6",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
"@vitest/coverage-v8": "3.2.4",
"@vue/runtime-core": "3.5.22",
"acorn": "8.15.0",
- "cross-env": "10.0.0",
+ "cross-env": "10.1.0",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-vue": "10.5.0",
"fast-glob": "3.3.3",
- "happy-dom": "18.0.1",
+ "happy-dom": "19.0.2",
"intersection-observer": "0.12.2",
"micromatch": "4.0.8",
"msw": "2.11.3",
@@ -65,8 +65,8 @@
"start-server-and-test": "2.1.2",
"tsx": "4.20.6",
"vite-plugin-turbosnap": "1.0.3",
- "vue-component-type-helpers": "3.0.8",
+ "vue-component-type-helpers": "3.1.0",
"vue-eslint-parser": "10.2.0",
- "vue-tsc": "3.0.8"
+ "vue-tsc": "3.1.0"
}
}
diff --git a/packages/frontend-shared/package.json b/packages/frontend-shared/package.json
index 46f39496b1..8f5397a6b8 100644
--- a/packages/frontend-shared/package.json
+++ b/packages/frontend-shared/package.json
@@ -21,13 +21,13 @@
"lint": "pnpm typecheck && pnpm eslint"
},
"devDependencies": {
- "@types/node": "22.18.6",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
+ "@types/node": "22.18.8",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
"esbuild": "0.25.10",
"eslint-plugin-vue": "10.5.0",
"nodemon": "3.1.10",
- "typescript": "5.9.2",
+ "typescript": "5.9.3",
"vue-eslint-parser": "10.2.0"
},
"files": [
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index 0200269fcd..20842bc450 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -24,7 +24,7 @@
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "6.0.2",
"@rollup/pluginutils": "5.3.0",
- "@sentry/vue": "10.15.0",
+ "@sentry/vue": "10.17.0",
"@syuilo/aiscript": "1.1.2",
"@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0",
"@twemoji/parser": "16.0.0",
@@ -41,7 +41,7 @@
"chartjs-chart-matrix": "3.0.0",
"chartjs-plugin-gradient": "0.6.1",
"chartjs-plugin-zoom": "2.2.0",
- "chromatic": "13.2.1",
+ "chromatic": "13.3.0",
"compare-versions": "6.1.1",
"cropperjs": "2.0.1",
"date-fns": "4.1.0",
@@ -57,7 +57,7 @@
"json5": "2.2.3",
"magic-string": "0.30.19",
"matter-js": "0.20.0",
- "mediabunny": "1.21.0",
+ "mediabunny": "1.21.1",
"mfm-js": "0.25.0",
"misskey-bubble-game": "workspace:*",
"misskey-js": "workspace:*",
@@ -66,7 +66,7 @@
"punycode.js": "2.3.1",
"qr-code-styling": "1.9.2",
"qr-scanner": "1.4.2",
- "rollup": "4.52.2",
+ "rollup": "4.52.3",
"sanitize-html": "2.17.0",
"sass": "1.93.2",
"shiki": "3.13.0",
@@ -77,7 +77,7 @@
"tinycolor2": "1.6.0",
"tsc-alias": "1.8.16",
"tsconfig-paths": "4.2.0",
- "typescript": "5.9.2",
+ "typescript": "5.9.3",
"v-code-diff": "1.13.1",
"vite": "7.1.7",
"vue": "3.5.22",
@@ -85,10 +85,10 @@
"wanakana": "5.3.1"
},
"devDependencies": {
- "@misskey-dev/summaly": "5.2.3",
+ "@misskey-dev/summaly": "5.2.4",
"@storybook/addon-essentials": "8.6.14",
"@storybook/addon-interactions": "8.6.14",
- "@storybook/addon-links": "9.1.8",
+ "@storybook/addon-links": "9.1.10",
"@storybook/addon-mdx-gfm": "8.6.14",
"@storybook/addon-storysource": "8.6.14",
"@storybook/blocks": "8.6.14",
@@ -96,38 +96,38 @@
"@storybook/core-events": "8.6.14",
"@storybook/manager-api": "8.6.14",
"@storybook/preview-api": "8.6.14",
- "@storybook/react": "9.1.8",
- "@storybook/react-vite": "9.1.8",
+ "@storybook/react": "9.1.10",
+ "@storybook/react-vite": "9.1.10",
"@storybook/test": "8.6.14",
"@storybook/theming": "8.6.14",
"@storybook/types": "8.6.14",
- "@storybook/vue3": "9.1.8",
- "@storybook/vue3-vite": "9.1.8",
+ "@storybook/vue3": "9.1.10",
+ "@storybook/vue3-vite": "9.1.10",
"@tabler/icons-webfont": "3.35.0",
"@testing-library/vue": "8.1.0",
"@types/canvas-confetti": "1.9.0",
"@types/estree": "1.0.8",
"@types/matter-js": "0.20.2",
"@types/micromatch": "4.0.9",
- "@types/node": "22.18.6",
+ "@types/node": "22.18.8",
"@types/punycode.js": "npm:@types/punycode@2.1.4",
"@types/sanitize-html": "2.16.0",
"@types/seedrandom": "3.0.8",
"@types/throttle-debounce": "5.0.2",
"@types/tinycolor2": "1.4.6",
"@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.44.1",
- "@typescript-eslint/parser": "8.44.1",
+ "@typescript-eslint/eslint-plugin": "8.45.0",
+ "@typescript-eslint/parser": "8.45.0",
"@vitest/coverage-v8": "3.2.4",
"@vue/compiler-core": "3.5.22",
"@vue/runtime-core": "3.5.22",
"acorn": "8.15.0",
- "cross-env": "10.0.0",
- "cypress": "14.5.4",
+ "cross-env": "10.1.0",
+ "cypress": "15.3.0",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-vue": "10.5.0",
"fast-glob": "3.3.3",
- "happy-dom": "18.0.1",
+ "happy-dom": "19.0.2",
"intersection-observer": "0.12.2",
"micromatch": "4.0.8",
"minimatch": "10.0.3",
@@ -135,18 +135,18 @@
"msw-storybook-addon": "2.0.5",
"nodemon": "3.1.10",
"prettier": "3.6.2",
- "react": "19.1.1",
- "react-dom": "19.1.1",
+ "react": "19.2.0",
+ "react-dom": "19.2.0",
"seedrandom": "3.0.5",
"start-server-and-test": "2.1.2",
- "storybook": "9.1.8",
+ "storybook": "9.1.10",
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
"tsx": "4.20.6",
"vite-plugin-turbosnap": "1.0.3",
"vitest": "3.2.4",
"vitest-fetch-mock": "0.4.5",
- "vue-component-type-helpers": "3.0.8",
+ "vue-component-type-helpers": "3.1.0",
"vue-eslint-parser": "10.2.0",
- "vue-tsc": "3.0.8"
+ "vue-tsc": "3.1.0"
}
}
diff --git a/packages/frontend/src/aiscript/api.ts b/packages/frontend/src/aiscript/api.ts
index 0549ab76a0..dc84925375 100644
--- a/packages/frontend/src/aiscript/api.ts
+++ b/packages/frontend/src/aiscript/api.ts
@@ -66,7 +66,7 @@ export function createAiScriptEnv(opts: { storageKey: string, token?: string })
});
return confirm.canceled ? values.FALSE : values.TRUE;
}),
- 'Mk:toast': values.FN_NATIVE(async ([text]) => {
+ 'Mk:toast': values.FN_NATIVE(([text]) => {
utils.assertString(text);
os.toast(text.value);
return values.NULL;
diff --git a/packages/frontend/src/components/MkCode.core.vue b/packages/frontend/src/components/MkCode.core.vue
index 8b39468d4c..f669e4b87a 100644
--- a/packages/frontend/src/components/MkCode.core.vue
+++ b/packages/frontend/src/components/MkCode.core.vue
@@ -5,7 +5,13 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+