github code-yeongyu/oh-my-openagent v5.1.64

32 minutes ago

Desktop memory sync now starts as soon as the engine boots, without waiting for a session. An engine started by omo host ensure loads extensions only when a session opens, while the desktop opens none until the engine has sent the memory-sync bootstrap handshake, so the two waited on each other. The compiled omo and the npm launcher now start that one claim before the engine loads whenever an RPC engine's launch declares a memory-sync channel; the first session reuses it. A claim that fails still reports memory sync as unavailable and never falls back to CLI credentials. (#12702) (#12704)

Internal (tests only): macOS trust acquisition reads /etc/ssl/cert.pem through the already-injectable bundle reader, and a test now proves that a malformed default file yields the structured openssl-default-file-malformed drop entry (file, cause, block index, narrowing). (#12633)

Internal (tests only): the OpenSSL default-file importer tests now pin that any high byte on a BEGIN line, not only a BOM, drops the whole file. (#12632)

Internal (release tooling): the omo-native trust mutation harness counts a mutant as killed only when a named test fails by an assertion; a mutant that only throws a runtime error or crashes on load is now reported as crashed and fails the run. (#12631)

Fixed

  • Memory sync no longer loses an edit when two devices change the same line of a memory file at the same time. Devices on this version keep both edits as whole lines, and every device converges. Before, the edits were merged character by character into text that matched neither (#12279).
    • Between devices on this version, an edit does not disturb a line nobody edited. The exception is a very large rewrite: when one device adds and removes more than about 2,000 lines of a note in one save, that save is merged character by character, as before this fix, so a concurrent edit to the same line can still splice.
    • When the note's body or the new text does not end with a newline, the edit is still merged character by character, as before, so two concurrent edits to that last line can still splice.
    • With a device that still runs an older version, its old character merge can still go wrong in these ways:
      • Adjacent lines can fuse. The older device rewrites the line right after a line this version edited. Depending on the two devices' internal ids, the two edits can fuse into one line followed by an empty line. Measured: from head, one, two, tail, this version writes ONE and the older device writes TWO, and the result can be head, TWOONE, an empty line, tail. Two older devices give head, ONE, TWO, tail.
      • Leftover text moves. The older device edits a line this version deletes. Its leftover text joins a neighbouring line.
      • Its own diff touches other lines. The older device's character merge crosses into a line its user did not edit. This also happens between two older devices.
    • Two older devices keep their old character merge until they update. (#12597)
  • Memory sync: the push phase of a large memory set no longer needs memory in proportion to the whole set. Every push step used to re-read and re-write one journal file holding every pending item's data, several times per batch. A device pushing a few thousand memory files therefore peaked at 2 GiB or more (#12286). The journal now keeps a small index of pending items with their data in separate files, and a push reads only the batch it is sending. Capturing the set before the push still holds each captured file's text until the capture ends. A journal written by an older build is converted the first time it is read, including one where an older build added items next to the new index. (#12597)
  • Memory sync: a device receiving a large memory set no longer slows down with every file it lands. The render step used to re-read every render record of the cycle for each file, so the first pull of a few thousand memory files took tens of minutes (#12285). Each file now costs the same, and the crash-resume behavior is unchanged. (#12597)
  • Memory git no longer takes core.hooksPath, core.fsmonitor, include.path or includeIf.*.path from an inherited GIT_CONFIG_COUNT pair or GIT_CONFIG_PARAMETERS entry, so an exported pair such as core.hooksPath=/dev/null can no longer silently skip the memory repository's hooks and mirror push. Every other injected pair (url.*.insteadOf, http.extraHeader, credentials, safe.directory, ...) still applies, renumbered; an injected list git itself cannot parse is dropped whole. Memory git also no longer inherits repository redirection (GIT_DIR, GIT_WORK_TREE, GIT_COMMON_DIR, GIT_OBJECT_DIRECTORY, GIT_NAMESPACE, GIT_CONFIG, ...), so it can no longer be pointed at another repository; GIT_INDEX_FILE, GIT_CONFIG_GLOBAL and GIT_CONFIG_NOSYSTEM are kept. (#12360, fixes #12354) (#12597)
  • Memory sync no longer stops every push from a device when one memory file's change is larger than the 8 MiB batch limit: that file is held back and named in the sync status with what to do, every other memory keeps syncing, and the file syncs on its own once it fits. A change another device makes to a held file is kept and lands in this device's copy once the file fits, and a change an older build had already queued for such a file is recovered the same way instead of staying stuck. The TUI footer shows sync held and the notice says the file is being held back, and a refused entry that pauses sync is never hidden behind a held file. (#12284) (#12597)
  • Opening a memory repository starts up to six fewer git processes: the local config defaults are read with one git config --list instead of one git config --get per key, and the line-ending repair is skipped while the repository tracks nothing. Every session that opens memory pays this, and on a loaded machine each git process costs hundreds of milliseconds. memory-core's own tests now run under the canonical 20 s test budget instead of per-file 5-15 s limits, which made them fail only on busy hosts. (#12104, fixes #12103) (#12597)
  • thread_send no longer reports a message as queued when nothing will ever pick it up. When the target thread's session has no running drain, the send now answers queued_offline: the message is kept and the session takes it the next time it runs, so a caller knows no turn started and can act instead of waiting. The drain also reports a message it is holding behind the user's unsent draft, so a live drain is never mistaken for a missing one. (#12488, fixes #12486)
  • Verify recursive removal (sync and async) actually removed its path, retry bounded silent leftovers, and join sweep-test removers before deleting their fixture parents. (#11834)

Added

  • Windows releases now carry omo-git-job-helper.exe, a small native helper that runs each memory git command inside its own kill-on-close job object, so a later writer can prove that a killed writer's git is gone before it reclaims a stranded lock. Nothing uses the helper yet: memory-core keeps today's Windows behavior until a follow-up wires it in, and no release claims the new protocol until its in-flight-creation stress row has passed on Windows CI. (#12105, part of #10391) (#12597)

  • f2f2264 Merge pull request #12597 from code-yeongyu/memsync/train-memsync-5

  • 44fa71d Merge pull request #11834 from code-yeongyu/fix/11806-root-sweep-cleanup

  • 32ae126 Merge remote-tracking branch 'origin/dev' into fix/11806-root-sweep-cleanup

  • 454d7ab Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • 22ef014 Merge pull request #12488 from code-yeongyu/fix/12486-thread-send-no-drain

  • 55ca0d7 Merge pull request #12704 from code-yeongyu/fix/memsync-claim-at-host-boot

  • cab3d22 Merge remote-tracking branch 'origin/dev' into fix/12486-thread-send-no-drain

  • 3a6a7bb Merge pull request #12632 from code-yeongyu/test/10762-begin-highbyte-nonbom

  • f218dfc Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 69bdd38 Merge pull request #12633 from code-yeongyu/test/10762-native-default-file-drop

  • 0a55872 Merge pull request #12631 from code-yeongyu/fix/10762-mutation-kill-assertion

  • db00709 Merge remote-tracking branch 'origin/dev' into fix/memsync-claim-at-host-boot

  • e481d62 Merge pull request #12738 from code-yeongyu/release/v5.1.63-source-state

  • 02efb0c Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • 219e68a Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • e1463cf Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 065a093 Merge pull request #12739 from cynkai/fix/12733-registrant-event-timestamps

  • 53f2db0 Merge remote-tracking branch 'origin/dev' into fix/12486-thread-send-no-drain

  • edc8fb3 test(device-service-core): time each registrant event relative to the wait in a run-out message (#12733)

  • 3c716cd Merge remote-tracking branch 'origin/dev' into fix/memsync-claim-at-host-boot

  • 1feb679 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • 66d08a9 Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • de85336 Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • f2fe61e Merge remote-tracking branch 'origin/dev' into fix/12486-thread-send-no-drain

  • 4be486c test(memory-sync): run the POSIX fd-5 boot-claim test on POSIX only

  • bc0e1b2 test(memory-sync): guard the boot-claim test client and pid instead of non-null assertions (lint ratchet)

  • ce2a801 Merge remote-tracking branch 'origin/dev' into fix/memsync-claim-at-host-boot

  • aee4a8d fix(memory-sync): export the boot gate beside the claim so every entry calls one implementation

  • 5349543 fix(memory-sync): claim the desktop channel when an RPC engine boots (#12702)

  • c14cf35 test(memory-core): compare the git dir path platform-normalized (Windows prints forward slashes)

  • 4df1181 Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • 10891b7 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • 0b7213f Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 4a7db85 Merge dev into fix/11806-root-sweep-cleanup

  • 9fdc139 Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • 586e045 Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 9aa8272 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • f95427e Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • e27d955 Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 8fc3acf Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • c44f029 Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • a710500 Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • 857c294 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • 2af8c14 Merge remote-tracking branch 'origin/dev' into fix/10762-mutation-kill-assertion

  • e74241b Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • d971557 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • c483b79 Merge commit '81ed5934013aeb173fa87b190e357e0ad8bdc4c7' into fix/10762-mutation-kill-assertion

  • 1af9029 Merge remote-tracking branch 'origin/dev' into test/10762-native-default-file-drop

  • 81999dc Merge remote-tracking branch 'origin/dev' into test/10762-begin-highbyte-nonbom

  • a06747e fix(script): count a failed expect.assertions/hasAssertions as an assertion kill (#10762)

  • ca32c61 test(omo-native): make the foreign-marker test fail by assertion when the stage refuses or skips its record (#10762)

  • 56a8d6a chore(changes): add fragment for #12633

  • f05bece chore(changes): add fragment for #12632

  • 827c6f8 chore(changes): add fragment for #12631

  • c4d5985 test(omo-native): read the macOS default file through the injected bundle reader and test its drop (#10762)

  • e71c392 test(omo-native): pin a non-BOM high byte on a BEGIN line dropping the default file (#10762)

  • 6dbd294 fix(script): count a mutant killed only by an assertion; a runtime error or crash is crashed (#10762)

  • d225166 Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • ceed2fd memory-core: persist the doc before marking a recovered entry imported, so a capture whose persist failed is never skipped after a restart

  • 4647e55 Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • 9236c42 Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • 6d4d507 changes: fold #12297, #12104 and #12105 fragments into the train fragment (#12597)

  • 17fd628 Merge #12132 into the memsync train

  • 786e4fa Merge #12105 into the memsync train

  • fe3fdc5 Merge #12104 into the memsync train

  • 1e823c0 memory-core: lock capture recovery's imported skip and the lost-mark re-check (design-gate M1, M2)

  • 938bfbe Merge the memsync train (#12597) into #12297: port capture to the outbox, mark imported entries

  • 4cc9e30 changes: name the train fragment after its PR (#12597)

  • 9e26f72 Merge remote-tracking branch 'origin/dev' into memsync/train-memsync-5

  • 6c3c592 changes: fold the train members' changelog fragments into one

  • f1f21d6 Merge commit 'a0af0bae4fa9fe26b7d1168be560a6ba0d14223b' into memsync/train-memsync-5

  • bd83f2d Merge commit 'd4a832897aef76e1bbf91ab010439407bdf6345d' into memsync/train-memsync-5

  • 51193c7 Merge commit '017902297fae112cca777f76992fe8b4bca3f1e1' into memsync/train-memsync-5

  • 25f9b88 Merge commit '1afd37288d8525c7d30c5784d9e310fdf59bc24a' into memsync/train-memsync-5

  • 7ac2b08 Merge remote-tracking branch 'origin/dev' into fix/11806-root-sweep-cleanup

  • adc4da0 docs(changes): add the #12488 fragment for thread_send queued_offline

  • 1afd372 Merge remote-tracking branch 'origin/dev' into fix/memsync-same-line-concurrent-edit

  • abf1fd2 fix(memory-sync): spread-out line edits on a long note stay separate hunks

  • 744b369 test(thread): a fake wake with no drain behind it now reads queued_offline (#12486)

  • 6703e51 fix(thread): a send whose wake reached no drain answers queued_offline, not queued

  • 75a943f Merge remote-tracking branch 'origin/dev' into fix/memsync-same-line-concurrent-edit

  • 4ec838d Merge remote-tracking branch 'origin/dev' into fix/memsync-oversized-item-no-block

  • d4a8328 Merge remote-tracking branch 'origin/dev' into fix/memsync-large-pull-linear

  • 0179022 Merge remote-tracking branch 'origin/dev' into fix/memsync-push-memory-bounded

  • a0af0ba Merge remote-tracking branch 'origin/dev' into fix/memcore-git-env-hermetic-12354

  • 2063adf Merge remote-tracking branch 'origin/dev' into fix/12103-soul-edit-persona-load

  • a1b7918 test(memory-core): the live-lock journal case keeps its own 15 s budget

  • 796e3ff fix(memory-core): run the sync space's git through the memory git environment filter (#12354)

  • 318d5a1 test(memory-core): RED: an inherited GIT_DIR must not point the sync space config or remote list at another repository (#12354)

  • 69d3523 fix(memory-core): match GIT_CONFIG_* and the other git names exactly off Windows (#12354)

  • 2410a12 test(memory-core): RED: a mixed-case Git_Config_* pair must not become config git never reads off Windows (#12354)

  • 35cc69a fix(memory-core): keep inherited git config pairs that leave memory's hooks alone (#12354)

  • 9f898e0 test(memory-sync): render-reads bound also requires record reads to be observed

  • 8ba4701 fix(memory-sync): remove a refused batch's sealed file so a frozen account's journal stays bounded

  • b118473 docs(changes): note the no-trailing-newline exception in #12295 fragment

  • 61618bc Merge remote-tracking branch 'origin/dev' into fix/memsync-oversized-item-no-block

  • 4686e33 Merge remote-tracking branch 'origin/dev' into fix/memsync-same-line-concurrent-edit

  • e26942b Merge remote-tracking branch 'origin/dev' into fix/memsync-push-memory-bounded

  • 545366c Merge remote-tracking branch 'origin/dev' into fix/memsync-large-pull-linear

  • c982ca8 docs(changes): add the #12360 changelog fragment for the memory git environment fix (#12354)

  • 25f6bf9 Merge remote-tracking branch 'origin/dev' into fix/memcore-git-env-hermetic-12354

  • 6703e79 fix(memory-core): run memory git without inherited GIT_CONFIG_* or repository redirection (#12354)

  • 7a5cd03 docs(changes): state the mixed-version adjacent-line fuse and the size-cap duplicate in the #12295 fragment

  • 510c93c fix(memory-core): drop the sameFrontier re-export the span lookup no longer uses (knip: unused export)

  • 252579e fix(memory-sync): restore a recovered capture's baseline from its own receipt; split the item store's recovery operations (#12284)

  • 2de1b50 test(memory-core): RED for gate round 4 H-1: a crashed revive of a held file must not duplicate the next edit (#12284)

  • 35dd460 fix(memory-sync): finish a journaled capture's import after a crash instead of journaling a second op (#12284)

  • 27177bc test(memory-core): RED for gate round 3: a device-peer op missing its deps, and the revive-then-delete case (#12284)

  • 3c0718f test(memory-core): RED for gate round 2: journaled-op recovery keeps reverts, deletes and foreign ops right (#12284)

  • 5729707 fix(memory-core): body line ops insert after the replaced hunk, so no concurrent insert lands on an unedited line (#12279)

  • b801db9 test(memory-core): RED for line ops that strand a concurrent insert onto an unedited line (#12279)

  • 200c50b test(memory-core): RED: a crash between journaling and importing the healing edit must not journal a second op (#12284)

  • f6179d8 chore(bundle): raise omo.js budget for the #12297 held-status adapter surface (+508 B)

  • df5876d fix(memory-sync): convert a mixed pending journal per entry and check batch bytes locally

  • 4caeae0 fix(memory-core): keep the rewind fault point module-local (knip: unused export)

  • ff188ad fix(memory-sync): never lose a peer's edit to a held file, recover an old build's queued item, truthful held status (#12284)

  • 8d20c63 test(memory-sync): RED for the design-gate conditions and the review LOWs (#12284)

  • fdca6cc Merge remote-tracking branch 'origin/dev' into fix/memsync-same-line-concurrent-edit

  • 85ceda2 test(memory-core): RED for the #12297 review: owed peer edit, old-build queued item, re-capture churn (#12284)

  • 1f57dc8 chore(knip): drop the preExistingExports row for the removed OversizedItemError (#12284)

  • 74a2510 docs(changes): describe the gated line merge in the #12295 fragment

  • 6f25e64 fix(memory-core): run the body line diff only when every account member advertises it (#12279)

  • 1d450e0 Merge remote-tracking branch 'origin/dev' into fix/memsync-push-memory-bounded

  • 23f35a7 docs(changes): rename the changelog fragment to #12299 for the bounded push-memory fix (#12286)

  • 3b9aec8 test(memory-core): RED for mixed-version accounts corrupting an unedited line (#12279)

  • 56711e6 Merge remote-tracking branch 'origin/dev' into fix/memsync-large-pull-linear

  • 833d3ea docs(changes): rename the changelog fragment to #12298 for the linear large-pull fix (#12285)

  • aefdefa Merge remote-tracking branch 'origin/dev' into fix/memsync-oversized-item-no-block

  • 6d9088d docs(changes): add the #12297 changelog fragment for the oversized memory item fix (#12284)

  • ee28a29 docs(changes): fragment for #12295

  • 0239253 fix(memory-sync): keep pending ops out of the journal index so a push holds one batch

  • 5dbec2e fix(memory-core): merge concurrent edits of one body line as whole lines, never a character splice (#12279)

  • afb04cf fix(memory-core): hold an oversized memory item back instead of failing every push (#12284)

  • 2e4053d test(memory-core): RED for concurrent same-line body edits merging into a character splice (#12279)

  • 42f421e fix(memory-sync): count render seqs in memory so landing a large set is linear

  • f143fcd test(memory-core): one oversized memory file must not block the other 500 from syncing (#12284)

  • 2fe42b9 Merge fix/10391-windows-job-helper-native (#12105) into fix/10391-helper-done-latency

  • 94e94a1 Merge origin/dev into fix/12103-soul-edit-persona-load

  • 0f5f754 Merge fix/10391-windows-job-helper (#12097) into fix/10391-windows-job-helper-native

  • 437e912 fix(git-job-helper): re-read F's count after the last watched member exits (#10391)

  • 64614c3 test(git-job-helper): RED rows for a member handle that signals before the count drops (#10391)

  • 73f2531 fix(git-job-helper): wake on member handle signals so done follows the last exit (#10391)

  • 45751ff test(git-job-helper): RED row for done latency after the last member exits (#10391)

  • b0638ee fix(git-job-helper): fix the six review findings on #12105 (GREEN)

  • 4de38f4 test(git-job-helper): RED rows for the six review findings on #12105

  • 54e1190 fix(git-job-helper): exit while holding F; read TokenElevation with its exact size

  • e656439 fix(git-job-helper): keep one pending control read in AWAIT_GO

  • 093b740 docs(changes): fragment for the Windows git job helper

  • 9803ffb build(git-job-helper): ship the helper in the Windows compiled payloads

  • 7d759a8 feat(git-job-helper): implement run, probe and selftest (GREEN)

  • 552267e test(git-job-helper): add native contract rows N1-N10 for the Windows git job helper (RED)

  • 38837f0 changes: fragment for #12104

  • d5a758c test(memory-core): give every memory-core test the canonical 20 s budget, spawn fewer git processes per open

  • 9819f37 chore(changes): name the cleanup fragment for #11834

  • 69faa7b fix(test): verify synchronous cleanup and join sweep removers

Thank you to 3 community contributors:

  • @ahmet-cetinkaya:
    • fix(runtime-fallback): bound the session timeout fallback loop
    • fix(runtime-fallback): scope timeout rollback to the owning dispatch
    • fix(runtime-fallback): revalidate ownership before the terminal abort
    • test(runtime-fallback): prove stale completion is rejected without duplication
    • docs(evidence): record isolated provider-backed QA for #6637 fix
    • fix(runtime-fallback): stop the notify toast from blocking the terminal abort
    • test(runtime-fallback): fix an unreachable wait in the stale-completion test
    • test(runtime-fallback): wait on the gate's own queue-drain signal
  • @YoonwooHa:
    • fix(omo-native): make omo update replace the installed launcher, not the runtime copy (#12626)
    • fix(omo-native): prune old binary runtimes on launch (#12626)
    • Merge origin/dev into fix/compiled-update-launcher-path
    • fix(omo-native): move the changelog entry into a fragment and test linked runtimes (#12627)
    • fix(omo-native): re-check live runtimes after the prune rename (#12627)
  • @cynkai:
    • test(device-service-core): time each registrant event relative to the wait in a run-out message (#12733)
bun add -g omo-ai

Don't miss a new oh-my-openagent release

NewReleases is sending notifications on new releases.