Add security hardening, Ghidra, recreate skill, checkpoints, shells, web search and themes

- Sandbox (bubblewrap) for non-admin shell/git, MCP per-user rights, hard budgets and quotas,
  login rate limiting, audit log and backups
- Ghidra headless decompilation (ARM64 natives built from source), binary_info tool,
  clean room / deep workflow per session
- Recreate skill and commands for analysing and re-building old software
- File checkpoints with rewind/restore, background shells (bash_output, kill_shell)
- web_search tool (DuckDuckGo, SearXNG, Brave, Tavily)
- In-app dialogs and toasts instead of browser dialogs
- 15 base themes (trilium-themes palettes plus Nord, VS Code, GitHub, Catppuccin, One,
  Dracula, Rose Pine, Everforest, Kanagawa) with light/dark/auto switcher and license notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-08 19:12:30 +01:00
1 parent fab9add5d5
commit 5b569b6835
108 files changed
+6785 -279

No files matched your search

+75 -2
View File
@@ -125,6 +125,74 @@ export const de: Messages = {
"git.noDiff": "Keine Unterschiede.",
"composer.attachedFiles": "Angehängte Dateien (im Projekt, mit deinen Tools lesen):",
"composer.uploading": "Lade {n} hoch…",
"usage.title": "Modelle und Verbrauch dieser Session",
"usage.period": "Zeitraum",
"usage.current": "aktuell",
"usage.model": "Modell",
"usage.prices": "Preise pro 1 Mio. Tokens",
"usage.usage": "Nutzung",
"usage.speed": "Geschwindigkeit",
"usage.cacheWrite": "Cache geschrieben",
"usage.contextNow": "Kontext jetzt",
"usage.totalTime": "Gesamtzeit",
"usage.inSession": "In dieser Session",
"usage.providerMonth": "Provider diesen Monat",
"usage.byAgent": "Nach Agent und Modell",
"preview.page": "Seite {n} / {total}",
"preview.openBrowser": "Im Browser öffnen",
"preview.moreRows": "{n} weitere Zeilen nicht angezeigt",
"preview.moduleHint": "Tracker-Modul – wird auf dem Server zu Audio gerendert (der erste Start kann kurz dauern).",
"activity.phrases": "Grübelt|Tüftelt|Werkelt|Brütet|Sinniert|Knobelt|Schmiedet|Rätselt|Zaubert|Bastelt|Puzzelt|Feilt|Köchelt|Hirnt|Fummelt|Sortiert Gedanken|Dreht Schrauben|Entwirrt|Klamüsert|Ausbaldowert|Fuchst sich rein|Wuselt|Tüftelt weiter|Kalibriert",
"activity.prefill": "Prefill",
"activity.generated": "generiert",
"activity.prefilling": "liest Prompt…",
"mcp.users": "Erlaubte Benutzer",
"mcp.usersPlaceholder": "nur Admins",
"mcp.usersHint": "Benutzernamen mit Komma getrennt oder * für alle. Admins haben immer Zugriff.",
"settings.budgetAction": "Wenn ein Budget aufgebraucht ist",
"settings.budgetWarn": "Nur warnen",
"settings.budgetBlock": "Neue Anfragen blockieren",
"settings.sandbox": "Shell-Sandbox",
"settings.sandboxAuto": "Benutzer (nicht Admins)",
"settings.sandboxAlways": "Alle",
"settings.sandboxOff": "Aus",
"settings.sandboxHint": "Shell-Befehle und Git laufen in einer bubblewrap-Sandbox, in der nur die Ordner des Benutzers beschreibbar sind.",
"users.quota": "Monatskontingent",
"users.quotaHint": "Monatliches Kostenlimit (leer = unbegrenzt)",
"users.quotaPrompt": "Monatliches Kostenlimit für {name} (leer = unbegrenzt):",
"settings.tab.audit": "Audit",
"audit.title": "Audit-Log",
"audit.all": "Alle Aktionen",
"audit.time": "Zeit",
"audit.action": "Aktion",
"audit.detail": "Details",
"audit.backup": "Sicherung",
"audit.backupHint": "ZIP mit der Konfiguration und einer konsistenten Kopie der Datenbank (Sessions, Benutzer, Statistik). Als ${VAR} referenzierte Secrets sind nicht enthalten.",
"audit.download": "Sicherung herunterladen",
"craft.mode": "Craft-Modus",
"craft.modeHint": "Clean Room: nur, was ein Benutzer sieht. Deep: auch Seitenquelltext und Programme (Ghidra) – zum Nachbilden, nicht zum Kopieren.",
"craft.cleanRoom": "Clean Room",
"craft.deep": "Deep",
"settings.tab.tools": "Werkzeuge",
"tools.installed": "installiert",
"tools.install": "Ghidra installieren",
"tools.reinstall": "Installation prüfen / reparieren",
"tools.installing": "Installiere (Download ca. 800 MB, auf ARM wird der Dekompiler kompiliert – das dauert einige Minuten)…",
"tools.ghidraHint": "Mit Ghidra können Agenten im Craft-Deep-Modus Programme dekompilieren (Windows .exe/.dll, Linux, DOS …), um zu verstehen, wie sie funktionieren. Wird samt eigenem JDK ins Daten-Volume installiert.",
"rewind.intro": "Die Unterhaltung wird auf den Stand vor dieser Nachricht zurückgesetzt; du kannst sie bearbeiten und neu senden.",
"rewind.noFiles": "Der Agent hat seitdem keine Dateien geändert.",
"rewind.restore": "Auch die {n} vom Agenten geänderte(n) Datei(en) zurücksetzen",
"rewind.willDelete": "wird gelöscht (neu)",
"rewind.bashNote": "Änderungen durch Shell-Befehle (z. B. installierte Pakete) werden nicht zurückgesetzt.",
"rewind.confirm": "Zurückspulen",
"files.discard": "Verwerfen",
"files.overwrite": "Überschreiben",
"shells.title": "Hintergrund-Shells",
"shells.chip": "{n}/{total} Shells",
"shells.running": "läuft",
"shells.exited": "beendet ({code})",
"shells.stop": "Stoppen",
"shells.noOutput": "(noch keine Ausgabe)",
"login.prompt": "Melde dich an, um fortzufahren.",
"login.invalid": "Ungültiges Token.",
"login.submit": "Anmelden",
@@ -173,7 +241,6 @@ export const de: Messages = {
"chat.statsHint": "Tokens und Kosten dieser Session (Klick für Details)",
"chat.renameHint": "Doppelklick zum Umbenennen",
"chat.rewind": "Ab hier bearbeiten und neu senden",
"chat.rewindConfirm": "Diese Nachricht und alles danach entfernen? Dateiänderungen werden nicht rückgängig gemacht.",
"chat.delete": "Session löschen",
"chat.deleteConfirm": "Diese Session inklusive Subagenten löschen? Die Statistik bleibt erhalten.",
@@ -231,7 +298,12 @@ export const de: Messages = {
"settings.interface": "Oberfläche (dieses Gerät)",
"settings.language": "Sprache",
"settings.theme": "Design",
"settings.themeSystem": "System",
"settings.themeMode": "Modus",
"settings.themeAuto": "Auto",
"settings.themeLight": "Hell",
"settings.themeDark": "Dunkel",
"settings.themeSource": "Farben: {source} ({license})",
"settings.themeToggle": "Hell/Dunkel/Auto umschalten",
"settings.notifications": "Benachrichtigungen",
"settings.notificationsEnable": "Aktivieren",
"settings.notificationsOn": "Aktiv",
@@ -353,6 +425,7 @@ export const de: Messages = {
"stats.other": "Sonstige",
"stats.noData": "Keine Anfragen in diesem Zeitraum.",
"common.ok": "OK",
"common.cancel": "Abbrechen",
"nav.logout": "Abmelden",
"login.username": "Benutzername",
+75 -2
View File
@@ -124,6 +124,74 @@ export const en = {
"git.noDiff": "No differences.",
"composer.attachedFiles": "Attached files (in the project, read them with your tools):",
"composer.uploading": "Uploading {n}…",
"usage.title": "Models and usage in this session",
"usage.period": "Period",
"usage.current": "current",
"usage.model": "Model",
"usage.prices": "Prices per 1M tokens",
"usage.usage": "Usage",
"usage.speed": "Speed",
"usage.cacheWrite": "Cache write",
"usage.contextNow": "Context now",
"usage.totalTime": "Total time",
"usage.inSession": "In this session",
"usage.providerMonth": "Provider this month",
"usage.byAgent": "By agent and model",
"preview.page": "Page {n} / {total}",
"preview.openBrowser": "Open in browser",
"preview.moreRows": "{n} more rows not shown",
"preview.moduleHint": "Tracker module – rendered to audio on the server (first playback may take a moment).",
"activity.phrases": "Pondering|Tinkering|Noodling|Brewing|Conjuring|Mulling|Crafting|Percolating|Ruminating|Whittling|Forging|Musing|Scheming|Untangling|Cogitating|Simmering|Wrangling|Hatching|Spelunking|Finagling|Concocting|Calibrating|Divining|Marinating",
"activity.prefill": "prefill",
"activity.generated": "generated",
"activity.prefilling": "reading prompt…",
"mcp.users": "Allowed users",
"mcp.usersPlaceholder": "admins only",
"mcp.usersHint": "Usernames separated by commas, or * for everybody. Admins always have access.",
"settings.budgetAction": "When a budget is used up",
"settings.budgetWarn": "Warn only",
"settings.budgetBlock": "Block new requests",
"settings.sandbox": "Shell sandbox",
"settings.sandboxAuto": "Users (not admins)",
"settings.sandboxAlways": "Everybody",
"settings.sandboxOff": "Off",
"settings.sandboxHint": "Shell commands and git run in a bubblewrap sandbox with only the user's folders writable.",
"users.quota": "Monthly quota",
"users.quotaHint": "Monthly cost limit (empty = unlimited)",
"users.quotaPrompt": "Monthly cost limit for {name} (empty = unlimited):",
"settings.tab.audit": "Audit",
"audit.title": "Audit log",
"audit.all": "All actions",
"audit.time": "Time",
"audit.action": "Action",
"audit.detail": "Details",
"audit.backup": "Backup",
"audit.backupHint": "ZIP with the configuration and a consistent copy of the database (sessions, users, statistics). Secrets referenced as ${VAR} are not included.",
"audit.download": "Download backup",
"craft.mode": "Craft mode",
"craft.modeHint": "Clean room: only what a user sees. Deep: also page sources and programs (Ghidra) – for re-creating, not copying.",
"craft.cleanRoom": "Clean room",
"craft.deep": "Deep",
"settings.tab.tools": "Tools",
"tools.installed": "installed",
"tools.install": "Install Ghidra",
"tools.reinstall": "Check / repair installation",
"tools.installing": "Installing (download ~800 MB, on ARM the decompiler is compiled – this takes several minutes)…",
"tools.ghidraHint": "Ghidra lets agents in craft Deep mode decompile programs (Windows .exe/.dll, Linux, DOS, …) to study how they work. Installed into the data volume together with its own JDK.",
"rewind.intro": "The conversation is reset to before this message; you can edit and resend it.",
"rewind.noFiles": "The agent did not change files since then.",
"rewind.restore": "Also restore the {n} file(s) the agent changed",
"rewind.willDelete": "will be deleted (new)",
"rewind.bashNote": "Changes made by shell commands (e.g. installed packages) are not restored.",
"rewind.confirm": "Rewind",
"files.discard": "Discard",
"files.overwrite": "Overwrite",
"shells.title": "Background shells",
"shells.chip": "{n}/{total} shells",
"shells.running": "running",
"shells.exited": "exited ({code})",
"shells.stop": "Stop",
"shells.noOutput": "(no output yet)",
"login.prompt": "Sign in to continue.",
"login.invalid": "Invalid token.",
"login.submit": "Sign in",
@@ -172,7 +240,6 @@ export const en = {
"chat.statsHint": "Tokens and cost of this session (click for details)",
"chat.renameHint": "Double-click to rename",
"chat.rewind": "Edit and resend from here",
"chat.rewindConfirm": "Remove this message and everything after it? File changes are not undone.",
"chat.delete": "Delete session",
"chat.deleteConfirm": "Delete this session including its subagents? Statistics are kept.",
@@ -230,7 +297,12 @@ export const en = {
"settings.interface": "Interface (this device)",
"settings.language": "Language",
"settings.theme": "Theme",
"settings.themeSystem": "System",
"settings.themeMode": "Mode",
"settings.themeAuto": "Auto",
"settings.themeLight": "Light",
"settings.themeDark": "Dark",
"settings.themeSource": "Colours: {source} ({license})",
"settings.themeToggle": "Switch light/dark/auto",
"settings.notifications": "Notifications",
"settings.notificationsEnable": "Enable",
"settings.notificationsOn": "Enabled",
@@ -352,6 +424,7 @@ export const en = {
"stats.other": "Other",
"stats.noData": "No requests in this period.",
"common.ok": "OK",
"common.cancel": "Cancel",
"nav.logout": "Sign out",
"login.username": "Username",