v0.68.0
This is the release note as published, not a rewrite of it. Release notes are published in the language they were written in.
There is also our post about this release: Chimera Agent 0.68.0: policy, skills, and a broken desktop build →
⚠️ Do not install this release. The desktop app's backend fails to start: the PyInstaller freeze left out
chimera.cli.commands.apilogs, which the CLI imports by name (ModuleNotFoundError). Use v0.67.4 until v0.68.1 is out. The PyPI package is not affected.
Added
-
MCP servers can be paused without losing configuration.
chimera mcp disable/enablepreserves the server and its approved manifest while excluding disabled servers from connection and agent mounts; local stdio servers also support--cwd, runtime{env:NAME}references and a separate--catalog-timeout. -
Optional provider-bound image resizing. Vision attachments are reduced to configured dimension and base64-size limits when Pillow is available; originals remain unchanged, and resized dimensions are recorded in the turn receipt.
-
The Code agent can ask the user a bounded question.
ask_userpauses an attended Code turn for an option or free-text answer, returns an explicit no-response result on timeout, and remains a distinct data-only kind that cannot approve a governed action. Terminal, bot, and unattended turns do not register it. -
Global and nested
AGENTS.mdinstructions are reloaded with receipt provenance. Owner guidance fromCHIMERA_HOME/AGENTS.mdprecedes project rules; focused nested files share the existing character budget, and changed instruction versions are announced without copying their contents into the receipt. Nested guidance discovered during a read is appended to conversation history without rebuilding the stable system prompt or changing the open edit. -
Web search supports Tavily, Firecrawl, Exa and Brave Search.
CHIMERA_WEBSEARCH_PROVIDER=autoselects the first configured key and automatically tries another provider after HTTP 429, respectingRetry-After; a fixed provider never fails over. -
Discover local Agent Skills as reviewable bundles. Skills found in workspace and user
.claude/skillsand.agents/skillstrees are imported through the bounded upload path, remain pending and tainted until approved, and return to pending when their manifest changes; the API reports the winning source and collisions. -
Project and global Markdown prompt commands. Terminal chat and the TUI discover namespaced templates in
.chimera/commands/and<CHIMERA_HOME>/commands/, expand$ARGUMENTSand$1… into ordinary message text, and keep embedded slash commands authoritative; template content is never executed. -
Code conversations can undo to any retained turn across restarts. Per-turn snapshots are stored outside the project, range rollback compare-checks each changed file, redo is available until a new turn runs, and deleted conversations release their snapshots. (#918)
-
Project formatters can run after a successful file edit.
CHIMERA_FORMAT_AFTER_EDIT=trueopts in; a project-declared formatter runs through argv only when the existing host-execution gate permits it, and the edit receipt reports changes, skips or failures without undoing the write. (#919) -
Remember approvals for a project and reject a run's pending approvals with a reason. Project rules are owner-managed, recorded in the audit log when used, and answer matching review questions without bypassing BLOCK or surface floors; the owner-approved two-token shell prefix also applies after tainted reads. A reject-all decision is limited to its run and its reason is shown in the refusal. (#922)
-
Local API and log diagnostics, plus proxy/CA deployment guidance.
chimera apireads the desktop server's announced URL, sends the configured bearer token without displaying it, and requires--yesfor state-changing methods, ignores proxy variables on loopback and refuses to send the token to a remotehttp://URL;chimera logsreads, filters (tracebacks stay with their record) and follows the backend warning/error file across rotation, whichchimera servenow writes too (onlychimera appdid). Document proxy and CA environment setup for shell and Docker deployments. (#925) -
Owner deployment policy, deny-only. Ordered
provider.use,integration.use(mcp:<name>,skill:<name>) andtool.userules in<CHIMERA_HOME>/policy.json— or the fileCHIMERA_POLICY_FILEnames, which the desktop bridge may not change — take providers, MCP servers, skills and tools away from the whole install: a denied provider leaves the model lists and the tier ladder and its calls are refused (a permitted fallback answers instead), a denied MCP server never connects, a denied skill is never loaded, a denied tool is refused at the registry. The golden rule: a laterallowonly undoes an earlierdenyof the same file and never reopensCHIMERA_TOOL_DENYLIST, the reach floor or a kernel block. An invalid file stopsserve,chat,assist,tui,acpand failsdoctor; the desktop starts, reports it onGET /api/governance/policyand refuses every tool until it is fixed; a file that breaks at run time keeps the last valid rules. The agent's write tools cannot write the policy file.chimera policy show(hidden) prints the rules in force. (#926) -
Owner-declared named read-only references. Attended desktop and terminal agents (
chat,assist,tui, an attendedsolve, the desktop Code turn — neverscenarios, cron or bots) can read, list, search, and glob@alias/pathinside folders the owner configured in<CHIMERA_HOME>/references.json; reads count as project content in the taint ledger, every writer refuses a declared alias, a reference to a filesystem root, the user's home or the data folder is refused, and the authenticated/api/referencesSettings API is not exposed through the MCP bridge. (#927) -
Appearance: a live code-diff preview, a default transcript view and interface zoom. The Code font row previews a three-line diff with the conversation's own
DiffViewin light and dark at once; Default transcript view (Normal / Steps / Detailed) sets how a newly opened conversation starts, built only from what it can already show (the stream carries no model reasoning, so none is shown); Interface zoom (80–120%) persists, applies before first paint and follows into conversation windows throughsrc/lib/uiZoom.ts, which the zoom shortcuts will share. OpenDyslexic is wired tosrc/assets/fonts/but stays hidden until the licensed file is added. (#928) -
Live step and turn clocks, and context in % while a turn runs. The code conversation times the running tool step and the whole turn from the server's start time (
started_aton the opening andtool_startframes), stops on the server-measuredduration_seconds/elapsed_seconds, and shows "Context 30%" with a small bar from a new numbers-onlycontextframe sent only when the measure moves a percentage point — plain tokens, never a percentage of the 128k fallback, when no window is known. The frame has its own channel so bots and the terminal do not print it. (#929) -
Reasoning-effort variants and a model pinned per Code conversation. A slug may carry
#low,#mediumor#high: the gateway sends it as OpenRouter'sreasoning.effortor OpenAI'sreasoning_effortonly where the route takes it (not to anopenai/slug on another endpoint, nor underCHIMERA_API_BASE), and the receipt names a variant only when it was sent, oncomplete,acompleteandstream_completealike. Window, vision, price, reviewer family and fusion temperature are looked up by the base slug through onebase_slug/split_effortinchimera/providers/catalog.py.CodeTurnRequest.model_pinnedkeeps the owner's pick with the conversation (and with no model unpins); a reopened conversation's picker shows the pin, and the Code screen offers the effort for models the provider's index says reason, in all ten languages. A guest's turn, a refusal's retry and the spoken talk model never move or take the pin. (#930) -
Continue a Code conversation from Discord or Telegram. In the desktop app the bot's listed owner sends
/link(lists recent conversations) or/link <id or unique prefix>, and their text in that chat becomes a turn of that conversation — shown live in the app with the platform as its author — until/unlink. The turn runs on the bot floor (only the MCP servers named inCHIMERA_BOT_MCP_SERVERS, no OpenAPI connectors, no desktop posture or shell grant), approval codes are still intercepted before they could become a turn, voice notes and images are refused rather than passed on untainted, and a conversation already working answers with a sentence instead of running a second turn. Strangers in a linked room, bots and every sender of a bot with no allowlist keep reaching the bot's own session. Links live in<CHIMERA_HOME>/channel_links.json, replaced atomically and inside the data folder no file route, bridge call or write tool may touch;chimera serveanswers/linkwith why there is nothing to link. (#931) -
The pull request cycle in the Code conversation (C1). A PR opened from the Git panel is recorded on its conversation (an optional, backward-compatible field a turn's save cannot erase), and the card shows its state, mergeability, check counts and failing names, polling only while it is open with checks pending and never with the window hidden; the
ghread is one call, cached for 60 seconds in a bounded cache that never keeps an error. Two per-conversation options, both off by default: "offer a fix turn when the CI fails" puts a ready turn in the conversation's message box (it never sends one) asking the agent to read the failing logs itself, and "clean up after the merge" removes the conversation's Chimera worktree and local branch, then archives it, only when the worktree is clean, every commit is pushed to an existing upstream, and it is neither the main checkout nor its current branch — never a push or a remote branch. Neither option, the cleanup nor the status read is reachable from the desktop bridge. (#932) -
Troubleshooting in Settings: open the logs or data folder, copy the installation ID, clear the cache and restart, reset app data to a dated backup. The page still has no Tauri IPC: it asks the backend, which leaves the desktop shell one action word (
open_logs,open_data,restart,reset_data) and never a path — the shell builds every path from its own data directory. Clearing the cache removes only<home>/cache(a symlink or junction there is unlinked, never followed); a reset needs the wordRESETtyped exactly, stops the backend, MOVES its data folder todata-backup-YYYYMMDD-HHMMSSbeside it and copies.envand the installation ID back — nothing is deleted. The installation ID is random, kept in the app's data and included in the diagnostics report. None of these routes is in the desktop bridge's table or the guest app, and a planned restart no longer writes a crash report. (#933) -
Markdown subagents for projects and the owner.
chimera solve --subagentsdiscovers.chimera/agents/*.mdand<CHIMERA_HOME>/agents/*.mdand letsspawn_subagentrun one by name (agent). A file can only narrow: itstoolsare intersected with the session's governed tools (an empty intersection grants nothing), itsstepsare capped by the session's, unknown frontmatter keys are refused, and a project file's instruction is fenced as untrusted data. Only owner-global files may pin amodel, and only from the catalogue; a project file'smodelis ignored with a diagnostic. Collisions (app > project > global, and case-only filename clashes) are reported. Listing in the app, chat, bots and desktop is not part of this change. (#934) -
Edit the browser's allowed sites and choose its cookie retention in Settings.
CHIMERA_BROWSER_SITESbecomes an add/remove list checked as the server checks it, with a hint that states what the list governs;CHIMERA_BROWSER_COOKIE_RETENTIONkeeps cookies in one shared profile, one profile per conversation (named by a digest of its id and deleted with it), or nowhere (ephemeral, the default). The MCP bridge cannot change either setting. (#935) -
Desktop: the shortcuts that were missing, from one table. Ctrl+Shift+T reopens the conversation last left (a stack kept for the app session), Ctrl+Tab / Ctrl+Shift+Tab walk conversations in sidebar order, Ctrl+F finds in the transcript (F3 / Shift+F3 to step, Esc to close; painted with the CSS Highlight API, never by editing the transcript's DOM), Ctrl+= / Ctrl+- / Ctrl+0 step the interface zoom through
src/lib/uiZoom.ts, and Ctrl+; opens a sheet rendered from the sameSHORTCUTStable the listeners match on. The command palette shows each command's chord and finds commands by it. No shortcut acts in a field that holds text; the conversation ones do act from an empty composer, which takes focus whenever a conversation opens. (#936) -
chimera service start|stop|restart|statusruns the desktop backend without a window. One detached server per data folder (the folder claim decides, not the port), found through~/.chimera/service-<channel>.json(0600, atomic) and trusted only afterGET /api/infoconfirms its pid, version and folder; it requires the owner's persistentservice.token, listens on loopback only, steps down if another live service takes its record, publishes no desktop bridge without a window, and the token alone still cannot approve a question. Hidden from--helpuntil the desktop app starts it;chimera app --standalonepublishes nothing. (#937) -
Durable per-conversation Code turn inbox.
mode: "queue"onPOST /api/code/turnruns at once on an idle conversation and otherwise keeps the message (deduplicated byclient_id, at most 20 waiting) with the posture it was sent with; items run one at a time as turns end and once at startup, always as the owner unless the share-link route queued them, and an item a crash left running is shown as interrupted (anoticeframe and the queue route) instead of being replayed. (#939) -
Conversation states and pull-request counts in the Code sidebar. Each row of
GET /api/code/sessionscarries a rule-derived state (blocked, running, failed, done, review, idle — in that precedence, no model call), the latest pull request the agent opened from it (pull_request) and how many (pull_request_count); the owner can mark a conversation done (POST /api/code/sessions/{id}/done, not reachable from the desktop bridge, cleared by the next turn), and the sidebar filters by all / blocked / for review. (#940) -
chimera service startstarts the installed desktop backend. The frozen backend recordsdesktop-install.json(0600, four path variables only, never a token); the CLI starts that executable from the install folder, where its.envis read, and refuses a record whose executable is notchimera-backend. (#943) -
chimera code newandchimera code resumereach the background service. A conversation started in the terminal shows in the app and back; the service record is trusted only afterGET /api/infoagrees, only loopback URLs are used, and approving from the terminal needs the question's code. (#944) -
Activity panels can be grouped into tabs and split side by side. Tabs are a real tablist with arrow-key navigation, a split is resizable and persists, and a layout saved before this opens exactly as it did. (#946)
-
Side cards for the open Code conversation: environment (folder, branch, worktree, posture), context in %, connectors with a retest, the conversation's pull requests or changed files, and its background tasks. (#949)
-
The desktop app attaches to the background service instead of always starting its own backend. It checks the service record against
/api/info, attaches to the same or a newer compatible version, drains and replaces an older one, and runs--standalonefor a different data folder; the tray can switch the service off, restart or stop it, and an update stops it first. The service runs from its own copy (<data>/service-bin/<version>/chimera-service.exe), so the installer can replace the app while it runs. A window leases the service its screen credential only with a per-launch launcher key the shell hands to the service it started, never with the token on disk; on a service the current app did not start, a yes takes the question's code until the app restarts it. The desktop bridge is published only while a window is connected. (#952) -
Pair your own phone or browser with a one-time code, and list and revoke devices.
chimera service pair(or Pair a device in Settings) prints a code valid once for five minutes, with a QR of the pairing address, served by a second LAN listener that is closed at every start and opened only by the owner. A paired device reads and talks: conversations, turns, guidance, answers to the agent's questions and refusals. Approving still takes each question's code, settings, folders, bots, file and git routes answer403, credential files and the owner's folders are refused in any parameter, and every answer to a device is scrubbed of credentials. Revoke ends one device at once, including an open stream; Revoke all devices replaces the device secret. Chimera runs no relay: to reach it from outside, put a tunnel you control in front of it. (#953)
Changed
-
The Windows CI tests run in three shards. One runner could no longer hold the suite: green runs on
maintook 34 to 41 minutes against a 45-minute limit, and on #903 pytest ran 44:35 with 11,816 passing and nothing failing before the job was cancelled. Each shard runs whole test files chosen deterministically fromCI_TEST_SHARD, balanced by test count, under a 30-minute limit; a test pins that the three together run every file exactly once and that the matrix and the/3agree.verdict, the only check branch protection requires, still waits on all three. -
The Linux CI test job gets 30 minutes instead of 20. Green runs took 16 to 19 minutes; on #913 pytest finished with 12,067 passed in 19:16 and the job was cancelled four seconds later, a red with nothing failing. (#921)
-
list_dirandgrepleave out symlinks whose target is outside the workspace. Reading such a link was already refused; listing it only invited the retry. A link between two folders of the same project is still shown. (#927) -
gitleaks keeps its default rules and allowlists two flagged values that are not credentials. A false positive cannot be fixed by a later commit, because every commit of a pull request is scanned;
.gitleaks.tomlnames each value exactly (a test fixture and the shortcut table'skeys: "Ctrl+Shift+Tab"), matched against the flagged secret, and a planted key is still reported. (#941)
Fixed
-
The Linux AppImage and .deb run on glibc 2.35 again (Ubuntu 22.04, Debian 12, Mint 21). They were built on Ubuntu 24.04 and required glibc 2.39, so they did not start on those systems; the AppImage catalog's test caught it. The Linux build now runs on Ubuntu 22.04, and measured inside the new AppImage no file asks for more than GLIBC_2.35 (the old one: GLIBC_2.39, from the app binary itself). (#960)
-
An approval is not recorded as a refusal because Windows held its answer file. An antivirus or the indexer opens the answer the moment it lands, and the waiting question read it once, failed with a sharing violation and recorded
unreadable— a refusal nobody gave. The read now retries a busy file like the write already did. (#957) -
The frozen desktop browser installs and launches Chromium from the same user cache. Playwright's frozen launch default pointed inside the sidecar bundle while first-use installation used the user cache; the sidecar now configures Playwright's OS-specific user directory before either operation, unless the user explicitly sets
PLAYWRIGHT_BROWSERS_PATH. -
Reject bash heredocs before host approval on Windows.
run_shellnow explains that cmd.exe has no heredocs and suggests saving a script or using PowerShell, instead of waiting for approval before failing. -
Context compaction retains deterministic run progress and recovers once from provider overflow. Restore successful read/write targets with size and short hashes, retain recent history to a token budget, and force one compaction retry when the provider rejects an oversized prompt.
-
Undo puts files back with the line endings they had. The checkpoint read files with
read_textand wrote them withwrite_text, which translate newlines: on Windows every LF file an undo restored came back with CRLF endings, and on every platform CRLF and lone CR were lost, so the text looked the same while the diff was every line. A turn that only changed line endings was also not recorded as a change. Snapshots and restores now read and write bytes. (#920) -
The conversation list no longer re-reads every stored conversation on each call.
CodeSessionStore.list_metaparsed allcode_sessions/*.jsonfiles every time, and the sidebar asks for the list whenever the set of running turns changes; with ~15 Code turns running that was several full re-reads a second (69 files, some 190 KB+, four corrupt files warning on every call) until the desktop backend stopped answering and the supervisor killed it with every turn. Rows are now cached per file by(mtime_ns, size),save()updates its own row, and an unreadable file is warned about once per version. (#923) -
Require a per-launch bearer token for the Tauri owner API. The desktop shell passes a random secret to its sidecar and injects it into the webview before the frontend starts; API fetches and SSE streams send it in
Authorization, while static assets and separately tokened guest links remain public. A token the owner already set is reused rather than replaced, the tray authenticates with the launch token, workspace images in answers load through the authenticated client, and gh/git for pull requests no longer inherit secret environment variables. (#924) -
An open bot no longer loads the owner's API connectors. The refusal compared the surface name exactly against
platform,app-messagingandserve, but every bot passesplatform:<adapter>orapp-messaging:<adapter>, so on a bot with an empty allowlist (which answers anyone) the connectors the owner had sent to unattended surfaces loaded, with the owner's key. Surfaces are now classified by family in one place (chimera.governance.surfaces), which the bot MCP opt-in and the chat answer path also use. Cron, board, MCP, A2A and the attended surfaces are unchanged. (#938) -
The repository map credits the module that defines a name imported through a package facade.
from chimera.core import Xused to give rank tochimera/core/__init__.pyonly; 510 product imports went through such facades.chimera/core/autonomous.pyis back inside the default budget (19th of 27 lines) without raising the budget or unpinning it. (#942) -
OpenDyslexic is offered in Appearance. The font has shipped in
public/fontssince #763 (the official, unmodified file, with its OFL licence); the@font-facepointed atsrc/assets/fonts, a folder that never existed, so the option read as missing from the build. (#945) -
The owner's connectors stay off GitHub issue jobs and an unauthenticated
/v1/chat/completions. Anyone who opens an issue in a configured repository, or reaches/v1whileCHIMERA_SERVER_TOKENis unset, used to run with the owner's connectors; the rule now lives with the bot rule inchimera/governance/surfaces.py. (#947) -
One record holds every pull request of a Code conversation. A PR opened from the panel now counts in the sidebar and moves the conversation's state, and one opened by the agent shows on the card; conversations stored in either earlier format read correctly. (#948)
-
Approving without a code needs the screen credential, not just a token. A token read from disk (
service.token, or one in.env) used to approve the backend's own questions with one request; now only the owner's screen, with a per-launch credential that never touches disk, approves without the question's code. (#950) -
A card that appears is approvable at once. The approval code was remembered after the question file was written, so a click on a card in that moment was answered "asked by another process, use the code" for a question asked right there; the code is now held before the file exists, and dropped if the file cannot be written. (#954)
-
Catalogue prices for
deepseek-v4-flash-0731andglm-5.3-flashrecord the OpenRouter readings of 2026-10-16. The fallback keeps the highest figure seen, so a receipt never reads low. (#955)