"не удаётся подключиться" matches how the app phrases network failures
elsewhere ("Не удалось подключиться к GitHub…"), "не проходит через прокси"
is the usual verb for traffic that is routed somewhere, and "на системном
уровне" ties the requirement to the VPN and to the TUN proxy alike.
"прокси приложения" keeps the term the settings screen uses (never
"прокси-сервер"), and ё stays in line with the rest of ru.json.
The Telegram page printed whatever the plugin answered, so a failure the
plugin reports with a key - `telegram.qr_error_network`, sent when the
MTProto connection cannot reach a datacenter because the network blocks it
or only a proxy-only VPN is active - stayed in English for every locale.
That message is the one place the user needs to read: it explains why the
login cannot work.
`pluginErrorText` translates a message that looks like a translation key
and shows anything else exactly as the plugin sent it, so a plugin that
still returns plain text keeps working unchanged. The new
`telegram.qr_error_network` entry carries the wording that used to be
hardcoded in the plugin; Russian is translated, the other locales keep the
English text until a translator picks it up.
tool_table::table() is the single source of truth, and its own test pins the
size: assert_eq!(t.len(), 56, "the table lost or gained a tool"). mcp::tools()
returns that table in full — the comment in mcp.rs says the MCP server no
longer keeps a list of its own — so the server serves 56 tools, not the 49 the
docs kept saying.
Updated README.md (4 places), llms.txt (5), llms-full.txt (4), README_pt_br.md
(1) and the AppStream metainfo (1, that one is user-visible in software
centres).
Help ships offline guides and an assistant that cites bundled docs.
Connection wizard, surface guides, usage monitor and workspace appearance
land with the Agents UX pass; the shared tool table gains seven help tools.
Co-authored-by: Cursor <cursoragent@cursor.com>
procps on Linux does not read a negative argument the way the BSD kill does;
a misread group id takes every process of the user with it, which on CI is the
runner itself ("lost communication" with no log).
Two world tests move the clock by hand while the live tick thread was
still running, so a slow runner settled the state back under them. The
Test step now has a 30 minute ceiling: the Ubuntu job hung silently and a
cancelled job leaves no log.
The 0.10 section moves to the top and covers the coding harness,
permissions and rules, undo, jobs, loops, triggers, the CLI, bring your
own agents, delegation, project memory, pruning receipts, the World and
visits. Counts follow the shipped catalog: 156 tools in 24 categories,
49 on the MCP server.
The skill fixtures are SKILL.md files and the repository ignores every
.md, so CI never had them: they are now tracked as .md.fixture and the
tests copy them to a scratch folder under their real names. A hung
scanner is killed with its whole process group and the timeout no longer
waits for readers that a grandchild keeps open. On Windows/MSVC the
Common Controls v6 manifest is linked into every target, so the unit
test executable loads.
Clippy on Linux and Windows flagged a large enum variant in the MCP
client and five imports only the unix-gated tests use. The open-house
tick-rate test asked for 13 ticks in 1.5 s and a loaded macOS runner
delivered 10; the bar is now what separates an active house from a
dozing one.
LLM section with a native coding harness (workspace-bound tools, macOS
seatbelt, permission asks with Always rules, undo of files and of the
turn's messages), jobs, Loops with a check command, cron and webhook
triggers, `omniget agent` in the CLI, ACP and CLI agents, agent_delegate,
project knowledge base, skills from owner/repo, context pruning with
measured receipts, and the coding tools on the embedded MCP server.
The World: a house for the roster (three default agents, one post each,
tool balloons, activity panel, demo mode, yard preview), open house and
visits by code through omniworld-server, with the host as the authority.
Retires the experimental OmniDisc chat. OMNIGET_DATA_DIR now gives a
second profile its own settings, bridge port and instance.
Main gained lo.json (PR #330) after this branch forked; CI builds the
merge commit, so check:i18n failed there with lo.json missing 1155
keys. Fills it via scripts/sync-locales.mjs (English fallback, same as
the other non-pt locales).
Point the MaintenancePanel import tooltip at the new placeholder-free
key, route the hardcoded Spotify SDK failure message through get(t),
and convert the optional list from the review: MaintenancePanel
buttons, presets create/edit/empty states, anki import CSV validation
messages, YouTube tab potoken strings, DownloadsDock drawer/SoundCloud
labels, NbTabStrip tab actions, and Editar source in the
Abc/Flowchart/Plantuml viewers.
Moves the 14 weekday keys the sweep wrote under study.tools.x.* to
tools.x.archive/tools.x.profile where ArchiveTool/ProfileTool actually
request them (chart weekday axes rendered raw key paths in every
language). Adds study.notes.maintenance.import_tooltip (no placeholder,
for the button tooltip; the modal body keeps import_hint with its
{{name}} payload) and study.music.sdk.load_failed. Normalizes the ten
study.read entries that existed as dotted keys ("search.title", …) into
proper nesting via scripts/sync-locales.mjs — --check now exits 0.
New illustrations (animated hero, workflow strip, extension pairing, Tools, Study,
privacy, AI agents, League), fresh screenshots of the 25-category hub, and sections
for the categories added in 0.9.2 (Audio, Facebook, Reddit, Twitch, Bilibili, Music,
LinkedIn, Games, CTF) plus the new Video, PDF, Images, Files and System tools.
Adds the MCP server and Claude Code plugin section, the extension deep search
paragraph, and mirrors the counts in llms.txt. Translated READMEs only re-point
at the new image files.
Second sweep pass over every file the PR touches: converts ~165
remaining hardcoded strings (player keyboard help + shell + sponsor
labels, anki browse/presets/sync/import/tags, telegram account/browser/
perf/transfer/clone, notes components, settings maintenance/library/
youtube tabs, music spotify/albums/soundcloud, course/read pages,
achievements charts, study hub/layout) to $t() calls with keys added
in the previous commit. Language names (Português etc.) and functional
Anki query strings are intentionally left as-is.
Greptile review on #332 flagged call sites requesting keys that never
existed: the achv tree page asked for tree.d_ago/mo_ago/y_ago/available/
prereq which had been inserted under study.achv.charts instead, and
charts.link, study.player.keys/shell/sponsor.*, several anki, music and
telegram keys were absent entirely, so those labels rendered as raw key
paths. Moves the misplaced achv keys under tree, adds every missing key
(pt keeps the original Portuguese, other locales use English text), and
fixes the focus_*_desc values whose literal {h} placeholder was never
interpolated.
Entire Study surfaces bypassed i18n with pt literals, so an en-locale UI
showed mixed languages: the Telegram sync pill, Study hub recents, all
Anki pages (settings, stats, media, note types, browse, import, decks,
tags, revlog, filtered decks, review session, sidebar), the notes
shortcuts reference/templates/main page, the Telegram channel drawer,
clone wizard, account/transfer/perf panels, the player components and
all 7 study settings tabs, the music downloads dock and stores, the read
pages, achievements tree/charts, course pages, and misc singletons.
Replace every literal with $t() calls; add the new keys (study.anki.*,
study.notes.*, study.tg_sync/telegram.*, study.player.*, study.settings.*
, study.music.*, study.achv.*, study.read.*, study.library.*, study.misc
, study.spotify.*, study.soundcloud.*) to all 11 locales - check:i18n
enforces strict key parity and the build aborts otherwise. pt.json keeps
the original wording; other locales are fresh translations.
Also: rename shadowed loop vars (t -> tpl/tr) so the i18n store isn't
hidden inside each-blocks, and drop $derived generics that this Svelte
version's parser rejects when the type argument starts with "{".
Windows ships no good Lao UI font, so Lao text fell back to a poor
system face. Bundle the Lao subset of Noto Serif Lao (OFL, 27 KB) as
'OmniGet Lao', limited by unicode-range to the Lao block so Latin text
keeps the user's chosen font, and prepend it to the display/body stacks.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds a complete Lao locale (lo.json, 7208 keys, all placeholders
preserved) and registers it in the i18n loader, the Settings language
picker and the onboarding wizard.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
rusqlite is compiled with "bundled", so the executable defines sqlite3_*
symbols. Because webkit2gtk (and libsoup/tinysparql) carry undefined refs
to some of them, ld auto-exports those definitions from the executable
(51 sqlite3_* symbols in .dynsym), and at runtime they preempt sqlite3
process-wide - including libsqlite3.so.0's own internal calls.
Any plugin linking the system libsqlite3 (e.g. the Telegram plugin via
grammers' SqliteSession) then runs a Frankenstein mix: of its 22 sqlite
imports, 17 bound to the bundled instance and 5 to the system library,
whose sqlite3_initialize was itself preempted - so the system library's
global config was never initialized. The first sqlite3_bind_blob on a
bundled-instance statement executed in system code and tail-jumped
through the never-populated sqlite3GlobalConfig.mutex.xMutexEnter slot,
segfaulting the whole app on the plugin's first session write.
-Wl,--exclude-libs,ALL keeps static-archive members private: shared
libraries and plugins bind to the real libsqlite3.so.0 and the bundled
copy stays internal. Linux only; the flag is GNU/lld-specific.