diff --git a/CHANGELOG.md b/CHANGELOG.md index d6cb37162b..e5b171f4ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,15 +32,20 @@ - Feat: ページのタブバーを下部に表示できるように - Enhance: コントロールパネルを検索できるように - Enhance: トルコ語 (tr-TR) に対応 -- Enhance: 言語別のスクリプトバンドルを生成するように +- Enhance: 不必要な翻訳データを読み込まなくなり、パフォーマンスが向上しました +- Enhance: 画像エフェクトのパラメータ名の多言語対応 +- Enhance: 依存ソフトウェアの更新 - Fix: 投稿フォームでファイルのアップロードが中止または失敗した際のハンドリングを修正 - Fix: 一部の設定検索結果が存在しないパスになる問題を修正 (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1171) - Fix: テーマエディタが動作しない問題を修正 +- Fix: チャンネルのハイライトページにノートが表示されない問題を修正 +- Fix: カラムの名前が正しくリスト/チャンネルの名前にならない問題を修正 ### Server - Enhance: ノートの削除処理の効率化 - Enhance: 全体的なパフォーマンスの向上 +- Enhance: 依存ソフトウェアの更新 - Fix: SystemWebhook設定でsecretを空に出来ない問題を修正 diff --git a/locales/index.d.ts b/locales/index.d.ts index b0a15e0ad1..b2906cf48e 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -12203,6 +12203,10 @@ export interface Locale extends ILocale { * 高度 */ "advanced": string; + /** + * 角度 + */ + "angle": string; /** * ストライプ */ @@ -12215,10 +12219,6 @@ export interface Locale extends ILocale { * ラインの数 */ "stripeFrequency": string; - /** - * 角度 - */ - "angle": string; /** * ポルカドット */ @@ -12261,6 +12261,10 @@ export interface Locale extends ILocale { * 変更を破棄して終了しますか? */ "discardChangesConfirm": string; + /** + * 設定項目はありません + */ + "nothingToConfigure": string; "_fxs": { /** * 色収差 @@ -12327,6 +12331,132 @@ export interface Locale extends ILocale { */ "tearing": string; }; + "_fxProps": { + /** + * 角度 + */ + "angle": string; + /** + * サイズ + */ + "scale": string; + /** + * サイズ + */ + "size": string; + /** + * 色 + */ + "color": string; + /** + * 不透明度 + */ + "opacity": string; + /** + * 正規化 + */ + "normalize": string; + /** + * 量 + */ + "amount": string; + /** + * 明るさ + */ + "lightness": string; + /** + * コントラスト + */ + "contrast": string; + /** + * 色相 + */ + "hue": string; + /** + * 輝度 + */ + "brightness": string; + /** + * 彩度 + */ + "saturation": string; + /** + * 最大値 + */ + "max": string; + /** + * 最小値 + */ + "min": string; + /** + * 方向 + */ + "direction": string; + /** + * 位相 + */ + "phase": string; + /** + * 頻度 + */ + "frequency": string; + /** + * 強さ + */ + "strength": string; + /** + * ズレ + */ + "glitchChannelShift": string; + /** + * シード値 + */ + "seed": string; + /** + * 赤色成分 + */ + "redComponent": string; + /** + * 緑色成分 + */ + "greenComponent": string; + /** + * 青色成分 + */ + "blueComponent": string; + /** + * しきい値 + */ + "threshold": string; + /** + * 中心X + */ + "centerX": string; + /** + * 中心Y + */ + "centerY": string; + /** + * スムージング + */ + "zoomLinesSmoothing": string; + /** + * スムージングと集中線の幅の設定は併用できません。 + */ + "zoomLinesSmoothingDescription": string; + /** + * 集中線の幅 + */ + "zoomLinesThreshold": string; + /** + * 中心径 + */ + "zoomLinesMaskSize": string; + /** + * 黒色にする + */ + "zoomLinesBlack": string; + }; }; /** * 下書き diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 4562cfe370..d45aa7bb86 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3267,10 +3267,10 @@ _watermarkEditor: type: "タイプ" image: "画像" advanced: "高度" + angle: "角度" stripe: "ストライプ" stripeWidth: "ラインの幅" stripeFrequency: "ラインの数" - angle: "角度" polkadot: "ポルカドット" checker: "チェッカー" polkadotMainDotOpacity: "メインドットの不透明度" @@ -3283,6 +3283,7 @@ _imageEffector: title: "エフェクト" addEffect: "エフェクトを追加" discardChangesConfirm: "変更を破棄して終了しますか?" + nothingToConfigure: "設定項目はありません" _fxs: chromaticAberration: "色収差" @@ -3302,6 +3303,39 @@ _imageEffector: blockNoise: "ブロックノイズ" tearing: "ティアリング" + _fxProps: + angle: "角度" + scale: "サイズ" + size: "サイズ" + color: "色" + opacity: "不透明度" + normalize: "正規化" + amount: "量" + lightness: "明るさ" + contrast: "コントラスト" + hue: "色相" + brightness: "輝度" + saturation: "彩度" + max: "最大値" + min: "最小値" + direction: "方向" + phase: "位相" + frequency: "頻度" + strength: "強さ" + glitchChannelShift: "ズレ" + seed: "シード値" + redComponent: "赤色成分" + greenComponent: "緑色成分" + blueComponent: "青色成分" + threshold: "しきい値" + centerX: "中心X" + centerY: "中心Y" + zoomLinesSmoothing: "スムージング" + zoomLinesSmoothingDescription: "スムージングと集中線の幅の設定は併用できません。" + zoomLinesThreshold: "集中線の幅" + zoomLinesMaskSize: "中心径" + zoomLinesBlack: "黒色にする" + drafts: "下書き" _drafts: select: "下書きを選択" diff --git a/package.json b/package.json index 9a9d178413..9078e3dc5b 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "misskey", - "version": "2025.8.0-alpha.6", + "version": "2025.8.0-alpha.7", "codename": "nasubi", "repository": { "type": "git", "url": "https://github.com/misskey-dev/misskey.git" }, - "packageManager": "pnpm@10.13.1", + "packageManager": "pnpm@10.14.0", "workspaces": [ "packages/frontend-shared", "packages/frontend", @@ -53,7 +53,7 @@ }, "dependencies": { "cssnano": "7.1.0", - "esbuild": "0.25.6", + "esbuild": "0.25.8", "execa": "9.6.0", "fast-glob": "3.3.3", "glob": "11.0.3", @@ -62,20 +62,20 @@ "postcss": "8.5.6", "tar": "7.4.3", "terser": "5.43.1", - "typescript": "5.8.3" + "typescript": "5.9.2" }, "devDependencies": { "@misskey-dev/eslint-plugin": "2.1.0", - "@types/node": "22.16.4", - "@typescript-eslint/eslint-plugin": "8.37.0", - "@typescript-eslint/parser": "8.37.0", + "@types/node": "22.17.1", + "@typescript-eslint/eslint-plugin": "8.39.0", + "@typescript-eslint/parser": "8.39.0", "cross-env": "7.0.3", - "cypress": "14.5.2", - "eslint": "9.31.0", + "cypress": "14.5.4", + "eslint": "9.33.0", "globals": "16.3.0", "ncp": "2.0.0", - "pnpm": "10.13.1", - "start-server-and-test": "2.0.12" + "pnpm": "10.14.0", + "start-server-and-test": "2.0.13" }, "optionalDependencies": { "@tensorflow/tfjs-core": "4.22.0" diff --git a/packages/backend/src/server/api/endpoints/chat/read-all.ts b/packages/backend/src/server/api/endpoints/chat/read-all.ts index 2ed9497eef..e2d9601aa6 100644 --- a/packages/backend/src/server/api/endpoints/chat/read-all.ts +++ b/packages/backend/src/server/api/endpoints/chat/read-all.ts @@ -32,6 +32,8 @@ export default class extends Endpoint { // eslint- private chatService: ChatService, ) { super(meta, paramDef, async (ps, me) => { + await this.chatService.checkChatAvailability(me.id, 'read'); + await this.chatService.readAllChatMessages(me.id); }); } diff --git a/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts b/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts index 5be477f468..b34ac4abd1 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts @@ -10,6 +10,7 @@ import { QueryService } from '@/core/QueryService.js'; import { DI } from '@/di-symbols.js'; import { RoleService } from '@/core/RoleService.js'; import { ChatEntityService } from '@/core/entities/ChatEntityService.js'; +import { ChatService } from '@/core/ChatService.js'; import { ApiError } from '../../../error.js'; export const meta = { @@ -60,14 +61,21 @@ export default class extends Endpoint { // eslint- @Inject(DI.chatMessagesRepository) private chatMessagesRepository: ChatMessagesRepository, + private chatService: ChatService, private chatEntityService: ChatEntityService, private queryService: QueryService, private roleService: RoleService, ) { super(meta, paramDef, async (ps, me) => { + const isModerator = await this.roleService.isModerator(me); + + if (!isModerator) { + await this.chatService.checkChatAvailability(me.id, 'read'); + } + const file = await this.driveFilesRepository.findOneBy({ id: ps.fileId, - userId: await this.roleService.isModerator(me) ? undefined : me.id, + userId: isModerator ? undefined : me.id, }); if (file == null) { diff --git a/packages/frontend-builder/locale-inliner.ts b/packages/frontend-builder/locale-inliner.ts index 75bcdc5b3f..9bef465eeb 100644 --- a/packages/frontend-builder/locale-inliner.ts +++ b/packages/frontend-builder/locale-inliner.ts @@ -69,8 +69,10 @@ export class LocaleInliner { async saveAllLocales(locales: Record) { const localeNames = Object.keys(locales); for (const localeName of localeNames) { + this.logger.info(`Creating bundle for ${localeName}`); await this.saveLocale(localeName, locales[localeName]); } + this.logger.info('Done'); } async saveLocale(localeName: string, localeJson: Locale) { diff --git a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue index d8466fa7ca..f734325039 100644 --- a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue +++ b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue @@ -14,73 +14,15 @@ SPDX-License-Identifier: AGPL-3.0-only -
-
- - - - - - - - - - -
- - - -
- - - -
-
+ - - diff --git a/packages/frontend/src/components/MkImageEffectorFxForm.vue b/packages/frontend/src/components/MkImageEffectorFxForm.vue new file mode 100644 index 0000000000..d7ab620132 --- /dev/null +++ b/packages/frontend/src/components/MkImageEffectorFxForm.vue @@ -0,0 +1,95 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkPositionSelector.vue b/packages/frontend/src/components/MkPositionSelector.vue index 002950cdf1..739f55125b 100644 --- a/packages/frontend/src/components/MkPositionSelector.vue +++ b/packages/frontend/src/components/MkPositionSelector.vue @@ -44,6 +44,11 @@ const y = defineModel('y', { default: 'center' }); height: 32px; background: var(--MI_THEME-panel); border-radius: 4px; + transition: background 0.1s ease; + + &:not(.active):hover { + background: var(--MI_THEME-buttonHoverBg); + } &.active { background: var(--MI_THEME-accentedBg); diff --git a/packages/frontend/src/deck.ts b/packages/frontend/src/deck.ts index 73a3cecd3b..208adae8fe 100644 --- a/packages/frontend/src/deck.ts +++ b/packages/frontend/src/deck.ts @@ -62,6 +62,8 @@ export type Column = { withSensitive?: boolean; onlyFiles?: boolean; soundSetting?: SoundStore; + // The cache for the name of the antenna, channel, list, or role + timelineNameCache?: string; }; const _currentProfile = prefer.s['deck.profiles'].find(p => p.name === prefer.s['deck.profile']); diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue index 7ce42ea0cb..0437191695 100644 --- a/packages/frontend/src/pages/channel.vue +++ b/packages/frontend/src/pages/channel.vue @@ -112,7 +112,7 @@ const favorited = ref(false); const searchQuery = ref(''); const searchPaginator = shallowRef(); const searchKey = ref(''); -const featuredPaginator = markRaw(new Paginator('channels/featured', { +const featuredPaginator = markRaw(new Paginator('notes/featured', { limit: 10, computedParams: computed(() => ({ channelId: props.channelId, diff --git a/packages/frontend/src/pages/settings/other.vue b/packages/frontend/src/pages/settings/other.vue index c896ee8232..30ab2ce11e 100644 --- a/packages/frontend/src/pages/settings/other.vue +++ b/packages/frontend/src/pages/settings/other.vue @@ -128,9 +128,11 @@ SPDX-License-Identifier: AGPL-3.0-only
- Read all chat messages + {{ i18n.ts.migrateOldSettings }} diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index d47c6cd0e5..632c913ad7 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -3,14 +3,13 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { ref, defineAsyncComponent } from 'vue'; -import { Interpreter, Parser, utils, values } from '@syuilo/aiscript'; +import { ref } from 'vue'; import { compareVersions } from 'compare-versions'; import { isSafeMode } from '@@/js/config.js'; import * as Misskey from 'misskey-js'; +import type { Parser, Interpreter, values } from '@syuilo/aiscript'; import type { FormWithDefault } from '@/utility/form.js'; import { genId } from '@/utility/id.js'; -import { aiScriptReadline, createAiScriptEnv } from '@/aiscript/api.js'; import { store } from '@/store.js'; import * as os from '@/os.js'; import { misskeyApi } from '@/utility/misskey-api.js'; @@ -39,7 +38,13 @@ export type AiScriptPluginMeta = { config?: Record; }; -const parser = new Parser(); +let _parser: Parser | null = null; + +async function getParser(): Promise { + const { Parser } = await import('@syuilo/aiscript'); + _parser ??= new Parser(); + return _parser; +} export function isSupportedAiScriptVersion(version: string): boolean { try { @@ -54,6 +59,8 @@ export async function parsePluginMeta(code: string): Promise throw new Error('code is required'); } + const { Interpreter, utils } = await import('@syuilo/aiscript'); + const lv = utils.getLangVersion(code); if (lv == null) { throw new Error('No language version annotation found'); @@ -63,6 +70,7 @@ export async function parsePluginMeta(code: string): Promise let ast; try { + const parser = await getParser(); ast = parser.parse(code); } catch (err) { throw new Error('Aiscript syntax error'); @@ -255,7 +263,10 @@ async function launchPlugin(id: Plugin['installId']): Promise { await authorizePlugin(plugin); - const aiscript = new Interpreter(createPluginEnv({ + const { Interpreter, utils } = await import('@syuilo/aiscript'); + const { aiScriptReadline } = await import('@/aiscript/api.js'); + + const aiscript = new Interpreter(await createPluginEnv({ plugin: plugin, storageKey: 'plugins:' + plugin.installId, }), { @@ -280,6 +291,7 @@ async function launchPlugin(id: Plugin['installId']): Promise { pluginContexts.set(plugin.installId, aiscript); + const parser = await getParser(); aiscript.exec(parser.parse(plugin.src)).then( () => { console.info('Plugin installed:', plugin.name, 'v' + plugin.version); @@ -336,9 +348,12 @@ export function changePluginActive(plugin: Plugin, active: boolean) { } } -function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record { +async function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Promise> { const id = opts.plugin.installId; + const { utils, values } = await import('@syuilo/aiscript'); + const { createAiScriptEnv } = await import('@/aiscript/api.js'); + const config = new Map(); for (const [k, v] of Object.entries(opts.plugin.config ?? {})) { config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default)); diff --git a/packages/frontend/src/ui/deck/antenna-column.vue b/packages/frontend/src/ui/deck/antenna-column.vue index 8de894ee88..0042882728 100644 --- a/packages/frontend/src/ui/deck/antenna-column.vue +++ b/packages/frontend/src/ui/deck/antenna-column.vue @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only