All checks were successful
CI / Lint, typecheck, test (push) Successful in 2m56s
CD / Build and push images (push) Successful in 3m11s
CD / Deploy to Test (push) Successful in 8s
CI / Auth e2e pack (push) Successful in 4m12s
CD / Smoke tests against Test (push) Successful in 1m6s
CD / Promote to Int (push) Successful in 13s
CI / Import/export fidelity gate (push) Successful in 42s
CI / Build container images (push) Has been skipped
- api: PATCH /admin/plugins/:id/mode (Site Admin) switches disabled/optional/required; new PluginPondController exposes GET /ponds/:id/plugins (effective list: required + optional-enabled, pond read access — the SPA loads it per pond), GET .../plugins/settings and PUT .../plugins/:pluginId (Pond Admin) to toggle optional plugins. Toggling a non-optional plugin is refused (plugin_not_optional). Install/uninstall/mode/toggle are audit-logged. - web: PluginManager in the admin area lists installed plugins with their declared permissions surfaced prominently (security.md), an upload control that shows validation errors, a mode switch with an impact hint, and a link to the sandbox preview. PondPluginSettings adds a per-pond optional-plugin toggle section to pond settings. - shared: PondPluginSetting, mode/toggle input schemas, plugin_not_optional error code + de/en messages, plugins i18n (admin/mode/pond). - tests: api db test covers mode switching, per-pond activation, the required-everywhere and disabled-nowhere propagation, and the not-optional guard; e2e plugin-admin pack drives the admin list, permission display, mode switch, and pond toggle end to end. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
44 lines
1.3 KiB
JSON
44 lines
1.3 KiB
JSON
{
|
|
"frame": {
|
|
"loading": "Loading plugin …",
|
|
"failed": "The plugin “{{name}}” could not be loaded."
|
|
},
|
|
"preview": {
|
|
"loading": "Loading plugins …",
|
|
"loadFailed": "The plugin list could not be loaded.",
|
|
"notFound": "This plugin is not installed.",
|
|
"title": "Preview: {{name}}",
|
|
"permissions": "Requested permissions",
|
|
"noPermissions": "This plugin requests no permissions.",
|
|
"surface": "Surface",
|
|
"noSurfaces": "This plugin provides no surfaces."
|
|
},
|
|
"admin": {
|
|
"title": "Plugins",
|
|
"intro": "Installed plugins run sandboxed. Review the permissions a plugin requests before enabling it.",
|
|
"upload": "Upload plugin (.zip)",
|
|
"empty": "No plugins installed yet.",
|
|
"permissions": "Permissions",
|
|
"noPermissions": "none",
|
|
"mode": "Mode",
|
|
"preview": "Preview",
|
|
"uninstall": "Uninstall",
|
|
"requiredLocked": "A required plugin cannot be uninstalled."
|
|
},
|
|
"mode": {
|
|
"disabled": "Disabled",
|
|
"optional": "Optional",
|
|
"required": "Required",
|
|
"hint": {
|
|
"disabled": "Installed but inactive everywhere.",
|
|
"optional": "Pond Admins can enable it per pond.",
|
|
"required": "Always active in every pond."
|
|
}
|
|
},
|
|
"pond": {
|
|
"title": "Plugins",
|
|
"hint": "Enable optional plugins for this pond.",
|
|
"empty": "No optional plugins are available."
|
|
}
|
|
}
|