From e67ff36e57ea1dcb5ee64a732b328c1ba764198e Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:50:05 +0900 Subject: [PATCH] =?UTF-8?q?enhance(frontend):=20AiScript=E3=81=AEcode-spli?= =?UTF-8?q?tting=E3=81=8C=E6=AD=A3=E3=81=97=E3=81=8F=E8=A1=8C=E3=82=8F?= =?UTF-8?q?=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/plugin.ts | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) 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));