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

+229
View File
@@ -0,0 +1,229 @@
// Reference language. Every other language must define the same keys.
export const en = {
"common.loading": "Loading…",
"common.save": "Save",
"common.add": "Add",
"common.edit": "Edit",
"common.delete": "Delete",
"common.remove": "Remove",
"common.close": "Close",
"common.collapse": "Collapse",
"nav.menu": "Menu",
"nav.settings": "Settings",
"nav.stats": "Statistics",
"login.prompt": "Enter the access token configured on the server.",
"login.token": "Access token",
"login.invalid": "Invalid token.",
"login.submit": "Sign in",
"sidebar.newSession": "New session",
"sidebar.noSessions": "No sessions yet",
"sidebar.today": "Today",
"sidebar.yesterday": "Yesterday",
"sidebar.week": "Last 7 days",
"sidebar.older": "Older",
"sidebar.connected": "Connected",
"sidebar.disconnected": "Disconnected – reconnecting…",
"sidebar.needsInput": "Waiting for your input",
"session.untitled": "New session",
"new.title": "New session",
"new.directory": "Project directory",
"new.up": "Up",
"new.noSubdirs": "No subdirectories",
"new.model": "Model",
"new.mode": "Mode",
"new.firstPrompt": "What should be done? (optional)",
"new.start": "Start in {dir}",
"chat.empty": "Send a message to start.",
"chat.reasoning": "Reasoning",
"chat.thinking": "Working…",
"chat.compacted": "Conversation compacted – summary",
"chat.context": "Context",
"chat.contextHint": "{tokens} tokens in the last request",
"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.",
"composer.placeholder": "Message… (/ for commands, paste images)",
"composer.placeholderBusy": "Message is queued and sent at the next step…",
"composer.send": "Send",
"composer.queue": "Queue",
"composer.stop": "Stop",
"composer.mode": "Mode",
"composer.model": "Model",
"composer.permissionMode": "Permission mode",
"composer.attach": "Attach images",
"command.compact": "Summarize the conversation to free up context",
"command.new": "Start a new session",
"permissionMode.default": "Ask before changes",
"permissionMode.accept_edits": "Auto-accept edits",
"permissionMode.bypass": "Allow everything",
"plan.implement": "Switch to build and implement the plan",
"plan.implementPrompt": "Implement the plan.",
"tool.input": "Input",
"tool.output": "Output",
"tool.todos": "Tasks",
"tool.openSubagent": "Open subagent session",
"interaction.fromSubagent": "From subagent:",
"permission.title": "Permission required",
"permission.allowOnce": "Allow once",
"permission.alwaysTool": "Always allow {tool} in this session",
"permission.alwaysCommand": "Always allow \"{prefix}\" in this session",
"permission.reject": "Reject",
"permission.rejectWithFeedback": "Reject with feedback",
"permission.feedback": "Optional: tell the agent what to do instead",
"question.title": "Question for you",
"question.fromAgent": "The agent needs a decision",
"question.fromMcp": "MCP server \"{server}\" asks",
"question.other": "Other (free text)",
"question.answer": "Your answer",
"question.submit": "Answer",
"question.dismiss": "Dismiss",
"settings.tab.general": "General",
"settings.tab.providers": "Providers & models",
"settings.tab.mcp": "MCP",
"settings.tab.permissions": "Permissions",
"settings.tab.agents": "Agents & commands",
"settings.tab.raw": "Config file",
"settings.saved": "Saved – changes are active.",
"settings.interface": "Interface (this device)",
"settings.language": "Language",
"settings.theme": "Theme",
"settings.themeSystem": "System",
"settings.themeDark": "Dark",
"settings.themeLight": "Light",
"settings.notifications": "Notifications",
"settings.notificationsEnable": "Enable",
"settings.notificationsOn": "Enabled",
"settings.notificationsHint": "Notify when an agent asks a question while the app is in the background.",
"settings.server": "Server",
"settings.workspace": "Workspace",
"settings.defaultModel": "Default model",
"settings.smallModel": "Small model",
"settings.smallModelHint": "Used for session titles. Compaction uses the session model.",
"settings.currency": "Currency",
"settings.autoCompact": "Auto-compact at",
"settings.autoCompactHint": "Fraction of the context window (0 = off).",
"settings.craft": "Craft mode",
"settings.cleanRoom": "Clean room",
"settings.cleanRoomHint": "Only use what a visitor sees. Off = deep mode (page source and scripts may be read).",
"settings.chromium": "Chromium binary",
"settings.widths": "Screen widths (px)",
"settings.kind": "Type",
"settings.baseUrl": "Base URL",
"settings.apiKey": "API key",
"settings.apiKeyStored": "Stored – leave empty to keep",
"settings.apiKeyHint": "Prefer ${ENV_VAR} references; literal keys are stored in plain text in the config file.",
"settings.authPrefix": "Auth prefix",
"settings.enabled": "Enabled",
"settings.modelCount": "{n} models",
"settings.models": "Models & prices",
"settings.addModel": "Model",
"settings.addDiscovered": "Add {n} discovered",
"settings.pricesHint": "Prices per 1M tokens in the configured currency. Cache prices default to the input price.",
"settings.modelsEmptyHint": "No models listed: they are discovered automatically from the provider.",
"settings.context": "Context",
"settings.maxOutput": "Max output",
"settings.reasoning": "Reasoning",
"settings.vision": "Vision",
"settings.effort": "Effort",
"settings.priceIn": "Input",
"settings.priceOut": "Output",
"settings.priceCacheRead": "Cache read",
"settings.priceCacheWrite": "Cache write",
"settings.addProvider": "Add provider",
"settings.providerName": "Name (optional)",
"settings.reloadProviders": "Reload providers & models",
"settings.deleteProviderConfirm": "Delete provider \"{name}\"?",
"settings.invalidName": "Names may only contain letters, digits, - and _.",
"settings.name": "Name",
"settings.addMcp": "Add MCP server",
"settings.deleteMcpConfirm": "Delete MCP server \"{name}\"?",
"settings.rawHint": "The complete configuration file including comments. It is validated before saving.",
"settings.revert": "Revert",
"mcp.reconnect": "Reconnect all",
"mcp.none": "No MCP servers configured.",
"mcp.tools": "{n} tools",
"mcp.command": "Command",
"mcp.args": "Arguments (one per line)",
"mcp.env": "Environment (KEY=value)",
"mcp.headers": "Headers (Name: value)",
"mcp.state.disabled": "disabled",
"mcp.state.connecting": "connecting…",
"mcp.state.connected": "connected",
"mcp.state.failed": "failed",
"mcp.state.unknown": "not started",
"permissions.intro": "Rules for tool use. \"Ask\" shows an approval card. MCP tools: mcp__<server>__<tool>, wildcards allowed (mcp__*).",
"permissions.tools": "Tools",
"permissions.bash": "Shell commands",
"permissions.bashHint": "Glob patterns on the full command. Compound commands (&&, ;, |) are only allowed if every part is.",
"permissions.tool": "Tool",
"permissions.pattern": "Pattern",
"permissions.rule": "Rule",
"permissions.allow": "Allow",
"permissions.ask": "Ask",
"permissions.deny": "Deny",
"agents.intro": "Modes and subagents. Add your own in the config file ([agents.*]) or as Markdown in .codecraft/agents or .claude/agents.",
"agents.title": "Agents",
"agents.readOnly": "read-only",
"agents.commands": "Slash commands",
"agents.skills": "Skills",
"stats.range7": "7 days",
"stats.range30": "30 days",
"stats.range90": "90 days",
"stats.range365": "1 year",
"stats.rangeAll": "All",
"stats.tableView": "Table view",
"stats.chartView": "Chart view",
"stats.cost": "Cost",
"stats.perRequest": "{v} per request",
"stats.requests": "Requests",
"stats.errors": "{n} failed",
"stats.input": "Input",
"stats.output": "Output",
"stats.cacheRead": "Cache read",
"stats.cacheHit": "Cache hit rate",
"stats.tokens": "Tokens",
"stats.ttft": "Time to first token",
"stats.ttftHint": "Average prefill wait",
"stats.outputSpeed": "Output speed",
"stats.prefillSpeed": "Prefill speed",
"stats.costPerDay": "Cost per day by model",
"stats.tokensPerDay": "Tokens per day",
"stats.heatmap": "Activity by weekday and hour",
"stats.byModel": "By model",
"stats.byProvider": "By provider",
"stats.byAgent": "By mode",
"stats.topSessions": "Most expensive sessions",
"stats.perDay": "Per day",
"stats.day": "Day",
"stats.model": "Model",
"stats.provider": "Provider",
"stats.agent": "Mode",
"stats.session": "Session",
"stats.total": "Total",
"stats.other": "Other",
"stats.noData": "No requests in this period.",
};
export type Messages = Record<keyof typeof en, string>;