- i18n.svelte.ts: store with $state locale + createIntl(), t() function,
formatDate/Number/RelativeTime, getDir() for RTL, async setLocale()
- i18n.types.ts: TranslationKey union (codegen from en.json)
- locales/en.json: 200+ strings in ICU MessageFormat
- locales/pl.json: full Polish translation
- locales/ar.json: partial Arabic (validates 6-form plural + RTL)
- scripts/i18n-types.ts: codegen script for type-safe keys
- 6 components wired: StatusBar, AgentPane, CommandPalette,
SettingsDrawer, SplashScreen, ChatInput
- Language selector in AppearanceSettings
- App.svelte: document.dir reactive for RTL
- CONTRIBUTING_I18N.md: guide for adding languages
Note: currently Electrobun-only. Will extract to @agor/i18n shared
package for both Tauri and Electrobun.
- SidecarManager: spawns claude/codex/ollama runners via Bun.spawn(),
NDJSON stdio protocol, Claude CLI auto-detection, env stripping,
AbortController stop, Deno/Node runtime detection
- MessageAdapter: parses Claude stream-json, Codex ThreadEvent, Ollama
chunks into common AgentMessage format
- agent-store.svelte.ts: per-project reactive session state, RPC event
listeners for agent.message/status/cost
- AgentPane: wired to real sessions (start/stop/prompt), stop button,
thinking/system message rendering
- ProjectCard: status dot from real agent status, cost/tokens from store
- 5 new RPC types (agent.start/stop/prompt/list + events)
- Timeline dots → diamonds (rotated 45deg squares)
- Timeline lines: split into up/down segments, no gaps
- First message: no line up. Last: no line down.
- Footer icons: upload file, add context, browse web, slash commands
- Context state indicator (clock icon)
- Send button: paper plane icon (was arrow-up)
- Model label moved right (before divider)