Initial CodeCraft: web-based coding harness for AI models

Rust backend (axum/tokio): agent loop with streaming, tools (fs, bash,
web_fetch, todo, ask_user, subagents, skills, craft snapshots/compare),
permissions with modes and rules, Anthropic + OpenAI-compatible providers,
MCP client (stdio/HTTP, elicitation), SQLite sessions, usage statistics,
compaction, commented TOML config editable via toml_edit.

React PWA: chat with live streaming, permission/question cards, modes
(build/plan/craft), settings for providers/models/prices/MCP/permissions,
raw config editor, statistics dashboard, i18n (en/de). Docker setup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-08 14:39:24 +01:00
commit f3a2fe3816
62 files changed
+21835

No files matched your search

+228
View File
@@ -0,0 +1,228 @@
import type { Messages } from "./en";
export const de: Messages = {
"common.loading": "Lädt…",
"common.save": "Speichern",
"common.add": "Hinzufügen",
"common.edit": "Bearbeiten",
"common.delete": "Löschen",
"common.remove": "Entfernen",
"common.close": "Schließen",
"common.collapse": "Einklappen",
"nav.menu": "Menü",
"nav.settings": "Einstellungen",
"nav.stats": "Statistik",
"login.prompt": "Gib das auf dem Server konfigurierte Zugriffstoken ein.",
"login.token": "Zugriffstoken",
"login.invalid": "Ungültiges Token.",
"login.submit": "Anmelden",
"sidebar.newSession": "Neue Session",
"sidebar.noSessions": "Noch keine Sessions",
"sidebar.today": "Heute",
"sidebar.yesterday": "Gestern",
"sidebar.week": "Letzte 7 Tage",
"sidebar.older": "Älter",
"sidebar.connected": "Verbunden",
"sidebar.disconnected": "Getrennt – verbinde neu…",
"sidebar.needsInput": "Wartet auf deine Eingabe",
"session.untitled": "Neue Session",
"new.title": "Neue Session",
"new.directory": "Projektverzeichnis",
"new.up": "Hoch",
"new.noSubdirs": "Keine Unterverzeichnisse",
"new.model": "Modell",
"new.mode": "Modus",
"new.firstPrompt": "Was soll erledigt werden? (optional)",
"new.start": "Starten in {dir}",
"chat.empty": "Schreib eine Nachricht, um zu starten.",
"chat.reasoning": "Überlegungen",
"chat.thinking": "Arbeitet…",
"chat.compacted": "Unterhaltung komprimiert – Zusammenfassung",
"chat.context": "Kontext",
"chat.contextHint": "{tokens} Tokens in der letzten Anfrage",
"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.",
"composer.placeholder": "Nachricht… (/ für Befehle, Bilder einfügen)",
"composer.placeholderBusy": "Nachricht wird eingereiht und beim nächsten Schritt gesendet…",
"composer.send": "Senden",
"composer.queue": "Einreihen",
"composer.stop": "Stopp",
"composer.mode": "Modus",
"composer.model": "Modell",
"composer.permissionMode": "Berechtigungsmodus",
"composer.attach": "Bilder anhängen",
"command.compact": "Unterhaltung zusammenfassen, um Kontext freizugeben",
"command.new": "Neue Session starten",
"permissionMode.default": "Vor Änderungen fragen",
"permissionMode.accept_edits": "Änderungen automatisch annehmen",
"permissionMode.bypass": "Alles erlauben",
"plan.implement": "Zu Build wechseln und Plan umsetzen",
"plan.implementPrompt": "Setze den Plan um.",
"tool.input": "Eingabe",
"tool.output": "Ausgabe",
"tool.todos": "Aufgaben",
"tool.openSubagent": "Subagent-Session öffnen",
"interaction.fromSubagent": "Vom Subagenten:",
"permission.title": "Freigabe erforderlich",
"permission.allowOnce": "Einmal erlauben",
"permission.alwaysTool": "{tool} in dieser Session immer erlauben",
"permission.alwaysCommand": "„{prefix}“ in dieser Session immer erlauben",
"permission.reject": "Ablehnen",
"permission.rejectWithFeedback": "Mit Rückmeldung ablehnen",
"permission.feedback": "Optional: Sag dem Agenten, was er stattdessen tun soll",
"question.title": "Frage an dich",
"question.fromAgent": "Der Agent braucht eine Entscheidung",
"question.fromMcp": "MCP-Server „{server}“ fragt",
"question.other": "Andere Antwort (Freitext)",
"question.answer": "Deine Antwort",
"question.submit": "Antworten",
"question.dismiss": "Verwerfen",
"settings.tab.general": "Allgemein",
"settings.tab.providers": "Provider & Modelle",
"settings.tab.mcp": "MCP",
"settings.tab.permissions": "Berechtigungen",
"settings.tab.agents": "Agenten & Befehle",
"settings.tab.raw": "Config-Datei",
"settings.saved": "Gespeichert – Änderungen sind aktiv.",
"settings.interface": "Oberfläche (dieses Gerät)",
"settings.language": "Sprache",
"settings.theme": "Design",
"settings.themeSystem": "System",
"settings.themeDark": "Dunkel",
"settings.themeLight": "Hell",
"settings.notifications": "Benachrichtigungen",
"settings.notificationsEnable": "Aktivieren",
"settings.notificationsOn": "Aktiv",
"settings.notificationsHint": "Benachrichtigen, wenn ein Agent eine Frage stellt, während die App im Hintergrund ist.",
"settings.server": "Server",
"settings.workspace": "Workspace",
"settings.defaultModel": "Standardmodell",
"settings.smallModel": "Kleines Modell",
"settings.smallModelHint": "Für Session-Titel. Die Komprimierung nutzt das Session-Modell.",
"settings.currency": "Währung",
"settings.autoCompact": "Auto-Komprimierung bei",
"settings.autoCompactHint": "Anteil des Kontextfensters (0 = aus).",
"settings.craft": "Craft-Modus",
"settings.cleanRoom": "Clean Room",
"settings.cleanRoomHint": "Nur nutzen, was ein Besucher sieht. Aus = Deep-Modus (Quelltext und Skripte dürfen gelesen werden).",
"settings.chromium": "Chromium-Programm",
"settings.widths": "Bildschirmbreiten (px)",
"settings.kind": "Typ",
"settings.baseUrl": "Basis-URL",
"settings.apiKey": "API-Key",
"settings.apiKeyStored": "Gespeichert – leer lassen zum Beibehalten",
"settings.apiKeyHint": "Am besten ${ENV_VAR}-Verweise nutzen; direkte Keys stehen im Klartext in der Config-Datei.",
"settings.authPrefix": "Auth-Präfix",
"settings.enabled": "Aktiv",
"settings.modelCount": "{n} Modelle",
"settings.models": "Modelle & Preise",
"settings.addModel": "Modell",
"settings.addDiscovered": "{n} gefundene hinzufügen",
"settings.pricesHint": "Preise pro 1 Mio. Tokens in der eingestellten Währung. Cache-Preise fallen auf den Input-Preis zurück.",
"settings.modelsEmptyHint": "Keine Modelle eingetragen: Sie werden automatisch beim Provider abgefragt.",
"settings.context": "Kontext",
"settings.maxOutput": "Max. Ausgabe",
"settings.reasoning": "Reasoning",
"settings.vision": "Bilder",
"settings.effort": "Effort",
"settings.priceIn": "Input",
"settings.priceOut": "Output",
"settings.priceCacheRead": "Cache lesen",
"settings.priceCacheWrite": "Cache schreiben",
"settings.addProvider": "Provider hinzufügen",
"settings.providerName": "Name (optional)",
"settings.reloadProviders": "Provider & Modelle neu laden",
"settings.deleteProviderConfirm": "Provider „{name}“ löschen?",
"settings.invalidName": "Namen dürfen nur Buchstaben, Ziffern, - und _ enthalten.",
"settings.name": "Name",
"settings.addMcp": "MCP-Server hinzufügen",
"settings.deleteMcpConfirm": "MCP-Server „{name}“ löschen?",
"settings.rawHint": "Die komplette Konfigurationsdatei inklusive Kommentaren. Sie wird vor dem Speichern geprüft.",
"settings.revert": "Zurücksetzen",
"mcp.reconnect": "Alle neu verbinden",
"mcp.none": "Keine MCP-Server konfiguriert.",
"mcp.tools": "{n} Tools",
"mcp.command": "Befehl",
"mcp.args": "Argumente (eins pro Zeile)",
"mcp.env": "Umgebung (KEY=Wert)",
"mcp.headers": "Header (Name: Wert)",
"mcp.state.disabled": "deaktiviert",
"mcp.state.connecting": "verbinde…",
"mcp.state.connected": "verbunden",
"mcp.state.failed": "Fehler",
"mcp.state.unknown": "nicht gestartet",
"permissions.intro": "Regeln für die Tool-Nutzung. „Fragen“ zeigt eine Freigabekarte. MCP-Tools: mcp__<server>__<tool>, Platzhalter erlaubt (mcp__*).",
"permissions.tools": "Tools",
"permissions.bash": "Shell-Befehle",
"permissions.bashHint": "Glob-Muster auf den ganzen Befehl. Zusammengesetzte Befehle (&&, ;, |) sind nur erlaubt, wenn jeder Teil erlaubt ist.",
"permissions.tool": "Tool",
"permissions.pattern": "Muster",
"permissions.rule": "Regel",
"permissions.allow": "Erlauben",
"permissions.ask": "Fragen",
"permissions.deny": "Verbieten",
"agents.intro": "Modi und Subagenten. Eigene in der Config-Datei ([agents.*]) oder als Markdown in .codecraft/agents bzw. .claude/agents anlegen.",
"agents.title": "Agenten",
"agents.readOnly": "nur lesen",
"agents.commands": "Slash-Befehle",
"agents.skills": "Skills",
"stats.range7": "7 Tage",
"stats.range30": "30 Tage",
"stats.range90": "90 Tage",
"stats.range365": "1 Jahr",
"stats.rangeAll": "Alles",
"stats.tableView": "Tabellenansicht",
"stats.chartView": "Diagrammansicht",
"stats.cost": "Kosten",
"stats.perRequest": "{v} pro Anfrage",
"stats.requests": "Anfragen",
"stats.errors": "{n} fehlgeschlagen",
"stats.input": "Input",
"stats.output": "Output",
"stats.cacheRead": "Cache gelesen",
"stats.cacheHit": "Cache-Trefferquote",
"stats.tokens": "Tokens",
"stats.ttft": "Zeit bis zum ersten Token",
"stats.ttftHint": "Durchschnittliche Prefill-Wartezeit",
"stats.outputSpeed": "Ausgabegeschwindigkeit",
"stats.prefillSpeed": "Prefill-Geschwindigkeit",
"stats.costPerDay": "Kosten pro Tag nach Modell",
"stats.tokensPerDay": "Tokens pro Tag",
"stats.heatmap": "Aktivität nach Wochentag und Uhrzeit",
"stats.byModel": "Nach Modell",
"stats.byProvider": "Nach Provider",
"stats.byAgent": "Nach Modus",
"stats.topSessions": "Teuerste Sessions",
"stats.perDay": "Pro Tag",
"stats.day": "Tag",
"stats.model": "Modell",
"stats.provider": "Provider",
"stats.agent": "Modus",
"stats.session": "Session",
"stats.total": "Gesamt",
"stats.other": "Sonstige",
"stats.noData": "Keine Anfragen in diesem Zeitraum.",
};