From dd9a4936e70eb5e16df265b1062d666fb72cf43b Mon Sep 17 00:00:00 2001 From: Franz Rolfsvaag Date: Fri, 12 Jun 2026 11:54:46 +0200 Subject: [PATCH] Expand plugins and WebUI administration --- .gitignore | 20 +- codex-guidelines | 7 +- plugins/auto-vc/index.js | 2 +- plugins/auto-vc/plugin.json | 2 +- plugins/echonomy-framework/index.js | 10 +- plugins/echonomy-framework/test.txt | 2 +- plugins/echonomy-framework/views/echonomy.ejs | 6 +- plugins/echonomy-games/index.js | 1842 ++++++++--------- plugins/echonomy-games/views/games.ejs | 2 +- plugins/expression-interaction/cmds.json | 218 +- plugins/expression-interaction/index.js | 2 +- plugins/expression-interaction/plugin.json | 14 +- .../views/expression.ejs | 2 +- plugins/lumi_ai/README.md | 18 +- plugins/lumi_ai/backend/access_control.js | 79 + plugins/lumi_ai/backend/ai_provider.js | 218 +- .../lumi_ai/backend/assistant_availability.js | 40 + .../backend/assistant_panel_diagnostics.js | 89 + .../lumi_ai/backend/assistant_permissions.js | 63 + .../lumi_ai/backend/assistant_visibility.js | 81 + plugins/lumi_ai/backend/commands.js | 91 + plugins/lumi_ai/backend/config_manager.js | 68 +- plugins/lumi_ai/backend/downloader.js | 12 +- plugins/lumi_ai/backend/hardware.js | 342 ++- plugins/lumi_ai/backend/link_normalizer.js | 78 + plugins/lumi_ai/backend/metrics.js | 32 +- plugins/lumi_ai/backend/paths.js | 2 +- plugins/lumi_ai/backend/permissions.js | 13 +- plugins/lumi_ai/backend/prompt_builder.js | 27 +- plugins/lumi_ai/backend/rate_limits.js | 96 + plugins/lumi_ai/backend/repo_indexer.js | 314 +++ plugins/lumi_ai/backend/response_formatter.js | 102 + plugins/lumi_ai/backend/runtime_manager.js | 113 +- plugins/lumi_ai/backend/scope_manager.js | 62 + plugins/lumi_ai/backend/size_utils.js | 30 + plugins/lumi_ai/backend/storage.js | 196 ++ plugins/lumi_ai/cmds.json | 29 +- plugins/lumi_ai/index.js | 867 +++++++- plugins/lumi_ai/models_manifest.json | 15 +- plugins/lumi_ai/plugin.json | 2 +- plugins/lumi_ai/public/assistant.css | 38 +- plugins/lumi_ai/public/assistant.js | 622 +++++- plugins/lumi_ai/public/settings.css | 52 + plugins/lumi_ai/public/settings.js | 202 ++ plugins/lumi_ai/runtime_manifest.json | 37 + plugins/lumi_ai/templates/system.txt | 10 +- plugins/lumi_ai/tests/verify.js | 697 ++++++- plugins/lumi_ai/views/assistant-panel.ejs | 31 +- plugins/lumi_ai/views/log-viewer.ejs | 20 + plugins/lumi_ai/views/settings.ejs | 304 ++- plugins/moderation/index.js | 2 +- plugins/moderation/plugin.json | 2 +- plugins/moderation/views/moderation.ejs | 2 +- plugins/moderation/views/status.ejs | 2 +- plugins/moderation/views/tos-bans.ejs | 2 +- plugins/quotes/cmds.json | 2 +- plugins/quotes/index.js | 2 +- plugins/quotes/plugin.json | 2 +- plugins/quotes/views/quotes.ejs | 2 +- plugins/throne_wishlist/plugin.json | 2 +- plugins/throne_wishlist/public/admin.js | 47 - plugins/throne_wishlist/views/admin.ejs | 16 - plugins/welcome_messages/README.md | 44 +- plugins/welcome_messages/index.js | 1448 ++++++------- plugins/welcome_messages/plugin.json | 14 +- .../views/message-section.ejs | 146 +- .../views/profile-pronouns.ejs | 30 +- plugins/welcome_messages/views/settings.ejs | 202 +- safe-mode.js | 2 +- scripts/verify-assistant-panels.js | 136 ++ .../verify-command-preview-confirmations.js | 137 ++ src/services/command-preview-worker.js | 277 +++ src/services/command-preview.js | 148 ++ src/services/command-router.js | 2 +- src/services/db.js | 20 + src/services/destructive-confirm.js | 79 + src/services/discord.js | 290 +-- src/services/top.js | 2 +- src/services/update-manager.js | 2 +- src/web/public/app.js | 186 ++ src/web/public/assistant-panels.js | 237 +++ src/web/public/icons/nav/admin.svg | 2 +- src/web/public/icons/nav/commands.svg | 2 +- src/web/public/icons/nav/home.svg | 2 +- src/web/public/icons/nav/leaderboards.svg | 2 +- src/web/public/icons/nav/logs.svg | 2 +- src/web/public/icons/nav/moderation.svg | 2 +- src/web/public/icons/nav/pages.svg | 2 +- src/web/public/icons/nav/plugins.svg | 2 +- src/web/public/icons/nav/privileges.svg | 2 +- src/web/public/icons/nav/profile.svg | 2 +- src/web/public/icons/nav/settings.svg | 2 +- src/web/public/icons/nav/stats.svg | 2 +- src/web/public/icons/nav/theming.svg | 2 +- src/web/public/icons/nav/updates.svg | 2 +- src/web/public/icons/nav/users.svg | 2 +- src/web/public/styles.css | 113 +- src/web/server.js | 294 ++- src/web/views/admin-commands.ejs | 35 +- src/web/views/admin-dashboard.ejs | 4 +- src/web/views/admin-navigation.ejs | 2 +- src/web/views/admin-pages.ejs | 2 +- src/web/views/admin-plugins.ejs | 2 +- src/web/views/admin-settings.ejs | 256 +-- src/web/views/admin-updates.ejs | 152 +- src/web/views/commands.ejs | 2 +- src/web/views/missing-view.ejs | 2 +- src/web/views/moderator.ejs | 2 +- src/web/views/mods-list.ejs | 2 +- src/web/views/partials/layout-bottom.ejs | 14 + src/web/views/partials/layout-top.ejs | 20 +- src/web/views/plugin-expression.ejs | 2 +- 112 files changed, 8932 insertions(+), 2708 deletions(-) create mode 100644 plugins/lumi_ai/backend/access_control.js create mode 100644 plugins/lumi_ai/backend/assistant_availability.js create mode 100644 plugins/lumi_ai/backend/assistant_panel_diagnostics.js create mode 100644 plugins/lumi_ai/backend/assistant_permissions.js create mode 100644 plugins/lumi_ai/backend/assistant_visibility.js create mode 100644 plugins/lumi_ai/backend/commands.js create mode 100644 plugins/lumi_ai/backend/link_normalizer.js create mode 100644 plugins/lumi_ai/backend/rate_limits.js create mode 100644 plugins/lumi_ai/backend/repo_indexer.js create mode 100644 plugins/lumi_ai/backend/response_formatter.js create mode 100644 plugins/lumi_ai/backend/scope_manager.js create mode 100644 plugins/lumi_ai/backend/size_utils.js create mode 100644 plugins/lumi_ai/backend/storage.js create mode 100644 plugins/lumi_ai/views/log-viewer.ejs create mode 100644 scripts/verify-assistant-panels.js create mode 100644 scripts/verify-command-preview-confirmations.js create mode 100644 src/services/command-preview-worker.js create mode 100644 src/services/command-preview.js create mode 100644 src/services/destructive-confirm.js create mode 100644 src/web/public/assistant-panels.js diff --git a/.gitignore b/.gitignore index 30bf97c..12cf31f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,13 +5,13 @@ plugins/*/data/** !plugins/*/data/**/ !plugins/*/data/**/.gitkeep .env -.env.* -!.env.example -.bot details.md -*.db -*.db-* -*.sqlite -*.sqlite-* -npm-debug.log -security-audit-*.json -security-audit-*.md +.env.* +!.env.example +.bot details.md +*.db +*.db-* +*.sqlite +*.sqlite-* +npm-debug.log +security-audit-*.json +security-audit-*.md diff --git a/codex-guidelines b/codex-guidelines index 41d7968..db7b290 100644 --- a/codex-guidelines +++ b/codex-guidelines @@ -112,8 +112,11 @@ Plugins (important) - Plugins should avoid core edits unless explicitly requested - Plugins receive `webhooks` for raw-body inbound endpoint registration and outbound webhook sending. See `docs/webhooks.md`. -- `web.addAssistantPanel({ id, view, stylesheet?, script?, role?, isVisible?, locals? })` - contributes a role-filtered sidebar pill/global panel above the user footer. +- `web.addAssistantPanel({ id, view, stylesheet?, script?, role?, getAvailability?(user), version?, locals? })` + registers a dynamically mounted sidebar pill/global panel above the user footer. + `getAvailability` may be async and must return `{ available, status?, reason_code? }`. + The core polls `/api/assistant-panels`, renders HTML only for available panels, and + returns a cleanup function that plugins should call when unloading. Current notable plugins - echonomy-framework: diff --git a/plugins/auto-vc/index.js b/plugins/auto-vc/index.js index 4c67e29..fe65643 100644 --- a/plugins/auto-vc/index.js +++ b/plugins/auto-vc/index.js @@ -1453,4 +1453,4 @@ async function sweepRooms(discordClient, db, state) { clearEmpty(state, channel.id); } } -} +} diff --git a/plugins/auto-vc/plugin.json b/plugins/auto-vc/plugin.json index 50bae97..543b303 100644 --- a/plugins/auto-vc/plugin.json +++ b/plugins/auto-vc/plugin.json @@ -4,4 +4,4 @@ "version": "0.1.5", "description": "Auto-create managed voice channels from lobby rooms.", "main": "index.js" -} +} diff --git a/plugins/echonomy-framework/index.js b/plugins/echonomy-framework/index.js index f0dc716..bfc3960 100644 --- a/plugins/echonomy-framework/index.js +++ b/plugins/echonomy-framework/index.js @@ -1,4 +1,4 @@ - + const path = require("path"); const fs = require("fs"); const crypto = require("crypto"); @@ -276,7 +276,7 @@ module.exports = { message: "Currency settings updated." }; res.redirect(`/plugins/${PLUGIN_ID}`); - }); + }); router.post("/settings/platforms", (req, res) => { if (!req.session.user?.isAdmin) { @@ -1209,7 +1209,7 @@ function registerCommands({ db, settings, commandRouter }) { }; rebuild(); return rebuild; -} +} async function handleCoinsCommand({ ctx, db, settings }) { const config = getConfig(db); @@ -1770,7 +1770,7 @@ function findUserByInternalName(db, name) { "SELECT id, internal_username FROM user_profiles WHERE lower(internal_username) = lower(?)" ) .get(name); -} +} function ensureAccount(db, userId) { db.prepare( @@ -2359,4 +2359,4 @@ function getTwitchTierMultiplier(tags, config) { return config.tiers.twitchSub; } return 1; -} +} diff --git a/plugins/echonomy-framework/test.txt b/plugins/echonomy-framework/test.txt index 9766475..0aee968 100644 --- a/plugins/echonomy-framework/test.txt +++ b/plugins/echonomy-framework/test.txt @@ -1 +1 @@ -ok +ok diff --git a/plugins/echonomy-framework/views/echonomy.ejs b/plugins/echonomy-framework/views/echonomy.ejs index a2ba899..b085bdc 100644 --- a/plugins/echonomy-framework/views/echonomy.ejs +++ b/plugins/echonomy-framework/views/echonomy.ejs @@ -1,4 +1,4 @@ - + <%- include("../../../src/web/views/partials/layout-top", { title }) %>