* feat(i18n): add Korean translation, fix zh-CN drift, cover hardcoded strings
Adds Korean (ko) as the third web UI language, brings zh-CN back into
parity with en, converts ~80 hardcoded English strings in app.js into
i18n keys, and installs a pre-commit hook that prevents future drift.
## Korean web UI
- New `src/channels/web/static/i18n/ko.js` — full translation of all
663 keys, mirroring the structure of `en.js`/`zh-CN.js`
- New `src/channels/web/server.rs` route `/i18n/ko.js` + handler
- New language menu button in `index.html`
- Browser auto-detect now special-cases `ko-*` (in addition to `zh-*`)
so Korean visitors land on Korean by default
- Toast label map in `i18n-app.js` becomes a small lookup table so the
next language is a single-line addition
## zh-CN drift fix
`zh-CN.js` was missing 9 keys that had been added to `en.js` after the
Chinese pack was last touched (`config.telegramOpenBot`,
`settings.tools`, and 7 keys under the `tools.*` namespace for the new
Tool Permissions tab). Backfilled with Chinese translations so users on
the Tools settings panel see proper labels instead of raw key strings.
## Hardcoded strings in app.js
`app.js` had ~80 user-facing English string literals that bypassed
`I18n.t()` entirely — toasts, confirms, alerts, button labels, meta-item
labels for jobs/routines/missions detail panels, the theme dynamic
label, dynamic auth states ("Connecting...", "Authenticated"), etc.
These were invisible to the language switcher and would always render
in English regardless of the user's choice.
Replaced every literal with `I18n.t('key', { ...placeholders })` and
added the corresponding ~95 new keys to `en.js`, `zh-CN.js`, AND `ko.js`
in lockstep so all three packs stay at 663 keys with identical key sets
and matching `{name}`-style placeholder tokens.
Existing keys were reused where possible (`message.copy`,
`approval.approved`, `connection.reconnected`, etc.).
## Pre-commit parity hook
New `scripts/check-i18n-parity.sh` (pure POSIX bash, no Node) verifies:
1. No duplicate keys within any single language file
2. Every language has the same key set as `en.js` (the source of truth)
3. Placeholder tokens like `{name}`, `{count}` match across all
languages — catches the silent bug where a translator drops an
interpolation token
Wired into both pre-commit hook install paths:
- `scripts/pre-commit-safety.sh` (installed by `dev-setup.sh` as a
symlink at `.git/hooks/pre-commit`; symlink is followed via
`readlink` so the script location resolves correctly)
- `.githooks/pre-commit` (used when devs set
`git config core.hooksPath .githooks`)
Both block the commit on failure with a clear error message and the
`git commit --no-verify` escape hatch. Tested by deliberately removing
a key from `ko.js` (caught) and stripping a `{path}` placeholder
(caught).
## Korean README
New `README.ko.md` — full Korean translation of `README.md`. Follows
the layout of `README.ja.md` (6-item single-word ToC to keep anchors
clean for non-Latin headings). All code blocks, image paths, and badge
URLs preserved verbatim.
`한국어` link added to the language switcher in all 5 READMEs
(`README.md`, `.zh-CN.md`, `.ru.md`, `.ja.md`, and the new `.ko.md`).
## Verification
- `./scripts/check-i18n-parity.sh` — `OK (663 keys × 3 languages)`
- `node --check` clean on every modified JS file
- Three-way parity: identical sorted key sets across en/zh-CN/ko, zero
placeholder mismatches
- Hook tested by removing/mutating keys and confirming the commit is
blocked
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(i18n): address PR review feedback [skip-regression-check]
Addresses 6 review comments on #2065. All changes are in
src/channels/web/static/ (per .claude/rules/review-discipline.md
exemption) plus a bash helper script — no Rust code is touched.
## scripts/check-i18n-parity.sh
- **Portable mktemp** (Copilot): bare `mktemp` works on GNU but BSD/macOS
`mktemp` requires an explicit template with at least 6 trailing X's.
Wrap in a small `mktemp_file()` helper that always passes a template
(`${TMPDIR:-/tmp}/check-i18n-parity.XXXXXX`) so the script runs on
every platform.
- **Symlink-attack-prone /tmp path** (gemini-code-assist): the
placeholder-mismatch buffer was using `/tmp/i18n-ph-mismatch.$$`,
which is predictable and vulnerable to symlink races in shared
/tmp. Replace with `mktemp_file()` for consistency with the rest
of the script.
## src/channels/web/static/app.js
- **Hardcoded `'Mode'` label** (gemini): jobs detail meta-grid had
`metaItem('Mode', job.job_mode)` — convert to
`I18n.t('jobs.mode')` and add the new key to all 3 language packs.
- **Hardcoded `'Yes'`/`'No'`** (Copilot): routine detail showed
`routine.enabled ? 'Yes' : 'No'` even though the surrounding labels
were translated. Reuse the existing `settings.on`/`settings.off`
keys ("On"/"Off") which already render in all languages.
- **Hardcoded `'N/A'`** (Copilot): mission detail showed
`m.next_fire_at ? formatDate(...) : 'N/A'`. Reuse the existing
`common.noData` key. Also fixed the same pattern in the TEE popover
(`renderTeePopover`) where `'N/A'` was used as a fallback for
three different attestation fields, since fixing the pattern
across the file is the principled response per the repo's
review-discipline rule.
## src/channels/web/static/i18n-app.js
- **Hardcoded `LANG_LABELS` map** (gemini): the language-switch toast
was reading from a per-call `{ 'en': 'English', 'zh-CN': '简体中文',
'ko': '한국어' }` literal that would grow with every new language
and drift from the actual supported set. Move each language's own
native name into its own pack under a new `language.name` key:
en.js → 'language.name': 'English'
zh-CN.js → 'language.name': '简体中文'
ko.js → 'language.name': '한국어'
Then the toast becomes `I18n.t('language.switch') + ': ' +
I18n.t('language.name')` — both halves are read from the language
pack that was just switched in, so the entire toast appears in the
newly selected language. Adding a future language is now a single
key addition with NO changes to i18n-app.js.
## Verification
$ ./scripts/check-i18n-parity.sh
i18n parity: OK (665 keys × 3 languages)
$ cargo test --lib
test result: ok. 4241 passed; 0 failed; 3 ignored
Three-way parity preserved with the 2 new keys (`jobs.mode` and
`language.name`) added to all three language packs in lockstep.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
20 KiB
IronClaw
Ваш защищенный персональный AI-ассистент, всегда на вашей стороне
English | 简体中文 | Русский | 日本語 | 한국어
Философия • Возможности • Установка • Конфигурация • Безопасность • Архитектура
Философия
IronClaw построен на простом принципе: ваш AI-ассистент должен работать на вас, а не против вас.
В мире, где системы ИИ становятся все более непрозрачными в вопросах обработки данных и ориентируются на корпоративные интересы, IronClaw выбирает другой путь:
- Ваши данные остаются вашими — вся информация хранится локально, зашифрована и никогда не покидает ваш контроль.
- Прозрачность по умолчанию — открытый исходный код, возможность аудита, отсутствие скрытой телеметрии или сбора данных.
- Саморасширяемые возможности — создавайте новые инструменты «на лету», не дожидаясь обновлений от вендора.
- Глубокая защита — несколько уровней безопасности защищают от инъекций промптов и утечки данных.
IronClaw — это AI-ассистент, которому вы действительно можете доверять в личной и профессиональной жизни.
Возможности
Безопасность прежде всего
- Песочница WASM — непроверенные инструменты запускаются в изолированных контейнерах WebAssembly с правами на основе возможностей.
- Защита учетных данных — секреты никогда не раскрываются инструментам; они внедряются на границе хоста с детектированием утечек.
- Защита от инъекций промптов — обнаружение паттернов, очистка контента и применение политик безопасности.
- Список разрешенных эндпоинтов — HTTP-запросы только к явно одобренным хостам и путям.
Всегда доступен
- Многоканальность — REPL, HTTP-вебхуки, WASM-каналы (Telegram, Slack) и веб-шлюз.
- Песочница Docker — изолированное выполнение контейнеров с токенами для каждого задания и паттерном «оркестратор/воркер».
- Веб-шлюз — браузерный интерфейс с потоковой передачей данных в реальном времени через SSE/WebSocket.
- Рутины (Routines) — расписания cron, триггеры событий, обработчики вебхуков для фоновой автоматизации.
- Система Heartbeat — проактивное фоновое выполнение задач мониторинга и обслуживания.
- Параллельные задания — одновременная обработка нескольких запросов с изолированными контекстами.
- Самовосстановление — автоматическое обнаружение и восстановление зависших операций.
Саморасширяемый
- Динамическое создание инструментов — опишите, что вам нужно, и IronClaw создаст это как инструмент WASM.
- Протокол MCP — подключайтесь к серверам Model Context Protocol для получения дополнительных возможностей.
- Плагинная архитектура — добавляйте новые инструменты WASM и каналы без перезагрузки системы.
Постоянная память
- Гибридный поиск — полнотекстовый + векторный поиск с использованием Reciprocal Rank Fusion.
- Файловая система Workspace — гибкое хранилище на основе путей для заметок, логов и контекста.
- Файлы идентичности (Identity Files) — сохранение индивидуальности и предпочтений между сессиями.
Установка
Предварительные условия
- Rust 1.85+
- PostgreSQL 15+ с расширением pgvector
- Аккаунт NEAR AI (аутентификация через мастер настройки)
Загрузка и сборка
Посетите страницу релизов, чтобы увидеть последние обновления.
Установка через установщик Windows (Windows)
Загрузите Windows Installer и запустите его.
Установка через powershell-скрипт (Windows)
irm https://github.com/nearai/ironclaw/releases/latest/download/ironclaw-installer.ps1 | iex
Установка через shell-скрипт (macOS, Linux, Windows/WSL)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/nearai/ironclaw/releases/latest/download/ironclaw-installer.sh | sh
Установка через Homebrew (macOS/Linux)
brew install ironclaw
Компиляция из исходного кода (Cargo на Windows, Linux, macOS)
Для установки используйте cargo, предварительно убедившись, что у вас установлен Rust.
# Клонируйте репозиторий
git clone https://github.com/nearai/ironclaw.git
cd ironclaw
# Сборка
cargo build --release
# Запуск тестов
cargo test
Для полного релиза (после модификации исходников каналов) выполните ./scripts/build-all.sh, чтобы сначала пересобрать каналы.
Настройка базы данных
# Создание базы данных
createdb ironclaw
# Включение pgvector
psql ironclaw -c "CREATE EXTENSION IF NOT EXISTS vector;"
Конфигурация
Запустите мастер настройки для конфигурации IronClaw:
ironclaw onboard
Мастер настройки поможет установить соединение с базой данных, пройти аутентификацию NEAR AI (через браузер OAuth) и настроить шифрование секретов (используя системную связку ключей). Настройки сохраняются в базе данных; базовые переменные (например, DATABASE_URL, LLM_BACKEND) записываются в ~/.ironclaw/.env, чтобы они были доступны до подключения к БД.
Альтернативные LLM-провайдеры
IronClaw по умолчанию использует NEAR AI, но поддерживает множество LLM-провайдеров из коробки. Встроенные провайдеры включают Anthropic, OpenAI, Google Gemini, MiniMax, Mistral и Ollama (локально). Также поддерживаются OpenAI-совместимые сервисы: OpenRouter (300+ моделей), Together AI, Fireworks AI и собственные серверы (vLLM, LiteLLM).
Выберите провайдера в мастере настройки или установите переменные окружения напрямую:
# Пример: MiniMax (встроенный, контекст 204K)
LLM_BACKEND=minimax
MINIMAX_API_KEY=...
# Пример: OpenAI-совместимый эндпоинт
LLM_BACKEND=openai_compatible
LLM_BASE_URL=https://openrouter.ai/api/v1
LLM_API_KEY=sk-or-...
LLM_MODEL=anthropic/claude-sonnet-4
Смотрите docs/LLM_PROVIDERS.md для получения полного руководства по провайдерам.
Безопасность
IronClaw реализует эшелонированную защиту для обеспечения безопасности ваших данных и предотвращения злоупотреблений.
Песочница WASM
Все непроверенные инструменты запускаются в изолированных контейнерах WebAssembly:
- Права на основе возможностей — явное разрешение на HTTP, доступ к секретам, вызов инструментов.
- Список разрешенных эндпоинтов — HTTP-запросы только к одобренным хостам/путям.
- Внедрение учетных данных — секреты внедряются на границе хоста и никогда не раскрываются коду WASM.
- Детектирование утечек — сканирование запросов и ответов на попытки кражи секретов.
- Ограничение частоты запросов — лимиты для каждого инструмента для предотвращения злоупотреблений.
- Лимиты ресурсов — ограничения по памяти, процессору и времени выполнения.
WASM ──► Валидатор ──► Сканер ───► Инъектор ──► Выполнение ──► Сканер ───► WASM
хостов утечек секретов запроса утечек
(запрос) (ответ)
Защита от инъекций промптов
Внешний контент проходит через несколько уровней безопасности:
- Обнаружение попыток инъекций на основе паттернов.
- Очистка и экранирование контента.
- Правила политик с уровнями серьезности (Блокировка/Предупреждение/Проверка/Очистка).
- Обертывание вывода инструментов для безопасного внедрения в контекст LLM.
Защита данных
- Все данные хранятся локально в вашей базе данных PostgreSQL.
- Секреты зашифрованы с использованием AES-256-GCM.
- Никакой телеметрии, аналитики или обмена данными.
- Полный журнал аудита выполнения всех инструментов.
Архитектура
┌────────────────────────────────────────────────────────────────┐
│ Каналы │
│ ┌──────┐ ┌──────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ REPL │ │ HTTP │ │WASM-каналы │ │ Веб-шлюз │ │
│ └──┬───┘ └──┬───┘ └──────┬──────┘ │ (SSE + WS) │ │
│ │ │ │ └──────┬──────┘ │
│ └─────────┴──────────────┴────────────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ Цикл агента │ Маршрутизация │
│ └────┬──────────┬───┘ намерений │
│ │ │ │
│ ┌──────────▼────┐ ┌──▼───────────────┐ │
│ │ Планировщик │ │ Движок рутин │ │
│ │ (пар. задачи) │ │(cron, соб., wh) │ │
│ └──────┬────────┘ └────────┬─────────┘ │
│ │ │ │
│ ┌─────────────┼────────────────────┘ │
│ │ │ │
│ ┌───▼─────┐ ┌────▼────────────────┐ │
│ │ Локальн.│ │ Оркестратор │ │
│ │ воркеры │ │ ┌───────────────┐ │ │
│ │(in-proc)│ │ │ Песочница │ │ │
│ └───┬─────┘ │ │ Docker │ │ │
│ │ │ │ ┌───────────┐ │ │ │
│ │ │ │ │Воркер / CC│ │ │ │
│ │ │ │ └───────────┘ │ │ │
│ │ │ └───────────────┘ │ │
│ │ └─────────┬───────────┘ │
│ └──────────────────┤ │
│ │ │
│ ┌───────────▼──────────┐ │
│ │ Реестр инструментов │ │
│ │ Встроенные, MCP, WASM│ │
│ └──────────────────────┘ │
└────────────────────────────────────────────────────────────────┘
Основные компоненты
| Компонент | Назначение |
|---|---|
| Цикл агента | Основная обработка сообщений и координация задач |
| Роутер | Классификация намерений пользователя (команда, запрос, задача) |
| Планировщик | Управление выполнением параллельных задач с приоритетами |
| Воркер | Выполнение задач с рассуждениями LLM и вызовами инструментов |
| Оркестратор | Жизненный цикл контейнеров, проксирование LLM, аутентификация для каждой задачи |
| Веб-шлюз | Браузерный интерфейс (чат, память, задачи, логи, расширения, рутины) |
| Движок рутин | Фоновые задачи: запланированные (cron) и реактивные (события, вебхуки) |
| Workspace | Постоянная память с гибридным поиском |
| Слой безопасности | Защита от инъекций промптов и очистка контента |
Использование
# Первоначальная настройка (БД, аутентификация и т.д.)
ironclaw onboard
# Запуск интерактивного REPL
cargo run
# С отладочными логами
RUST_LOG=ironclaw=debug cargo run
Разработка
# Форматирование кода
cargo fmt
# Линтинг
cargo clippy --all --benches --tests --examples --all-features
# Запуск тестов
createdb ironclaw_test
cargo test
# Запуск конкретного теста
cargo test название_теста
- Telegram-канал: Смотрите docs/TELEGRAM_SETUP.md для настройки и привязки аккаунта.
- Изменение исходников каналов: Перед
cargo buildвыполните./channels-src/telegram/build.sh, чтобы обновить встроенный WASM.
Наследие OpenClaw
IronClaw — это реализация на Rust, вдохновленная проектом OpenClaw. Полную матрицу соответствия функций можно найти в FEATURE_PARITY.md.
Ключевые отличия:
- Rust vs TypeScript — нативная производительность, безопасность памяти, один бинарный файл.
- Песочница WASM vs Docker — легковесность, безопасность на основе возможностей.
- PostgreSQL vs SQLite — надежное хранилище, готовое к продакшну.
- Безопасность прежде всего — многослойная защита, сохранность учетных данных.
Лицензия
Лицензировано по вашему выбору:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
