From b34b4a033d1df5ddfd5ee527be1d07f4fd987f5f Mon Sep 17 00:00:00 2001 From: 4ster1sk <146138447+4ster1sk@users.noreply.github.com> Date: Mon, 17 Nov 2025 22:53:29 +0900 Subject: [PATCH 01/22] =?UTF-8?q?fix:=20frontend=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=81=AEopen=20note=20form=20with=20hotkey=E3=81=8C?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E3=81=99=E3=82=8B=E5=95=8F=E9=A1=8C=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/boot/main-boot.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index 77178417ba..7ddf64892e 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -389,12 +389,12 @@ export async function mainBoot() { // 프로필 아이콘 모양 설정 연합 초기화 if ($i.policies.canSetFederationAvatarShape && prefer.s.setFederationAvatarShape) { - await misskeyApi('i/update', { + misskeyApi('i/update', { setFederationAvatarShape: true, isSquareAvatars: prefer.s.squareAvatars, }); } else if (!$i.policies.canSetFederationAvatarShape && prefer.s.setFederationAvatarShape) { - await misskeyApi('i/update', { + misskeyApi('i/update', { setFederationAvatarShape: false, isSquareAvatars: prefer.s.squareAvatars, }); From 7d89e1abdfe1bf84fc2ee4d554ea0d89a8e7b39a Mon Sep 17 00:00:00 2001 From: 4sterisk <4sterisk@ymail.ne.jp> Date: Thu, 1 Jan 2026 13:44:06 +0900 Subject: [PATCH 02/22] 2026 --- .github/ISSUE_TEMPLATE/01_bug-report.yml | 4 ++-- COPYING | 2 +- packages/cherrypick-js/LICENSE | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.yml b/.github/ISSUE_TEMPLATE/01_bug-report.yml index 959a5871e6..161508c2df 100644 --- a/.github/ISSUE_TEMPLATE/01_bug-report.yml +++ b/.github/ISSUE_TEMPLATE/01_bug-report.yml @@ -54,7 +54,7 @@ body: * Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4 * Browser: Chrome 113.0.5672.126 * Server URL: cherrypick.example.com - * CherryPick: 4.x.x (Misskey: 2025.x.x) + * CherryPick: 4.x.x (Misskey: 2026.x.x) value: | * Model and OS of the device(s): * Browser: @@ -74,7 +74,7 @@ body: Examples: * Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "CherryPick install shell script", development environment - * CherryPick: 4.x.x (Misskey: 2025.x.x) + * CherryPick: 4.x.x (Misskey: 2026.x.x) * Node: 20.x.x * PostgreSQL: 18.x.x * Redis: 7.x.x diff --git a/COPYING b/COPYING index 1cefed924f..9599e09108 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,5 @@ Unless otherwise stated this repository is -Copyright © 2014-2025 syuilo & noridev and contributors +Copyright © 2014-2026 syuilo & noridev and contributors And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE. diff --git a/packages/cherrypick-js/LICENSE b/packages/cherrypick-js/LICENSE index d9dc05607d..4ec6ade0bc 100644 --- a/packages/cherrypick-js/LICENSE +++ b/packages/cherrypick-js/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021-2025 syuilo and noridev and other contributors +Copyright (c) 2021-2026 syuilo and noridev and other 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 From d8e92fb5a9f55b4577a3a1cf0f120d5f70781fec Mon Sep 17 00:00:00 2001 From: 4sterisk <4sterisk@ymail.ne.jp> Date: Thu, 1 Jan 2026 11:25:28 +0900 Subject: [PATCH 03/22] fix backend lint --- packages/backend/src/queue/QueueProcessorService.ts | 2 +- packages/backend/src/server/web/views/bios.tsx | 1 + packages/backend/src/server/web/views/cli.tsx | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 7aa0db2566..075077f915 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -565,7 +565,7 @@ export class QueueProcessorService implements OnApplicationShutdown { //#region scheduled note delete { this.scheduledNoteDeleteQueueWorker = new Bull.Worker(QUEUE.SCHEDULED_NOTE_DELETE, (job) => { - if (this.config.sentryForBackend) { + if (this.config.sentryForBackend && Sentry != null) { return Sentry.startSpan({ name: 'Queue: ScheduledNoteDelete' }, () => this.scheduledNoteDeleteProcessorService.process(job)); } else { return this.scheduledNoteDeleteProcessorService.process(job); diff --git a/packages/backend/src/server/web/views/bios.tsx b/packages/backend/src/server/web/views/bios.tsx index ca36b7c9fc..5b663020d5 100644 --- a/packages/backend/src/server/web/views/bios.tsx +++ b/packages/backend/src/server/web/views/bios.tsx @@ -5,6 +5,7 @@ export function BiosPage(props: { version: string; + basedMisskeyVersion: string; }) { return ( <> diff --git a/packages/backend/src/server/web/views/cli.tsx b/packages/backend/src/server/web/views/cli.tsx index e9c991a724..f7b55ea4ba 100644 --- a/packages/backend/src/server/web/views/cli.tsx +++ b/packages/backend/src/server/web/views/cli.tsx @@ -5,6 +5,7 @@ export function CliPage(props: { version: string; + basedMisskeyVersion: string; }) { return ( <> From 27dcb79568964591069175e83ffad7193c1f1299 Mon Sep 17 00:00:00 2001 From: 4sterisk <4sterisk@ymail.ne.jp> Date: Thu, 1 Jan 2026 12:53:38 +0900 Subject: [PATCH 04/22] WIP --- .../entities/NotificationEntityService.ts | 1 + .../src/models/json-schema/notification.ts | 27 +++++++++ .../backend/src/server/api/endpoint-list.ts | 8 +-- .../admin/abuse-report-resolver/list.ts | 12 +++- packages/cherrypick-js/src/autogen/types.ts | 14 +++++ packages/frontend/src/aiscript/api.ts | 7 ++- packages/frontend/src/components/MkNote.vue | 2 +- .../src/components/MkNotification.vue | 2 + .../src/components/global/RouterView.vue | 25 ++++++-- packages/frontend/src/os.ts | 6 +- packages/frontend/src/pages/admin/abuses.vue | 34 ++++++----- .../frontend/src/pages/admin/overview.vue | 6 +- .../src/pages/user/index.activity.vue | 2 +- .../pages/user/index.timeline.files.files.vue | 60 +++++++++++-------- packages/frontend/src/pages/welcome.setup.vue | 2 +- packages/frontend/src/preferences/def.ts | 3 + packages/frontend/src/store.ts | 2 +- packages/frontend/src/timelines.ts | 2 +- packages/frontend/src/tips.ts | 1 + packages/frontend/src/ui/_common_/common.ts | 2 +- 20 files changed, 149 insertions(+), 69 deletions(-) diff --git a/packages/backend/src/core/entities/NotificationEntityService.ts b/packages/backend/src/core/entities/NotificationEntityService.ts index 7c2699d28a..71c5ceef44 100644 --- a/packages/backend/src/core/entities/NotificationEntityService.ts +++ b/packages/backend/src/core/entities/NotificationEntityService.ts @@ -24,6 +24,7 @@ import type { UserGroupInvitationEntityService } from './UserGroupInvitationEnti const NOTE_REQUIRED_NOTIFICATION_TYPES = new Set([ 'note', + 'note:grouped', 'mention', 'reply', 'renote', diff --git a/packages/backend/src/models/json-schema/notification.ts b/packages/backend/src/models/json-schema/notification.ts index 077e14ccae..ba46ef7e66 100644 --- a/packages/backend/src/models/json-schema/notification.ts +++ b/packages/backend/src/models/json-schema/notification.ts @@ -468,6 +468,33 @@ export const packedNotificationSchema = { }, }, }, + }, { + type: 'object', + properties: { + ...baseSchema.properties, + type: { + type: 'string', + optional: false, nullable: false, + enum: ['note:grouped'], + }, + noteIds: { + type: 'array', + optional: false, nullable: false, + items: { + type: 'string', + optional: true, nullable: true, + }, + }, + users: { + type: 'array', + optional: false, nullable: false, + items: { + type: 'object', + ref: 'UserLite', + optional: false, nullable: false, + }, + }, + }, }, { type: 'object', properties: { diff --git a/packages/backend/src/server/api/endpoint-list.ts b/packages/backend/src/server/api/endpoint-list.ts index d0144ce44a..15e7d05e2d 100644 --- a/packages/backend/src/server/api/endpoint-list.ts +++ b/packages/backend/src/server/api/endpoint-list.ts @@ -15,10 +15,10 @@ export * as 'admin/abuse-report/notification-recipient/delete' from './endpoints export * as 'admin/abuse-report/notification-recipient/list' from './endpoints/admin/abuse-report/notification-recipient/list.js'; export * as 'admin/abuse-report/notification-recipient/show' from './endpoints/admin/abuse-report/notification-recipient/show.js'; export * as 'admin/abuse-report/notification-recipient/update' from './endpoints/admin/abuse-report/notification-recipient/update.js'; -export * as 'admin/abuse-report-resolver/create' from '@/server/api/endpoints/admin/abuse-report-resolver/create.js'; -export * as 'admin/abuse-report-resolver/delete' from '@/server/api/endpoints/admin/abuse-report-resolver/delete.js'; -export * as 'admin/abuse-report-resolver/list' from '@/server/api/endpoints/admin/abuse-report-resolver/list.js'; -export * as 'admin/abuse-report-resolver/update' from '@/server/api/endpoints/admin/abuse-report-resolver/update.js'; +export * as 'admin/abuse-report-resolver/create' from './endpoints/admin/abuse-report-resolver/create.js'; +export * as 'admin/abuse-report-resolver/delete' from './endpoints/admin/abuse-report-resolver/delete.js'; +export * as 'admin/abuse-report-resolver/list' from './endpoints/admin/abuse-report-resolver/list.js'; +export * as 'admin/abuse-report-resolver/update' from './endpoints/admin/abuse-report-resolver/update.js'; export * as 'admin/abuse-user-reports' from './endpoints/admin/abuse-user-reports.js'; export * as 'admin/accounts/create' from './endpoints/admin/accounts/create.js'; export * as 'admin/accounts/delete' from './endpoints/admin/accounts/delete.js'; diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/list.ts b/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/list.ts index a5a6f3c54c..ee62abd885 100644 --- a/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/list.ts +++ b/packages/backend/src/server/api/endpoints/admin/abuse-report-resolver/list.ts @@ -18,9 +18,17 @@ export const meta = { res: { type: 'array', + optional: false, nullable: false, items: { type: 'object', + optional: false, nullable: false, properties: { + id: { + type: 'string', + nullable: false, optional: false, + format: 'id', + example: 'xxxxxxxxxx', + }, name: { type: 'string', nullable: false, optional: false, @@ -60,8 +68,8 @@ export const paramDef = { required: [], } as const; -@Injectable() // eslint-disable-next-line import/no-default-export -export default class extends Endpoint { +@Injectable() +export default class extends Endpoint { // eslint-disable-line import/no-default-export constructor( @Inject(DI.abuseReportResolversRepository) private abuseReportResolversRepository: AbuseReportResolversRepository, diff --git a/packages/cherrypick-js/src/autogen/types.ts b/packages/cherrypick-js/src/autogen/types.ts index 5b35bb5c82..75fa8b9907 100644 --- a/packages/cherrypick-js/src/autogen/types.ts +++ b/packages/cherrypick-js/src/autogen/types.ts @@ -5124,6 +5124,15 @@ export type components = { type: 'renote:grouped'; note: components['schemas']['Note']; users: components['schemas']['UserLite'][]; + } | { + /** Format: id */ + id: string; + /** Format: date-time */ + createdAt: string; + /** @enum {string} */ + type: 'note:grouped'; + noteIds: (string | null)[]; + users: components['schemas']['UserLite'][]; } | { /** Format: id */ id: string; @@ -6276,6 +6285,11 @@ export interface operations { }; content: { 'application/json': { + /** + * Format: id + * @example xxxxxxxxxx + */ + id: string; name: string; targetUserPattern: string | null; reporterPattern: string | null; diff --git a/packages/frontend/src/aiscript/api.ts b/packages/frontend/src/aiscript/api.ts index c34db82fa7..feca7a8f74 100644 --- a/packages/frontend/src/aiscript/api.ts +++ b/packages/frontend/src/aiscript/api.ts @@ -191,8 +191,9 @@ export function createAiScriptEnv(opts: { storageKey: string, token?: string }) throw new Error(`Invalid type. expected string but got ${typeof val}`); } return val; - }).filter(val => MkPermissions.includes(val)); - return await new Promise(async (resolve: any) => { + }).filter(val => MkPermissions.includes(val as any)); + + return await new Promise(async (resolve: (v: values.Value) => void) => { await os.popup(defineAsyncComponent(() => import('@/components/MkFlashRequestTokenDialog.vue')), { permissions, }, { @@ -208,7 +209,7 @@ export function createAiScriptEnv(opts: { storageKey: string, token?: string }) closed: () => { resolve(values.FALSE); }, - }, 'closed'); + }); }); }), 'Mk:nyaize': values.FN_NATIVE(([text]) => { diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 0dc2c7109d..61eb9ada77 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +