enhance(frontend): AiScriptのcode-splittingが正しく行われるように

This commit is contained in:
syuilo 2025-08-08 21:50:05 +09:00
parent 96a165d729
commit e67ff36e57
1 changed files with 21 additions and 6 deletions

View File

@ -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<string, any>;
};
const parser = new Parser();
let _parser: Parser | null = null;
async function getParser(): Promise<Parser> {
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<AiScriptPluginMeta>
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<AiScriptPluginMeta>
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<void> {
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<void> {
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<string, values.Value> {
async function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Promise<Record<string, values.Value>> {
const id = opts.plugin.installId;
const { utils, values } = await import('@syuilo/aiscript');
const { createAiScriptEnv } = await import('@/aiscript/api.js');
const config = new Map<string, values.Value>();
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));