Claude Code engine, image viewer, colour tags, checks per turn and more

- Claude Code as an engine: chats on a "claude-code/<alias>" model run through
  the claude CLI (stream-json); tool approvals go through our permission
  system. Sign in from the web UI (URL + pasted code), CLI version and update
  from Settings; the Docker image contains the CLI.
- Small models (8k context) for side tasks: input is cut to the model's
  context window; one-line chat status, "What does this do?" on approvals,
  "Plan as automation" (job draft from a chat).
- Mobile: top bar no longer widens the page, image viewer (zoom, swipe, mark
  up, use in message), jump to previous own message, message menu, time under
  every message.
- Approvals: push actions (allow/reject), "always allow in this project"
  (never for dangerous commands) with revoke.
- Per turn: changed files with diffs and rollback; project check command with
  a green/red badge and "let the agent fix it".
- Colour tags for chats in the colours of the active theme.
- Project defaults for new chats, project page (timeline), offline queue.

Tested in a throwaway container with a mock model (8k small model): 26 API
checks passed (permissions, diffs, checks, defaults, job draft, side-task
budget, Claude Code status/login URL, unsigned-in chat).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Sonnet 5.5 committed 2026-11-14 22:30:12 +01:00
1 parent 084452abf6
commit 62fe5bf467
42 files changed
+3734 -55

No files matched your search

+102
View File
@@ -366,6 +366,98 @@ export const de: Messages = {
"media.showInChat": "Im Chat zeigen",
"media.open": "Öffnen",
"media.prev": "Vorheriges",
"msg.actions": "Nachrichtenaktionen",
"msg.copy": "Text kopieren",
"msg.copied": "Kopiert",
"msg.copyFailed": "Kopieren ist hier nicht möglich",
"msg.quote": "In Antwort zitieren",
"msg.forkHere": "Ab hier abzweigen",
"chat.jumpPrevOwn": "Vorherige eigene Nachricht",
"viewer.annotate": "Markieren",
"viewer.annotateFailed": "Dieses Bild lässt sich nicht bearbeiten",
"viewer.attach": "An Nachricht anhängen",
"viewer.undo": "Rückgängig",
"viewer.tool.pen": "Stift",
"viewer.tool.arrow": "Pfeil",
"viewer.tool.rect": "Rechteck",
"viewer.useInChat": "In Nachricht verwenden",
"viewer.attached": "Bild an die Nachricht angehängt",
"turn.changes": "{n} Datei(en) geändert",
"turn.noChanges": "Für diesen Schritt wurden keine Dateiänderungen gefunden.",
"turn.noDiff": "Kein Text-Diff verfügbar.",
"turn.truncated": "Der Diff ist gekürzt.",
"turn.new": "neu",
"turn.deleted": "gelöscht",
"turn.rollback": "Auf den Stand vor diesem Schritt zurücksetzen",
"job.plan": "Als Automatisierung planen",
"job.planHint": "Macht aus diesem Chat Anweisungen für eine wiederkehrende Automatisierung (aus, bis du den Zeitplan setzt)",
"job.drafting": "Automatisierung wird aus diesem Chat entworfen …",
"color.label": "Farbe dieses Chats",
"color.red": "Rot",
"color.orange": "Orange",
"color.yellow": "Gelb",
"color.green": "Grün",
"color.aqua": "Türkis",
"color.blue": "Blau",
"color.purple": "Violett",
"claude.title": "Claude Code",
"claude.intro": "Chats mit einem „Claude Code“-Modell führt die Claude-Code-CLI auf dem Server aus – mit deinem Claude-Abo oder Anthropic-Console-Konto. Einmal hier anmelden; Freigaben, Push und Sandbox funktionieren wie gewohnt.",
"claude.notInstalled": "Claude Code ist auf dem Server nicht installiert.",
"claude.console": "Anthropic Console (API-Abrechnung) statt Claude-Abo",
"claude.signIn": "Anmelden",
"claude.openLogin": "Anmeldeseite öffnen",
"claude.step1": "Bei Anthropic in einem beliebigen Browser (auch auf einem anderen Gerät) anmelden und den Zugriff erlauben.",
"claude.step2": "Den Code einfügen, den die Seite danach anzeigt:",
"claude.codePlaceholder": "Code von der Anmeldeseite",
"claude.confirm": "Bestätigen",
"claude.signedIn": "Bei Claude Code angemeldet",
"claude.signedInAs": "Angemeldet: {who}",
"claude.expires": "gültig bis {date}",
"claude.logout": "Abmelden",
"claude.logoutConfirm": "Auf dem Server von Claude Code abmelden?",
"claude.version": "CLI {version}",
"claude.updateAvailable": "Update verfügbar: {version}",
"claude.upToDate": "aktuell",
"claude.update": "Update installieren",
"claude.updating": "Installiere …",
"claude.updated": "Claude Code auf {version} aktualisiert",
"claude.updateFailed": "Das Update ist fehlgeschlagen (Details unten)",
"claude.updateAdmin": "Ein Administrator kann es installieren.",
"claude.checkNow": "Nach Updates suchen",
"claude.updateLog": "Ausgabe des Updates",
"check.menu": "Prüfung nach jedem Schritt …",
"check.title": "Prüfung nach jedem Schritt",
"check.hint": "Befehl, der in {project} nach jedem Schritt mit Dateiänderungen läuft (z. B. cargo test, npm test). Das Ergebnis erscheint als Badge am Schritt. Leer = aus.",
"check.saved": "Prüfung gespeichert",
"check.removed": "Prüfung entfernt",
"check.running": "Prüfung läuft …",
"check.passed": "Prüfung bestanden",
"check.failed": "Prüfung fehlgeschlagen",
"check.timeout": "Prüfung: Zeitüberschreitung",
"check.noOutput": "(keine Ausgabe)",
"check.fix": "Vom Agenten beheben lassen",
"check.fixPrompt": "Die Prüfung des Projekts ist nach deiner letzten Änderung fehlgeschlagen. Bitte beheben und erneut ausführen. Ausgabe:",
"projectDefaults.save": "Als Projekt-Standard verwenden",
"projectDefaults.remove": "Projekt-Standard entfernen",
"projectDefaults.hint": "Neue Chats in diesem Projektordner starten mit Modell, Modus, Farbe, Anweisungen und Ordner dieses Chats",
"projectDefaults.saved": "Neue Chats in diesem Projekt starten wie dieser",
"projectDefaults.removed": "Projekt-Standard entfernt",
"outbox.waiting": "{n} Nachricht(en) warten auf eine Verbindung",
"outbox.sendNow": "Jetzt senden",
"outbox.discard": "Verwerfen",
"outbox.saved": "Keine Verbindung – die Nachricht ist gespeichert und wird gesendet, sobald du wieder online bist",
"project.open": "Projektübersicht",
"project.newChat": "Neuer Chat",
"project.today": "Heute",
"project.yesterday": "Gestern",
"project.chats": "{n} Chat(s)",
"project.files": "{n} Datei(en) geändert",
"project.archived": "{n} archiviert",
"project.checksFailed": "{n} Prüfung(en) fehlgeschlagen",
"project.empty": "In diesem Ordner gibt es noch keine Chats.",
"viewer.title": "Bildbetrachter",
"viewer.open": "In neuem Tab öffnen",
"viewer.download": "Herunterladen",
"media.next": "Nächstes",
"media.back": "Zurück zur Übersicht",
"chat.turnUsageHint": "Alle {n} Anfragen dieser Antwort (Tokens gesendet/empfangen, Kosten)",
@@ -724,6 +816,16 @@ export const de: Messages = {
"permission.title": "Freigabe erforderlich",
"permission.allowOnce": "Einmal erlauben",
"permission.projectCommand": "„{prefix}“ in diesem Projekt immer erlauben",
"permission.projectTool": "{tool} in diesem Projekt immer erlauben",
"permission.projectHint": "Wird für diesen Projektordner gemerkt: in allen Chats, auch nach einem Neustart. Widerrufen im ⋯-Menü.",
"permission.explain": "Was macht das?",
"permission.explaining": "Erkläre …",
"permProject.title": "Projekt-Freigaben",
"permProject.intro": "In diesem Projektordner ohne Rückfrage erlaubt (alle Chats):",
"permProject.empty": "Für dieses Projekt ist noch nichts freigegeben. Der Knopf „… in diesem Projekt immer erlauben“ bei einer Freigabe-Anfrage legt hier Einträge an.",
"permProject.revoke": "Widerrufen",
"permProject.menu": "Projekt-Freigaben",
"permission.alwaysTool": "{tool} in dieser Session immer erlauben",
"permission.alwaysCommand": "„{prefix}“ in dieser Session immer erlauben",
"permission.reject": "Ablehnen",