Releasesv0.64.4
v0.64.4
To notatka do release'u w postaci, w jakiej ją opublikowano, a nie jej przeróbka. Notatki do release'u są publikowane w języku, w którym zostały napisane.
Security
- A value saved to
.envreads back as exactly that value, through every writer (#775). This holds whether or not the desktop bridge is on: the owner's own save, key pools, connectors, vault moves andchimera initall went through the same gaps.- Line breaks (shipped in 0.64.3): every writer refused
\rand\nand nothing else, and the file was re-read withsplitlines(), which also splits on U+2028, U+0085 and five more. A value carrying one was written as one line and became a second assignment (a realCHIMERA_REACH=workspace_shell) at the next save of any key. Every character in Unicode categories Cc, Cf, Zl and Zp is now refused at the one sink every write goes through, and the file is split on\nonly. - Syntax (present in 0.64.3 and earlier): values were written bare after
KEY=, which python-dotenv does not read literally. A value opening a double quote swallowed the lines after it, so the owner'sCHIMERA_REACH,CHIMERA_APPROVAL,CHIMERA_HOST_EXECand tool denylist fell back to wider defaults, and a${NAME}was expanded from the process environment at the next start. A value is now single-quoted when a bare one would not read back; a${...}and a quoted value ending in a backslash are refused with the reason. Real API keys are written unchanged, and the desktop shell reads the server token by the same rule. - Unparseable values: one that Settings could not read back (
CHIMERA_BROWSER_SITUATION='x"') was saved, and the app would not start until.envwas edited by hand. Every save, the owner's included, now parses the candidate first and answers 400 naming the key; credentials never enter that probe, so a key save writes the key nowhere else.
- Line breaks (shipped in 0.64.3): every writer refused
- Chimera's own
.envand data folder are known by what they are, not by how a path spells them (#775). Present since the desktop bridge arrived in 0.62.2, and reachable only with the bridge turned on (off by default, owner-only)..env,.env.,.env::$DATAand the 8.3 nameENV~1passed the credential-file check and read and wrote the real.envat the operate tier. A workspace spelled\\?\…,\\localhost\C$\…or\\127.0.0.1\C$\…compared unequal to the data folder, and a call naming no workspace was never checked at all, so afiles.writeof<home>/approvals/<id>.answer.jsonanswered an approval at the operate tier. Files are now compared by file identity, device and UNC spellings are refused outright, and every path a call names is checked where the route would resolve it. The app's own file routes now refuse Chimera's.envand data folder for every caller, so the owner's file viewer no longer opens them either; Settings, approvals and memory keep their own screens, and another project's.envopens as before. - No repository, listing or scheduled job the bridge reaches hands out Chimera's
.envor data (#775). Present since 0.62.2, with the bridge on only. With a workspace that held them, such as the install folder:files.searchreturned lines from the data folder andfiles.treeandfiles.browsenamed it and the.env;git.initcommitted the.envandgit.diffthen printed its changed lines;git.revertof.rangit clean -fdover the data folder.cron.createalso took adeliver_towebhook, an outbound channel the client chose for a job's unattended answers. A workspace inside the data folder, or holding it or the.env, is now refused at every tier; git routes hold the app's own folder to the same rule and refuse a.or..that would contain them; status, diff and listings leave those files out; anddeliver_tois refused, so the owner adds a webhook in the app. - The agent's write tools, and an external agent through ACP, cannot write Chimera's own
.envor into its data folder (#775). Shipped in 0.64.3 and earlier, and independent of the bridge. The write tools refused only the desktop shell's two preference files, so a turn whose workspace contained the install folder could write the.envor an answer into<home>/approvals; ACP'sfs/read_text_fileandfs/write_text_fileskipped the checks the native tools make. Both now refuse those places, a person's yes included, a refused ACP write is recorded in the turn'srefused, and ACP's read followsCHIMERA_AGENT_READS_OWN_ENV(see Added). An external agent with file tools of its own still reads and writes without asking us, as its posture note says;run_shellandexecute_codeare untouched, the posture governs them.
Added
CHIMERA_AGENT_READS_OWN_ENVlets the owner keep Chimera's own.envfrom the agent's read tools (#775). Default on, today's behaviour, and the Security screen's privacy row now says what that means: the provider keys saved in that file can be read by the agent and reach the model and its provider. Off,read_fileand the document and media readers refuse the file, andgrep,globandlist_dirleave it out, recognised by file identity so.ENV,.env.andENV~1are the same file; other projects'.envfiles are unaffected, andrun_shellandexecute_codeare not read tools. Owner-only: the bridge refuses the key, since turning it back on loosens privacy. Read on each tool call, and exposed asprivacy.agent_reads_own_envonGET /api/config.- A skill card for checking the provider before cataloguing a model (#734), contributed by @GreedyC, with thanks.
check-the-provider-before-you-catalogtakes the slug, price and served context window from the live OpenRouter index throughchimera.providers.listing, keeps a superseded price inalso_seeninstead of overwriting it, leaves an unknown value asNone, and checks withtests/test_catalog_is_live.py; an advertised window is not taken for the one the route serves. Translated into the nine other languages the app offers.
Changed
- Which model answers, and whether the app runs scheduled jobs, are the owner's to set; the bridge may only suggest
(#775). In 0.64.3 these stayed bridge-writable, a judgment call stated then, so a client that read one poisoned page
could move every prompt to another vendor or start the unattended scheduler in one call. Sixteen keys (eight
*_MODELkeys,CHIMERA_FALLBACK_MODELS, the fusion panel, judge and synthesizer, the cost mode, the cascade, verified answers andCHIMERA_APP_CRON) are now suggestable: a bridgesettings.editnaming them writes nothing, runs every check a save would, and answers 202 with a card in the approval queue showing each key, its value now, the value proposed and the bridge's token hint. Only the owner's app applies it: the bridge's approve route, a forwarded request, a chat code, an answer file andchimera approve --yescannot (--noretires it). A yes writes only if the card has not expired (24 h), every key is still suggestable and still holds the value the card showed (otherwisestale), the change still passes every check (otherwiseinvalid), and the card still hashes to the digest the screen was shown (otherwisechanged, and the card stays waiting).CHIMERA_DECISION_MODELstays a flat refusal, and a body mixing a suggestable key with any other is refused whole. - Four Full-control routes that widened reach are closed to the bridge (#775).
settings.folder_grant,settings.exec,settings.messaging_startandsettings.agent_upsertanswer 403 at every tier with a sentence saying where the owner does it in the app, and the MCP server neither lists nor forwards them. The owner's own routes are unchanged. - A run the bridge starts uses the owner's models and posture, and never gets Chimera's
.env(#775). Amodel,roles,profile,fuse, fusion seat,provider,cascade,verifier_modelorretry_ofanywhere in a bridge body is refused at every tier; an unset or false value passes. A reach past the owner's, an approval looser than the owner's (a left-out approval counts as the defaultsuspicious),allow_host_execor averifycommand where the owner's reach has no shell, andauto_approveare refused; an equal or narrower posture passes. A turn, run, batch, crew or lifecycle the bridge starts keeps Chimera's.envout of its read tools whateverCHIMERA_AGENT_READS_OWN_ENVsays, and the routes that start work without those seams (chat.send,kanban.run,orchestration.hierarchy,cron.create,spec_projects) refuse, through the bridge, a folder holding Chimera's files. On the desktop the default workspace holds neither, so they run as before. Still open, and pre-existing: the app starts withoutCHIMERA_SERVER_TOKEN, so any local process that loads its page gets the token. chimera code resumeloses--model, and the MCPdesktop_sendno longer offers a model (#775). Both go through the bridge, which now refuses a model choice, so the flag would have failed on every use.