summaryrefslogtreecommitdiff
path: root/packages/frontend/src/plugin.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 21:57:56 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 21:57:56 +0900
commitc76afce9a752f6c5e2a65aeb50ad12b90290628a (patch)
tree01e96b1fc02767f58e1e0071911a2a3f752eff46 /packages/frontend/src/plugin.ts
parentBump version to 2025.3.2-alpha.2 (diff)
downloadsharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.tar.gz
sharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.tar.bz2
sharkey-c76afce9a752f6c5e2a65aeb50ad12b90290628a.zip
enhance(frontend): improve plugin management
Diffstat (limited to 'packages/frontend/src/plugin.ts')
-rw-r--r--packages/frontend/src/plugin.ts71
1 files changed, 48 insertions, 23 deletions
diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts
index 15644870e5..613e3a9df6 100644
--- a/packages/frontend/src/plugin.ts
+++ b/packages/frontend/src/plugin.ts
@@ -144,9 +144,12 @@ export async function installPlugin(code: string, meta?: AiScriptPluginMeta) {
prefer.set('plugins', prefer.s.plugins.concat(plugin));
await authorizePlugin(plugin);
+
+ await launchPlugin(installId);
}
export async function uninstallPlugin(plugin: Plugin) {
+ abortPlugin(plugin);
prefer.set('plugins', prefer.s.plugins.filter(x => x.installId !== plugin.installId));
if (Object.hasOwn(store.state.pluginTokens, plugin.installId)) {
await os.apiWithDialog('i/revoke-token', {
@@ -158,26 +161,6 @@ export async function uninstallPlugin(plugin: Plugin) {
}
}
-export async function configPlugin(plugin: Plugin) {
- if (plugin.config == null) {
- throw new Error('This plugin does not have a config');
- }
-
- const config = plugin.config;
- for (const key in plugin.configData) {
- config[key].default = plugin.configData[key];
- }
-
- const { canceled, result } = await os.form(plugin.name, config);
- if (canceled) return;
-
- prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x));
-}
-
-export function changePluginActive(plugin: Plugin, active: boolean) {
- prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x));
-}
-
const pluginContexts = new Map<string, Interpreter>();
export const pluginLogs = ref(new Map<string, string[]>());
@@ -217,7 +200,18 @@ function addPluginHandler<K extends keyof HandlerDef>(installId: Plugin['install
pluginHandlers.push({ pluginInstallId: installId, type, ctx });
}
-export async function launchPlugin(plugin: Plugin): Promise<void> {
+export function launchPlugins() {
+ for (const plugin of prefer.s.plugins) {
+ if (plugin.active) {
+ launchPlugin(plugin.installId);
+ }
+ }
+}
+
+async function launchPlugin(id: Plugin['installId']): Promise<void> {
+ const plugin = prefer.s.plugins.find(x => x.installId === id);
+ if (!plugin) return;
+
// 後方互換性のため
if (plugin.src == null) return;
@@ -254,7 +248,7 @@ export async function launchPlugin(plugin: Plugin): Promise<void> {
);
}
-export function reloadPlugin(plugin: Plugin): void {
+export function abortPlugin(plugin: Plugin): void {
const pluginContext = pluginContexts.get(plugin.installId);
if (!pluginContext) return;
@@ -262,8 +256,39 @@ export function reloadPlugin(plugin: Plugin): void {
pluginContexts.delete(plugin.installId);
pluginLogs.value.delete(plugin.installId);
pluginHandlers = pluginHandlers.filter(x => x.pluginInstallId !== plugin.installId);
+}
+
+export function reloadPlugin(plugin: Plugin): void {
+ abortPlugin(plugin);
+ launchPlugin(plugin.installId);
+}
+
+export async function configPlugin(plugin: Plugin) {
+ if (plugin.config == null) {
+ throw new Error('This plugin does not have a config');
+ }
+
+ const config = plugin.config;
+ for (const key in plugin.configData) {
+ config[key].default = plugin.configData[key];
+ }
+
+ const { canceled, result } = await os.form(plugin.name, config);
+ if (canceled) return;
- launchPlugin(plugin);
+ prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x));
+
+ reloadPlugin(plugin);
+}
+
+export function changePluginActive(plugin: Plugin, active: boolean) {
+ prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x));
+
+ if (active) {
+ launchPlugin(plugin.installId);
+ } else {
+ abortPlugin(plugin);
+ }
}
function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> {