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 en = {
"media.open": "Open",
"media.prev": "Previous",
"media.next": "Next",
"msg.actions": "Message actions",
"msg.copy": "Copy text",
"msg.copied": "Copied",
"msg.copyFailed": "Copying is not possible here",
"msg.quote": "Quote in reply",
"msg.forkHere": "Fork from here",
"chat.jumpPrevOwn": "Previous own message",
"viewer.annotate": "Mark up",
"viewer.annotateFailed": "This image cannot be edited",
"viewer.attach": "Attach to message",
"viewer.undo": "Undo",
"viewer.tool.pen": "Pen",
"viewer.tool.arrow": "Arrow",
"viewer.tool.rect": "Rectangle",
"viewer.useInChat": "Use in message",
"viewer.attached": "Image attached to the message",
"turn.changes": "{n} file(s) changed",
"turn.noChanges": "No file changes found for this turn.",
"turn.noDiff": "No text diff available.",
"turn.truncated": "The diff is shortened.",
"turn.new": "new",
"turn.deleted": "deleted",
"turn.rollback": "Roll back to before this turn",
"job.plan": "Plan as automation",
"job.planHint": "Turns this chat into instructions for a recurring automation (switched off until you set the schedule)",
"job.drafting": "Drafting the automation from this chat …",
"color.label": "Colour of this chat",
"color.red": "Red",
"color.orange": "Orange",
"color.yellow": "Yellow",
"color.green": "Green",
"color.aqua": "Teal",
"color.blue": "Blue",
"color.purple": "Purple",
"claude.title": "Claude Code",
"claude.intro": "Chats with a \"Claude Code\" model are run by the Claude Code CLI on the server – with your Claude subscription or Anthropic Console account. Sign in here once; approvals, push and the sandbox work as usual.",
"claude.notInstalled": "Claude Code is not installed on the server.",
"claude.console": "Anthropic Console (API billing) instead of the Claude subscription",
"claude.signIn": "Sign in",
"claude.openLogin": "Open the sign-in page",
"claude.step1": "Sign in at Anthropic in any browser (also on another device) and allow access.",
"claude.step2": "Paste the code the page shows afterwards:",
"claude.codePlaceholder": "Code from the sign-in page",
"claude.confirm": "Confirm",
"claude.signedIn": "Signed in to Claude Code",
"claude.signedInAs": "Signed in: {who}",
"claude.expires": "valid until {date}",
"claude.logout": "Sign out",
"claude.logoutConfirm": "Sign out of Claude Code on the server?",
"claude.version": "CLI {version}",
"claude.updateAvailable": "Update available: {version}",
"claude.upToDate": "up to date",
"claude.update": "Install update",
"claude.updating": "Installing …",
"claude.updated": "Claude Code updated to {version}",
"claude.updateFailed": "The update failed (details below)",
"claude.updateAdmin": "An administrator can install it.",
"claude.checkNow": "Check for updates",
"claude.updateLog": "Output of the update",
"check.menu": "Check after each turn …",
"check.title": "Check after each turn",
"check.hint": "Command that runs in {project} after every turn that changed files (e.g. cargo test, npm test). The result appears as a badge on the turn. Empty = off.",
"check.saved": "Check saved",
"check.removed": "Check removed",
"check.running": "Check running …",
"check.passed": "Check passed",
"check.failed": "Check failed",
"check.timeout": "Check timed out",
"check.noOutput": "(no output)",
"check.fix": "Let the agent fix it",
"check.fixPrompt": "The check of the project failed after your last change. Please fix the cause and run it again. Output:",
"projectDefaults.save": "Use as project default",
"projectDefaults.remove": "Remove project default",
"projectDefaults.hint": "New chats in this project folder start with this chat's model, mode, colour, instructions and folder",
"projectDefaults.saved": "New chats in this project will start like this one",
"projectDefaults.removed": "Project default removed",
"outbox.waiting": "{n} message(s) waiting for a connection",
"outbox.sendNow": "Send now",
"outbox.discard": "Discard",
"outbox.saved": "No connection – the message is saved and sent when you are back online",
"project.open": "Project overview",
"project.newChat": "New chat",
"project.today": "Today",
"project.yesterday": "Yesterday",
"project.chats": "{n} chat(s)",
"project.files": "{n} file(s) changed",
"project.archived": "{n} archived",
"project.checksFailed": "{n} failed check(s)",
"project.empty": "No chats in this folder yet.",
"viewer.title": "Image viewer",
"viewer.open": "Open in new tab",
"viewer.download": "Download",
"media.back": "Back to the overview",
"chat.turnUsageHint": "All {n} requests of this answer (tokens sent/received, cost)",
"chat.reviewRound": "Review {round}: changes requested",
@@ -723,6 +815,16 @@ export const en = {
"permission.title": "Permission required",
"permission.allowOnce": "Allow once",
"permission.projectCommand": "Always allow \"{prefix}\" in this project",
"permission.projectTool": "Always allow {tool} in this project",
"permission.projectHint": "Remembered for this project folder, in all chats, also after a restart. Revoke it in the ⋯ menu.",
"permission.explain": "What does this do?",
"permission.explaining": "Explaining …",
"permProject.title": "Project permissions",
"permProject.intro": "Allowed without asking in this project folder (all chats):",
"permProject.empty": "Nothing is allowed for this project yet. The button \"Always allow … in this project\" on an approval adds entries here.",
"permProject.revoke": "Revoke",
"permProject.menu": "Project permissions",
"permission.alwaysTool": "Always allow {tool} in this session",
"permission.alwaysCommand": "Always allow \"{prefix}\" in this session",
"permission.reject": "Reject",