github code-yeongyu/oh-my-openagent v5.0.0-beta.64

latest releases: v5.0.0-beta.66, v5.0.0-beta.65
5 hours ago

Engine: senpi 2026.9.16

Reasoning shows up while the model is still reasoning. Claude lanes used to sit on a "Working" line for the whole thinking phase and then dump the entire reasoning block at once, because the empty-response recovery wrapper buffered every event until the first visible text or tool call. Seven days of session files say 80% of Claude turns with thinking were held that way, a median of 16 seconds, 37 seconds at p90. The wrapper now starts forwarding at the first meaningful event, so thinking arrives as the model produces it and the assistant message opens as soon as the provider answers. A turn that streams reasoning and then ends with nothing is no longer replayed inside the stream, where a second start would duplicate the message: it ends as a retryable error that keeps what you already saw, and the session's own turn retry re-requests it. Kimi keeps the old buffered path on purpose, since its reasoning channel is where misrouted tool calls land.

read returns structure for JSON. Eligible .json files come back as a segmented structural view with declaration-safe folding instead of raw bytes, while TypeScript and JavaScript stay verbatim because the measured candidate missed the required saving for both. Explicit offset/limit requests, truncated input, markdown and .txt keep the old path.

One extension can no longer hold quit hostage. Every session_shutdown handler runs under a host budget and receives a per-handler signal that aborts when it overruns, so a slow handler stops blocking quit, /reload, /new, /resume and forks. The budget is configurable.

JavaScript eval cells can publish tools to their children. tool(fn, metadata?) registers a named function as a fenced tool for in-process children, the worker answers describe and invoke requests on a pump separate from the top-level run queue, and workpool(agent, name, mode?) lands in the JS, Python, Ruby and Julia preludes as a thin adapter over the host workpool tool. Background agent(..., handle: true) now requires a structured task id and run epoch from the host.

Terminal teardown escalates instead of hoping. TerminalSession.terminate() signals, waits, and escalates to SIGKILL; the session registry gained grace settings for the forced kill and for detached children, and detached cleanup kills what survives its grace. An opt-in Bun terminal backend is available behind SENPI_BUN_TERMINAL.

Session lists stopped mixing durable and live state. SessionMetadata replaces SessionSummary for listSessions() and server snapshots, runtime state comes only from an acquired session, and the protocol gained transport-neutral CBOR schemas with length-prefixed framing.

OmO

ulw-loop survives an eval-kernel reload. A reload used to drop PI_SESSION_CWD and PI_GOAL_STORE_FILE, which failed the toolkit with PI_SESSION_CWD is required and hid the live driver goal, so the loop advised creating a goal that already existed. Both are now derived from the session file before falling back, each fallback names its remediation, and the help text, addGoal criteria and artifact paths came along in the same pass.

The Kibitzer stopped reading your whole disk. Its read-only grep walked the entire workspace and read every file up to 1MB; on a real 277,000-file workspace the walk alone cost 2.5 seconds and a rare pattern read everything. Candidates now come from git so .gitignore counts, the scan stops at file-count, byte and wall-clock budgets, and it honors the turn's abort signal instead of running past the wake deadline. Candidate collection also went incremental: per-trigger CPU on the 800-document fixture dropped from 308 ms to 5 ms with identical output, which removes the pause that landed on every tool call in a large memory corpus.

Session shutdown no longer waits on the Kibitzer. The memory extension used to await its sidecar's shutdown and the facts cancellation outside the 1.5-second drain budget, so a slow lease release stalled quit, /reload, /new and /resume and starved the steps queued behind it. Both awaits now race the drain deadline and finish detached, and the wake lease and the sidecar directory lock are still released. Every wake is bounded from admission as well: the 90-second deadline is armed before the child starts, a 300-second total cap holds through steer re-arms, and a stall during child start ends the wake, hands the slot back and disposes the late child.

Typed task handles. Background task handles carry a run epoch, so a handle from a previous run cannot be mistaken for the live one.

workpool is a new host tool for keyed, batched fan-out. workpool create { name, agent, mode?, tools? } opens a pool whose workers run a category or subagent_type with a prompt; push { pool_id, items: [{ key, input }] } returns { pool_id, item_ids } at once without waiting for capacity, and scheduling happens one event-loop turn after the durable receipt, so every later wake is event-driven. inspect reads the persisted record with each item's status and its data or error, close stops intake and lets in-flight items finish, and cancel marks queued and assigned items cancelled and cancels their workers. Pool ids are wp_<32 hex>, item ids wi_<32 hex>. Re-pushing a key with byte-identical input is idempotent; a divergent re-push is a yield_conflict. A pool worker takes the same admission lease, per-model concurrency slot and spawn-policy checks as a task spawn, so nothing in a pool bypasses admission. One acknowledged aggregate result is delivered through the idle-injection path without polling, and it survives a reconnect once.

Pool workers default to keep_alive. On one real batch, keeping a worker warm between items answered at a p95 of 12 to 13 seconds against 42 to 51 seconds fresh, on about a fifth of the tokens, with identical correctness, so keep_alive is the default and fresh stays available per pool. A worker that yields after a stale-kernel error produces one keyed error and the single aggregate, never an automatic retry.

A parent's JavaScript tools are scoped to the child that receives them. A grant is computed from the child's resolved effective tool set, so a curated read-only agent, a child whose policy is narrower than the parent for any write-capable tool, and process, team and non-JavaScript children are refused with a typed error and no child session. A revived child re-checks the parent kernel's generation and revision on every call: a reset, a same-name redefinition or a new host without the live binding returns kernel_tool_stale or tools_unavailable on the child's own result channel instead of running a stale closure.

  • 9a219d1 Merge origin/dev into release/v5.0.0-beta.64-source-state
  • b3e8909 Merge pull request #8351 from code-yeongyu/fix/7832-git-attribution-default-off
  • 6fc8809 Merge origin/dev into release/v5.0.0-beta.64-source-state
  • 66e8d2e Merge pull request #8358 from code-yeongyu/docs/beta64-workpool-emphasis-20260916
  • b3c053f Merge origin/dev into fix/7832-git-attribution-default-off
  • 79213a0 docs(changelog): emphasize the workpool engine and scoped kernel tools in beta.64
  • ab77480 Merge origin/dev into fix/7832-git-attribution-default-off
  • 5a2ceb6 Merge pull request #8354 from code-yeongyu/fix/8348-subagent-target-honesty
  • f0a1a41 docs: record that a subagent_type is never resolved as a category
  • f86ba87 fix(git-master): stop shipping a GitHub-resolvable co-author and make the commit footer opt-in (refs #7832)
  • c54164a Merge pull request #8350 from code-yeongyu/fix/changes-diff3-markers-20260916
  • 17df625 docs(changes): drop leftover diff3 base markers from the O6 dev merge
  • b60191d Merge pull request #8331 from code-yeongyu/feat/omp-o6-20260913
  • 0fae7df merge: sync origin/dev into feat/omp-o6-20260913
  • 82cfd88 fix(task): share one child tool list between grant and session options
  • a4c7962 Merge pull request #8344 from code-yeongyu/fix/kibitzer-shutdown-and-wake-bounds
  • 154bc53 Merge origin/dev into fix/kibitzer-shutdown-and-wake-bounds
  • 2b05bdc Merge pull request #8345 from code-yeongyu/fix/ulw-sdk-friction-8332-8333-8334
  • 1f00114 Merge pull request #8342 from code-yeongyu/fix/kibitzer-grep-budget
  • cf86e2a Merge origin/dev into fix/kibitzer-grep-budget
  • d494121 Merge pull request #8340 from code-yeongyu/fix/recall-collect-hot-path
  • b21f0b3 docs(changes): record the bounded session shutdown and Kibitzer wake caps (#8344)
  • 43772b2 feat(ulw-loop): criteria on addGoal, self-describing help, artifact-bound evidence (refs #8334)
  • 585bfa1 fix(ulw-loop): report a differing driver objective once and keep create_goal advice for a missing driver (refs #8333)
  • a7d978c fix(task): scope parent kernel tools to the child's effective tool set
  • e6e9cd1 docs(kibitzer): record the bounded, gitignore-aware sidecar grep
  • e0278f4 fix(kibitzer): honor .gitignore in the sidecar grep candidate list
  • fb70106 fix(kibitzer): bound the sidecar grep scan and honor the turn signal
  • 055aa10 docs: record the incremental kibitzer candidate collection change
  • c6f9733 perf(memory-core): serve the recall ledger from a stat-gated read cache
  • 71121a6 perf(memory-core): gate the recall HEAD probe on git ref file stats
  • 83a8cfd perf(memory-core): memoize the normalized recall haystack per corpus revision
  • e2426cf fix(task): fail closed on stale revived kernel capabilities
  • 5fbcb0d feat(task): grant scoped JS kernel tools to in-process children
  • 879a8b7 Merge pull request #8217 from code-yeongyu/feat/omp-o2-20260913
  • 9fa1412 merge: sync O2 with origin/dev@40b4229be
  • 231ed1e merge: sync O2 with origin/dev@eb29e87b5
  • 40b4229 Merge pull request #8327 from code-yeongyu/release/v5.0.0-beta.63-source-state
  • f2b5a2a fix(workpool): pin attach-recovery session_start and lock crash-recovery
  • deeba7b merge: sync O2 with origin/dev@e9dffe06d
  • 7602292 fix(workpool): acknowledge aggregate delivery and close review findings
  • 6b5f07f feat(workpool): deliver one aggregate result and selected default
  • 5f27464 merge: sync O2 with origin/dev@c5b7e6ac5
  • 8c617dc test(task): run real member residency outside Windows --parallel
  • c196fea fix(task): keep the member boot graph identical to dev
  • 81c5a72 test(task): compare dev and candidate member boot module graphs
  • 1606b89 fix(task): remove cold member boot-only dependency overhead
  • 515925e test(task): expose child bootstrap and loaded-module residency stages
  • d5c31e9 test(task): retain stage diagnostics for process-member residency
  • 4846ad7 merge: sync feat/omp-o2-20260913 with origin/dev@efadd155e
  • 6190628 fix(workpool): gate worker initialization before member RPC startup
  • 2083a82 merge: sync feat/omp-o2-20260913 with origin/dev@2d172c645
  • f5f3920 feat(workpool): persist batched turns and keyed results safely
  • bbef86f merge: sync feat/omp-o2-20260913 with origin/dev@0bda2b69b
  • 363d47c merge: sync feat/omp-o2-20260913 with origin/dev@d1557a4b4
  • adb6727 feat(task): add engine-owned workpool admission
  • 05b3934 test(task): load real-session fixture through lazy boundary
  • 577becc build(task): refresh typed handle producer bundles
  • f3521d2 feat(task): emit typed task identity and run epoch
npm i -g omo-ai@beta

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

NewReleases is sending notifications on new releases.