diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 3f634a0d80..b6906e130a 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -25,7 +25,7 @@ "@rollup/plugin-replace": "6.0.3", "@rollup/pluginutils": "5.3.0", "@sentry/vue": "10.26.0", - "@syuilo/aiscript": "1.1.2", + "@syuilo/aiscript": "1.2.0", "@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0", "@twemoji/parser": "16.0.0", "@vitejs/plugin-vue": "6.0.2", diff --git a/packages/frontend/src/aiscript/api.ts b/packages/frontend/src/aiscript/api.ts index dc84925375..3a476787fe 100644 --- a/packages/frontend/src/aiscript/api.ts +++ b/packages/frontend/src/aiscript/api.ts @@ -40,29 +40,77 @@ export function createAiScriptEnv(opts: { storageKey: string, token?: string }) CUSTOM_EMOJIS: utils.jsToVal(customEmojis.value), LOCALE: values.STR(lang), SERVER_URL: values.STR(url), - 'Mk:dialog': values.FN_NATIVE(async ([title, text, type]) => { - utils.assertString(title); - utils.assertString(text); - if (type != null) { - assertStringAndIsIn(type, DIALOG_TYPES); + 'Mk:dialog': values.FN_NATIVE(async ([_title, _text, _type]) => { + let title: string | undefined = undefined; + let text: string | undefined = undefined; + let type: typeof DIALOG_TYPES[number] = 'info'; + + if (_title != null) { + if (utils.isString(_title)) { + title = _title.value; + } else { + utils.assertNull(_title); + } } + + if (_text != null) { + if (utils.isString(_text)) { + text = _text.value; + } else { + utils.assertNull(_text); + } + } + + if (_type != null) { + if (utils.isString(_type)) { + assertStringAndIsIn(_type, DIALOG_TYPES); + type = _type.value; + } else { + utils.assertNull(_type); + } + } + await os.alert({ - type: type ? type.value : 'info', - title: title.value, - text: text.value, + type, + title, + text, }); return values.NULL; }), - 'Mk:confirm': values.FN_NATIVE(async ([title, text, type]) => { - utils.assertString(title); - utils.assertString(text); - if (type != null) { - assertStringAndIsIn(type, DIALOG_TYPES); + 'Mk:confirm': values.FN_NATIVE(async ([_title, _text, _type]) => { + let title: string | undefined = undefined; + let text: string | undefined = undefined; + let type: typeof DIALOG_TYPES[number] = 'question'; + + if (_title != null) { + if (utils.isString(_title)) { + title = _title.value; + } else { + utils.assertNull(_title); + } } + + if (_text != null) { + if (utils.isString(_text)) { + text = _text.value; + } else { + utils.assertNull(_text); + } + } + + if (_type != null) { + if (utils.isString(_type)) { + assertStringAndIsIn(_type, DIALOG_TYPES); + type = _type.value; + } else { + utils.assertNull(_type); + } + } + const confirm = await os.confirm({ - type: type ? type.value : 'question', - title: title.value, - text: text.value, + type, + title, + text, }); return confirm.canceled ? values.FALSE : values.TRUE; }), @@ -76,15 +124,23 @@ export function createAiScriptEnv(opts: { storageKey: string, token?: string }) if (ep.value.includes('://') || ep.value.includes('..')) { throw new errors.AiScriptRuntimeError('invalid endpoint'); } - if (token) { + + let actualToken: string | null = null; + if (token != null && !utils.isNull(token)) { utils.assertString(token); // バグがあればundefinedもあり得るため念のため - if (typeof token.value !== 'string') throw new Error('invalid token'); + if (typeof token.value !== 'string') throw new errors.AiScriptRuntimeError('invalid token'); + actualToken = token.value; } - const actualToken: string | null = token?.value ?? opts.token ?? null; + + if (actualToken == null) { + actualToken = opts.token ?? null; + } + if (param == null) { throw new errors.AiScriptRuntimeError('expected param'); } + utils.assertObject(param); return misskeyApi(ep.value as keyof Misskey.Endpoints, utils.valToJs(param) as object, actualToken).then(res => { return utils.jsToVal(res); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfc71f5256..519ea8a7e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -729,8 +729,8 @@ importers: specifier: 10.26.0 version: 10.26.0(vue@3.5.24(typescript@5.9.3)) '@syuilo/aiscript': - specifier: 1.1.2 - version: 1.1.2 + specifier: 1.2.0 + version: 1.2.0 '@syuilo/aiscript-0-19-0': specifier: npm:@syuilo/aiscript@^0.19.0 version: '@syuilo/aiscript@0.19.0' @@ -4459,8 +4459,8 @@ packages: '@syuilo/aiscript@0.19.0': resolution: {integrity: sha512-ZWG4s1m6RrFjE7NeIMaxFz769YO1jW5ReTrOROrEO4IHheOrjxxJ/Ffe2TUNqX9/XxDloMwfWplKhfSzx8LGMA==} - '@syuilo/aiscript@1.1.2': - resolution: {integrity: sha512-cijsHTiMjeECocElyjRIcWMPGDhZIX3YfCOyzI6AZM8ajxRQ2hSqJwEh9pDr4mVTml9kLMHWDHmgfHkTHRJ1sg==} + '@syuilo/aiscript@1.2.0': + resolution: {integrity: sha512-3MkKfqDftqHyouINgHEIHnoTVWEeL0L1o7Y7Y9d8qb5h5vZKphzH/KVG3R2iI6CHtmO1mWHHJx5A499f80H9FA==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -14858,7 +14858,7 @@ snapshots: stringz: 2.1.0 uuid: 9.0.1 - '@syuilo/aiscript@1.1.2': + '@syuilo/aiscript@1.2.0': dependencies: seedrandom: 3.0.5 stringz: 2.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8757f8dc26..8f7fdf13c8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -32,3 +32,4 @@ onlyBuiltDependencies: ignorePatchFailures: false minimumReleaseAge: 10080 # delay 7days to mitigate supply-chain attack minimumReleaseAgeExclude: + - '@syuilo/aiscript'