Minor Changes
-
3e94207: The gateway reads the dates written in every document's text on every install, without experimental mode or the Brain, and the agents' time queries and Debug → Calendar include them. An all-numeric English date such as "10/07/2026" reads month-first when the gateway's time zone is in the United States, a US territory or the Philippines, and day-first everywhere else, including Canada, Latin America and UTC. A gateway whose time zone is UTC, as a container often is, therefore reads US-style dates day-first: set
enrichment.dates.numericDateOrdertomonth-firstorday-firstto choose explicitly. -
2f2680e: Tell Omnesis voice notes can be transcribed by the gateway's transcriber. While a transcriber is assigned and the new
inference.dictation.transcribeOnGatewaysetting is on (the default; Settings → Models → Transcriber, or Settings → Voice in the apps), the iOS and Android apps record Tell Omnesis — including Apple Watch notes — as a voice note: the note is saved at once and the gateway replaces its text with its own transcript when ready. Watch notes wait on the watch until the iPhone receives them, and the watch returns to its face after sending. Omnesis Demo gains its own Apple Watch app. -
4b975f5: Gmail reads mail more faithfully. A message is dated by its
Dateheader rather than by when Gmail received it, so mail imported from another account sits in the year it was sent. Bodies are decoded in the charset they declare, a "view in browser" or abridged plain-text part gives way to the HTML that carries the message, the date line no longer renders as a heading, Bcc recipients on sent mail join the people graph, automated senders no longer create people, and signature logos are no longer indexed as attachments. A first sync keeps listing the mailbox until Gmail has no more pages, so the oldest mail is no longer left unread, and a message deleted between being listed and being fetched is treated as deleted rather than as an expired history. The changes apply to mail synced after the update; mail already indexed keeps its current form until the source is resynced.Shared attachment extraction improves for every source: legacy PowerPoint files are read from their text records instead of their raw bytes, binary noise from old Office files is no longer indexed as text, text attachments honour their declared charset, image file names in URLs are no longer taken for email addresses, and one slow OCR request no longer pauses OCR for every image after it.
inference.ocr.requestTimeoutSecondssets how long a collector waits for one image's OCR. -
52f8455: New Maildir source. It indexes email that a mail tool keeps on the collector's machine as a Maildir — mbsync, offlineimap or getmail, for example — without Omnesis connecting to the mail server itself, which makes it the way in for accounts whose provider allows only approved mail apps. A message stored in several folders, as Gmail's labels are, is one document tagged with every folder. Folder changes, stars and replies update it without re-reading its attachments, and deleting its last copy removes it. Drafts, spam and trash are skipped. Thunderbird accounts kept in its file-per-message (maildir) store are read too.
-
ba922cd: Plaid and Local Files are no longer experimental. Every collector now offers them in + Add source without
OMNESIS_EXPERIMENTAL=1, and a collector that already hosts one keeps syncing it with the flag off.
Patch Changes
-
4e47b47: When an agent signs in again and you choose a connection for it to replace, each connection now reads "Access level: …" instead of "Uses …". The line names the access level the connection uses, which can be shared by several connections and is often named after the agent it was first made for, so "Uses OpenClaw" under a Hermes connection read as if Hermes were OpenClaw.
-
19e245b: Update brace-expansion within its existing major versions to fix denial of service vulnerabilities in brace parsing and expansion.
-
d25b1d5: On macOS, a collector that dies without a clean exit now always comes back — whether it crashed, was killed by its event-loop watchdog, or was killed outright, for example by the system when memory runs out. launchd can hold back the respawn a LaunchAgent's
KeepAliveasks for — it records the restart and waits for something to demand the job — which left the collector down until it was started by hand. Each collector now starts a small guard process beside it that, once the collector's process has ended, waits out the LaunchAgent's throttle interval and asks launchd to start the job again unless it is already running, ended with a clean exit (such as a collector parked for re-pairing), or was stopped withomnesis service stop. Linux is unaffected: systemd restarts a failed collector unit on its own. -
0aab430: The portal, iOS and Android chat show copy buttons beside inline code values and multiline code blocks in completed assistant answers. The agent formats addresses, phone numbers, identifiers and requested drafts with standard Markdown so older clients can still display them. Copying puts just the value on the clipboard, without its label or Markdown delimiters.
-
e3fecd3: The Docker images now ship their dependencies with the repository's patches applied, as source installs always have. Without them, a WhatsApp source running in the collector container let libsignal print whole Signal session records — ratchet private keys and root keys included — to the container's log each time a session was opened, closed or pruned; the images also lacked the Baileys pairing-platform fix and the better-sqlite3-multiple-ciphers type export. The image build now fails when a patch no longer applies, and the runtime smoke checks each patched file in every shipped image.
-
3e94207: If you ran a WhatsApp source in the collector container from an earlier Docker image, that container's logs may contain Signal session records, which include session keys. After updating, rotate or delete the old collector container logs, for example by recreating the container, and remove any copies a log driver or log collector has shipped elsewhere. Source installs are not affected.
-
be832f0: A long-running gateway no longer starts refusing every sync page from a source that declares URL patterns, Strava among them, with "must be a supported safe regular expression" until it is restarted. The gateway checks those patterns with a WebAssembly build of RE2 whose memory is fixed at 16 MiB, and every check left a little of it behind until none was left; the dependency is now patched to free it.
-
12f10e4: Gmail: a message whose text is split across several parts, or whose large body Gmail returns by attachment id, is read in full instead of from its first part. A small inline image is kept when its text adds a phone number, an email address or several words the message does not already carry.
-
272d590: Hermes: a scheduled job or other tool call no longer fails with "Omnesis corpus authorization needs repair" when the Hermes gateway renewed the Omnesis credential while the tool still held the previous access token. The adapter now renews from the gateway when the token it picked up from disk has already expired.
-
3e94207: An OpenClaw or Hermes integration no longer has to be approved again because one token refresh was slow. When the gateway took longer to answer a refresh than the integration waited, it still rotated the refresh token, and the integration was left holding a spent one;
omnesis connect --refreshthen fell back to a new approval. A token refresh now waits up to 55 seconds for the gateway, long enough for the write stall a gateway shows right after a restart, and repeats once a refresh whose answer never arrived — a timeout, a dropped connection or a server error. The gateway answers that repeat with the tokens it already issued for two minutes after rotating them. Concurrent refreshes from the same integration wait correspondingly longer for each other. -
e83263d: Maildir: a message whose Date header lies before 1980 or more than a day in the future is dated by its mail server's Received stamp instead.
-
8ef86a6: Show readable document connections and matching-text copies in iOS and Android search results. Mobile clients request optional graph context only from gateways that advertise support, while older clients and gateways retain ordinary search behavior.
-
3cf5ddb:
omnesis connect openclawworks with OpenClaw 2026.9.6 again. That release reports a missing legacyomnesis-bridgeplugin in new words, which connect took for a real failure and stopped. When OpenClaw instead finds anomnesis-bridgecopy it did not install and refuses to remove it, connect now says how to find and delete that copy before running it again. -
b1f897c: OpenClaw: when the gateway refuses an expired Omnesis access token, the plugin renews it with its refresh token again, including when the gateway's authorization server is on another address than its MCP endpoint. Previously that renewal was refused locally and every expiry fell back to re-issuing the credential with the device's management token.
-
2a0bf0f: When a Strava account runs into the rate limit Strava counts against the API application, the other Strava accounts a collector connects through that application now also show as rate limited, not only the one that hit it. A rate limit counted against one account no longer shows another provider's sources as rate limited because they are signed in with the same account name, such as a mailbox and a note-taking app on one email address. This changes only which sources show as rate limited.
-
19e245b: Add graph-aware agent search with bounded document trails, grouped matching extracted text and readable context. Search v2 is enabled by default; set
search.v2.enabledtofalseto restore legacy behavior. Inspect copy locations, source links and breadcrumbs withomnesis search --agent-contextor the portal search page. Ordinary search response fields and mobile interfaces retain their existing behavior. -
2a0bf0f: Two Strava accounts synced into one gateway no longer stop each other. When it chose which activities to enrich, each account's source also read the other account's, fetched them with its own token and wrote them back as the other athlete's, which the gateway refuses; the refused write was retried on every sync, so the source stopped listing new activities, and what it had stored of the other account's activity could stop that account's source too. Each source now reads only its own athlete's activities. Strava sources already stopped this way start again once every Strava source on the gateway is resynced, from the Sources page or all at once with
omnesis sources resync strava-activities. -
2a0bf0f: The Strava source keeps each activity's splits, best efforts, laps, segment efforts and zones. Every page that fetched them deleted them again as it wrote them, so those tables stayed empty. Activities enriched before the update stay without them until the source is resynced, from the Sources page or with
omnesis sources resync strava-activities. A resync fetches every activity again within Strava's daily read limit, four or five reads per activity, so for a large account it takes days. -
2a0bf0f: The Strava source's count in the portal and in
omnesis statusis its number of activities. It used to add up every Strava table — kudos, gear, splits and the rest — and so showed more activities than the account has. -
2a0bf0f: Strava activity documents keep every part of an activity as its details, comments and kudos are fetched. Fetching comments and kudos used to write the document again without the description, calories, device, perceived exertion, top results and photo caption, and fetching details again wrote it without the comments and kudos, so after a first sync every document had lost its description; the caption is kept in a new
photo_captioncolumn ofstrava_activities. Fetching an activity's details no longer sends it back for the comments, zones and streams already fetched for it. Documents name the gear an activity used, not its gear id, without waiting for the weekly athlete refresh, and an activity edited on Strava keeps its gear when it is written again. A pace whose seconds round up to a minute reads6:00 /km, not5:60 /km, and an activity's start time reads the same however its document was last written. Documents already stored change when their activity is next written: after an edit or new kudos or comments on Strava, or after a resync from the Sources page or withomnesis sources resync strava-activities. -
2a0bf0f: The Strava source picks up activities and edits it used to miss. An activity uploaded with a start time more than a month back — history imported from another service, or a watch synced after weeks offline — is added by the daily check of the whole activity list, which used to read it and write nothing; an edit to an activity older than a month arrives the same way. A crop, a corrected distance or elevation, or a changed duration or start of a manual activity counts as an edit, so the activity's details, splits, comments, kudos and streams are fetched again. When kudos or comments arrive, the activity's comments and kudos are fetched again and its counts follow Strava's; after the update this happens once for each activity whose counts changed since it was first listed. The daily check and the six-hourly check of the last month's activities keep running while the source works through a backlog of activity details instead of waiting for it to finish, and they stop short of the rate limit as the backlog does, leaving the listing of new activities reads of its own. A Strava account that had no activities when it was connected lists every activity added later, not only the newest hundred. A bike or pair of shoes deleted on Strava now leaves the
strava_geartable at the next weekly athlete refresh. -
2a0bf0f: The Strava source copes with Strava deactivating the install's API app. Strava deactivates a Standard Tier API app whose owner, the Strava account that registered it, has no active subscription, and then refuses every request made through it. The source used to read a refusal of an activity's zones or streams as that activity refused and mark it done, so a deactivated app could empty those backlogs with nothing fetched, and reactivating the app brought none of it back; the activity listing and the fetches of details and comments failed with an error that did not say why. A deactivated app now stops the source with the steps to fix it: subscribe on the owner's account, then reactivate the app on Strava's API settings page. Nothing is written while the app is deactivated, and once it is reactivated the source carries on where it stopped. The athletes connected through the app need no subscription. Activities already marked done this way are fetched again after a resync, from the Sources page or with
omnesis sources resync strava-activities.For an athlete without a Strava subscription, the source no longer asks Strava for each activity's heart-rate and power zones, which Strava refuses one read at a time; it asks once the athlete's profile shows a subscription. A profile that reports no subscription only in its older
premiumfield counts as one without. An activity's zones that Strava serves without the time spent in each zone, or without saying whether they are heart-rate or power, no longer stop the source from fetching zones; what can be stored is stored and the activity is marked done. The setup wizard and the Strava entry of the sources documentation say that the app's owner needs a subscription, and that a new app connects one athlete and can be raised to ten. -
2a0bf0f: Strava's open-ended top heart-rate or power zone is stored with no upper bound (
max_valuenull) instead of-1, which read as a bound below every other zone's, so a query such asmax_value < 150counted the top zone among the lowest. The descriptions of the cadence, workout type and zone points columns now say what Strava reports in them. The athlete's zones change at the next weekly athlete refresh; an activity's zones already stored change after a resync, from the Sources page or withomnesis sources resync strava-activities. -
2a0bf0f: The Strava source keeps listing new activities while it works through a backlog of activity details, comments, zones and streams. A batch the rate limit could not cover used to hold back the whole source, and new activities waited with it; working through the backlog now stops at 80% of Strava's limits, which leaves the listing reads of its own. When Strava itself refuses a request as over its limit, the source now reads which window is spent from the read limit as well, the one a new Strava app reaches first, and waits until that window resets: until midnight UTC once the day is spent, rather than trying again every quarter hour, or every hour once the overall day was spent.
An athlete with more gear than one 15-minute window of reads can fetch no longer stops the source: the athlete refresh waited for a window that could cover all of its gear at once, which never came, and new activities waited behind it. It now fetches what each window allows and carries on in the windows after. A newly added Strava source syncs every 30 minutes rather than every 5. A Strava source added earlier keeps the interval it has;
omnesis config set /sources/strava-activities/syncInterval 30mgives it the new one. -
be832f0: The Strava source no longer spins when it runs out of API budget. It used to ask for the same empty page dozens of times a second, each one a round trip to the gateway, and because it never let go of usage counted in a window that had already reset, the loop did not end when the window did. It now shows as rate-limited and waits until Strava's 15-minute or daily window resets.
-
2a0bf0f: Connecting Strava asks for Strava's permission to read activities as well as the one for private activities, so an athlete who unticks private activities on Strava's authorization screen still has a source that syncs their other activities, and one who unticks every activity box is asked to connect again instead of seeing an unexplained error on every sync. While a grant leaves private activities out, those already synced are removed; connecting again with the box ticked brings them back at the next daily check of the activity list. The sign-in now says what each unticked box leaves out, also when it goes through the gateway's public address, and the setup wizard asks for that address's host name as the callback domain.
-
2a0bf0f: One activity Strava keeps failing to serve no longer stops the Strava source. Such an activity used to end every sync on it: the activities behind it were never enriched and new activities stopped being listed until a resync, which met the same activity again. The source now asks for that activity again after half a day, and after its third failure, a day after the first, carries on without that part of it; when Strava itself is down, a sync still stops with the error as before. A batch of long activities' streams larger than the gateway accepts in one request was also sent again on every sync and stopped the source the same way; the source now sends streams in batches the gateway accepts, and stores none for an activity whose streams alone are too large. An activity whose details, comments or kudos Strava refuses is passed over rather than stopping the sync.
-
e86284b: An update no longer leaves an OpenClaw or Hermes integration without corpus access, and an approval you give is no longer lost.
omnesis updateand fleet updates refresh the plugin withconnect --refresh --no-interactive: a working sign-in is left to the plugin, a missing one is re-issued with the agent device's own credentials, and when nothing approved is left the refresh stops and namesomnesis connect <harness> --refreshinstead of opening approval requests nobody waits on. A refresh run without a terminal behaves the same way. An interactive refresh asks for a new approval only after those headless steps fail, keeps a single request open per integration across runs, waits for that request's whole lifetime through a stalled gateway, and the next refresh collects an approval given after the command stopped, within the request's ten-minute lifetime. The gateway ends an agent's older open request when the same agent opens a new one, so the phone never offers an approval the agent cannot receive. A refresh never erases the stored tokens before it has replacements, and both plugins re-issue a token set that a stopped refresh left missing, instead of refusing the credential file. -
27f40cf: Date extraction waits for a voice note's gateway transcript — up to
enrichment.dates.pendingContentWaitMs(1 hour) — so the dates a Tell Omnesis voice note mentions are read from the gateway's words rather than the phone's interim transcript. -
9c6e93d: Gateway dictation for Tell Omnesis is on by default whenever a transcriber model is assigned, without experimental mode; set
inference.dictation.transcribeOnGatewayto false to keep the phone's transcript only. The Brain waits for a voice note's gateway transcript — or for the gateway to give up on it — before reading the note, up tobrain.pendingContentBarrier(1 hour), so it reads each note once, in the gateway's words. Apple Watch notes dictated as text are kept on the watch until the iPhone confirms it has them, like recorded voice notes. The portal's Tell Omnesis page marks a voice note still being transcribed, and no longer shows the gateway's transcript as an edit.- @omnesis/agent-integration@0.6.0
- @omnesis/cli-shared@0.6.0
- @omnesis/collector@0.6.0
- @omnesis/config@0.6.0
- @omnesis/core@0.6.0
- @omnesis/eval@0.6.0
- @omnesis/gateway@0.6.0
- @omnesis/gateway-client@0.6.0
- @omnesis/source-sdk@0.6.0
- @omnesis/types@0.6.0
Checksums (SHA-256)
13052a92912c6773a0d00a800f592ef3b93f12422f2636a1eb9db27a9b200483 artifacts/install.sh