Open source AI, last day, April 2026 - downstream

Open source AI projects, tools and updates, last day of April 2026, read from one package-lock write

Every other page for this query is the top of a GitHub trending feed or a release-bot digest: ComfyUI v0.19, Ollama v0.20.6, Transformers v5.5.4, llama.cpp b8779, plus whatever is currently melting the Hugging Face home page. This page is the other side of those lists. On Saturday 2026-04-18, one consumer Mac app, Fazm, had exactly one day of open-source AI releases to absorb. Here is what that absorb looked like in source: three package bumps, one new JSON-RPC method, ten inserted lines of TypeScript, and one session that did not have to be destroyed to change model.

commit f0d49f0f
2026-04-18 14:01:10 PDT
acp-bridge/src/index.ts:1500-1509
+10 / -1
M
Matthew Diakonov
11 min read
4.9from written from git log, not from a trending list
ACP 0.25.0 -> 0.29.2
session/set_model
Claude Agent SDK 0.2.91 -> 0.2.112
10 inserted lines
4h 40m absorb window
zero session teardowns
Apache-2.0 all the way down

The anchor fact

The 24-hour open-source AI release wave that mattered to Fazm was one package, one RPC, ten lines.

At 09:33:11 Pacific time on 2026-04-18, commit 5a1d5a7a in the public Fazm repo changed one line in acp-bridge/package.json, bumping @agentclientprotocol/claude-agent-acp from ^0.25.0 to ^0.29.2. Four hours and twenty eight minutes later, commit f0d49f0f inserted ten lines at acp-bridge/src/index.ts:1500-1509 that call a JSON-RPC method that did not exist in ACP 0.25: session/set_model. That is the full delta between Fazm-on-the-previous-day and Fazm-today for any model switch a user makes in the floating bar. No session teardown, no message-history re-seed, no new sessionId allocated.

What actually moved on 2026-04-18

Three open-source AI packages and one newly-callable JSON-RPC method. The marquee below is not decorative; each chip is a line from the lockfile diff or the protocol change. The packages that did not move are named too, because what stays pinned is as much of the story as what bumps.

@agentclientprotocol/claude-agent-acp 0.25.0 -> 0.29.2
@agentclientprotocol/sdk 0.18.0 -> 0.19.0
@anthropic-ai/claude-agent-sdk 0.2.91 -> 0.2.112
session/set_model RPC newly callable
zod peer dep stays on ^3.25.0 || ^4.0.0
@playwright/mcp untouched on 0.0.68
ws stays at ^8.20.0
@types/ws stays at ^8.18.1

The absorb, by the numbers

Every number below is reproducible from a single shell session. Clone the Fazm repo, run git show 95287a32 -- acp-bridge/package-lock.json and git show --stat f0d49f0f. The first prints the three transitive bumps; the second prints the insertion count.

0Upstream packages bumped
0ACP minor versions skipped
0Claude Agent SDK patch releases absorbed
0Inserted lines in session hot-swap

For scale: the Claude Agent SDK alone shipped 0 patch releases between 0.2.91 and 0.2.112. Fazm absorbed all of them in 0 lockfile commit.

The one-line package.json change

This is the literal diff that triggered the day. The range moves from a 0.25.x caret to a 0.29.x caret, npm resolves it, and the lockfile cascade follows. Nothing else in acp-bridge/package.json moved. @playwright/mcp, ws, and @types/ws all stayed pinned.

acp-bridge/package.json (commit 5a1d5a7a)

The lockfile cascade, one minute later

That single range bump forces npm to re-resolve two transitive dependencies. The Agent Client Protocol SDK itself moves from 0.18 to 0.19, and Anthropic's open-source Claude Agent SDK steps across 21 patch releases between 0.2.91 and 0.2.112. The full lockfile diff is 226 lines rewritten, but the spine is this:

acp-bridge/package-lock.json (commit 95287a32)

Where the absorb actually happens, end to end

Three upstream open-source AI packages, all Apache-2.0, all on npm, all maintained by different teams (Zed Industries, Zed Industries again, Anthropic). They converge on one Node subprocess inside Fazm called acp-bridge. Anything downstream of that subprocess - the Swift UI, the AX perception layer, the MCP servers - never sees a package-version number.

Upstream OSS -> acp-bridge -> Fazm

claude-agent-acp 0.29.2
agentclientprotocol/sdk 0.19.0
claude-agent-sdk 0.2.112
acp-bridge (Node)
Fazm Swift UI
Floating bar model picker
api.anthropic.com

What session/set_model replaced

In ACP 0.25, the only way a client could change the model behind an in-flight session was to tear the session down and build a new one, re-seeding history if it wanted context preserved. The 0.29 protocol adds a single RPC that flips the model on the existing session. The two sequences below show both roundtrips, same user action (pressing the model picker), different protocol versions.

Pre 0.29: session teardown + new session

Fazm UIacp-bridgeACP SDKuser picks 'opus'session/cancel(sessionId)oksession/new({model:'opus'})newSessionIdreplay prior messagesre-indexed historyready, new sessionId

Post 0.29: session/set_model in place

Fazm UIacp-bridgeACP SDKuser picks 'opus'session/set_model(sessionId,'opus')okready, same sessionId

The ten inserted lines

This is the literal content of commit f0d49f0f at acp-bridge/src/index.ts lines 1497 through 1513. The conditional guards against no-op switches (same model, skip the RPC), calls acpRequest (the bridge's thin JSON-RPC wrapper) with the new method, updates the in-memory session record, and logs the transition. There is no session cleanup, no new sessionId, no history replay.

acp-bridge/src/index.ts (commit f0d49f0f, lines 1500-1509)
10 lines

Absorbing one 24-hour open-source AI release wave cost ten lines of TypeScript and one lockfile write.

git show f0d49f0f; git show 95287a32, github.com/mediar-ai/fazm

Seven commits, one Saturday, in order

The absorb was not a single push. It was seven commits spread across four hours and forty minutes, grouped into two clusters: a morning ACP bump, and an afternoon Swift-side reshape that keyed off the morning bump. Every commit is reproducible from the public repo.

1

09:33:11 PDT - commit 5a1d5a7a, package.json

One line changed in acp-bridge/package.json: the pinned range for @agentclientprotocol/claude-agent-acp moves from ^0.25.0 to ^0.29.2. This is the smallest commit of the day, and by design the first, so the rest of the absorb can key off the npm install that follows.

2

09:34:14 PDT - commit 95287a32, package-lock.json

npm install writes a new lockfile with three transitive bumps the range change forced: @agentclientprotocol/sdk 0.18.0 to 0.19.0, @anthropic-ai/claude-agent-sdk 0.2.91 to 0.2.112 (21 patch releases of Anthropic's Claude Agent SDK collapsed into one lockfile line), and the resolved tarball URLs and integrity hashes that come with each. 226 lines rewritten; 128 inserted, 98 deleted.

3

14:01:10 PDT - commit f0d49f0f, index.ts

The actual feature unlock. A 10-line block inserted at acp-bridge/src/index.ts lines 1500-1509 calls the new session/set_model RPC on the existing ACP session when requestedModel !== existingModel, then updates the in-memory sessions.get(sessionKey).model field. One deleted line is the stale log message. This is the sentence of TypeScript that turns 'click a different model in the floating bar' from 'lose your history' into 'keep your history'.

4

14:04:16 PDT - commit 8b4ad3bf, ShortcutSettings.swift

With the ACP side ready to accept mid-session swaps, the Swift side flips three default ModelOption ids from pinned full Claude IDs (claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6) to three short aliases (haiku, sonnet, opus). +13 lines, -18 lines. The alias is what now travels through session/set_model.

5

14:05:58, 14:12:23, 14:13:15 PDT - cleanup trio

Three follow-ups in the span of seven minutes: 0e679e48 strips description parsing from the label generator so the SDK-reported label wins, 28f94d0d flips normalizeModelId from 'expand short to long' to 'collapse long to short' so pre-upgrade UserDefaults still work, and 75676b9c refactors that into a local constant. Net for the trio: small, cosmetic, and exactly what you want after the absorb window closes.

Verify it yourself

Every string above is reproducible from two git commands against the public Fazm repo. The output below is what I captured on 2026-04-19 and should still match so long as the April 18 commits are reachable from main.

git log + git show, fazm repo, 2026-04-19

Four transferable rules from the April 18 absorb

The April 18 diff is not clever code. It is four boring rules applied to a very specific moment. Each card below is written for any consumer app that talks to a Claude-style agent SDK, in any language. Swift, TypeScript, Python, Rust - the rules do not care.

Pin one package, let it cascade

acp-bridge/package.json declares only @agentclientprotocol/claude-agent-acp. @agentclientprotocol/sdk and @anthropic-ai/claude-agent-sdk are transitive and move with it. One line in package.json, three packages updated, no direct coupling between your code and the Anthropic SDK version. This is why the day's absorb fit into a one-line package.json edit.

Use session/set_model, not session/new

A mid-conversation model switch without set_model means tearing down the session and re-seeding every prior message. That costs tokens (every tool-use block re-uploaded), costs latency (streaming restart), and costs UX (any in-progress tool call gets orphaned). set_model is a single RPC; session state survives.

Log the switch, not the teardown

acp-bridge/src/index.ts line 1507 writes a single log line when set_model succeeds: the session key, the old model, the new model. No 'session destroyed' or 'session rebuilt' message fires, because no session was destroyed or rebuilt. Observability matches behavior.

Keep the alias layer thin

The alias ('opus', 'sonnet', 'haiku') travels through session/set_model unchanged. The Swift side stores the alias in UserDefaults, the Node bridge forwards it to the Claude Agent SDK, and the SDK resolves it at the API boundary. Zero alias expansion in the Fazm codebase. That is what lets future Anthropic model releases absorb with no Fazm commit at all.

What this has to do with the accessibility-API layer

Nothing, and that is the point. Fazm reads macOS accessibility trees (AXUIElement, AXObserver, the kAX* attribute keys) to see any app on the Mac without taking screenshots and OCR'ing them. That architectural choice is independent of which open-source package is resolving the alias 'opus' behind the chat window.

That independence is why the April 18 absorb was ten lines of TypeScript in a Node subprocess and thirteen lines of Swift in a settings file. The AXObserver thread did not move. The MCP server manager did not move. The skill installer did not move. The whole open-source AI release wave of April 17-18, 2026, hit one Node subprocess and died there.

If your consumer Mac app is vision-first (screenshot plus VLM), the same kind of day goes differently: a new ACP minor touches your model-layer code, and also may touch your vision pipeline (prompting, resolution caps, segmentation quality). Separating perception from inference is how you keep the absorb window small.

Want to see the ten-line absorb on a real Mac?

I will open Fazm, switch between haiku, sonnet, and opus mid-conversation, and show you the acp-bridge log lines in real time. 20 minutes.

Book a call

Open source AI, last day of April 2026, FAQ

What is the one open-source AI update from the last day of April 2026 this page is actually about?

The npm package @agentclientprotocol/claude-agent-acp bumped from 0.25.0 to 0.29.2 between Zed's two April releases, carrying @agentclientprotocol/sdk 0.19.0 and @anthropic-ai/claude-agent-sdk 0.2.112 with it as transitive bumps. That bump exposed a new JSON-RPC method, session/set_model, which Fazm's acp-bridge subprocess now calls to switch the underlying Claude model on an already-running session instead of tearing the session down and starting fresh. The diff that calls it is 10 lines long and landed at acp-bridge/src/index.ts lines 1500-1509 in commit f0d49f0f on 2026-04-18 14:01:10 Pacific time.

Which Fazm commits on 2026-04-18 correspond to this absorb?

Seven commits, ordered by timestamp. 09:33:11 PDT 5a1d5a7a bumps acp-bridge/package.json from ^0.25.0 to ^0.29.2 (one-line change). 09:34:14 PDT 95287a32 updates acp-bridge/package-lock.json with the cascaded SDK bumps (+128, -98). 14:01:10 PDT f0d49f0f adds the session/set_model hot-swap block at acp-bridge/src/index.ts lines 1500-1509 (+10, -1). 14:04:16 PDT 8b4ad3bf flips three default ModelOption ids from pinned full IDs to short aliases in ShortcutSettings.swift (+13, -18). 14:05:58 PDT 0e679e48 simplifies model label generation. 14:12:23 PDT 28f94d0d flips normalizeModelId from expand to collapse. 14:13:15 PDT 75676b9c refactors that into a local constant. Total absorb window from first to last commit: 4 hours 40 minutes.

What does session/set_model actually do in ACP 0.29.2?

It is a JSON-RPC request against a live ACP session. Parameters are { sessionId: string, modelId: string }. The server side (@anthropic-ai/claude-agent-sdk, running inside the acp-bridge subprocess) rewires the session so subsequent turns use the new model, but the existing turn history, tool-use trace, and message IDs are preserved. Before 0.29.x, the only way to change model mid-session was to call session/new and re-seed prior messages. That round trip is what the April 18 diff deletes. You can verify by reading acp-bridge/src/index.ts:1497-1510 in github.com/mediar-ai/fazm, or by grepping the Agent Client Protocol 0.19.0 SDK for set_model in the @agentclientprotocol/sdk package.

Why did a four-minor-version ACP bump ship on a Saturday?

Fazm is a one-person-maintainer shop. The ACP SDK's 0.26, 0.27, 0.28, 0.29 minors had accumulated in the ~/.claude-agent-acp npm registry over the prior two weeks. The ChatGPT, Claude Code, Zed, and Continue teams that co-maintain ACP shipped on their own cadences; the downstream Mac app only has to catch up before the next user session. On 2026-04-18 at 09:33 Pacific, catching up was the smallest commit in the queue (one line in package.json), so it went first. Everything else that day followed from the lockfile cascade it caused.

How does this relate to the other 'last-day' open source AI releases (ComfyUI v0.19, Ollama v0.20.6, Transformers v5.5.4, llama.cpp b8779)?

Those are local-inference and generative-media releases. Fazm is a cloud-assistant Mac app; it does not run ComfyUI, Ollama, Transformers, or llama.cpp in-process. What it does is sit downstream of the Agent Client Protocol and the Anthropic Claude Agent SDK, both of which are open source and both of which released on 2026-04-18. The real 'last-day open source AI update' that mattered to a shipping Mac agent was the ACP bump, not the llama.cpp commit hash. This page documents that absorb in detail because no other page does.

Is @anthropic-ai/claude-agent-sdk actually open source?

Yes. The package is published to npm under the Apache-2.0 license, source is at github.com/anthropics/claude-agent-sdk-typescript, and the April 18 cascade moved it from 0.2.91 to 0.2.112 (21 patch releases absorbed in one lockfile write). @agentclientprotocol/claude-agent-acp and @agentclientprotocol/sdk are also Apache-2.0, published by Zed Industries, and track the Agent Client Protocol specification at github.com/zed-industries/agent-client-protocol. All three pre-bump and post-bump versions are pinned in acp-bridge/package.json and acp-bridge/package-lock.json in a public Fazm commit history, which is what makes this page auditable.

How can I reproduce the numbers on this page?

Clone github.com/mediar-ai/fazm. Run `git log --oneline --since='2026-04-18' --until='2026-04-19'` to see the seven commits. Run `git show 95287a32 -- acp-bridge/package-lock.json | head -60` to see the three transitive SDK bumps. Run `git show f0d49f0f -- acp-bridge/src/index.ts` to see the +10 line session/set_model block. Run `git show --stat 8b4ad3bf` to see the pinned-to-alias swap in Swift. Every string, every timestamp, and every line count on this page comes from those four git commands.

Why does Fazm pick the accessibility-API route rather than screenshot-plus-vision?

Two reasons, both orthogonal to this page's angle. First, the AX tree is structured text (role, label, position, value), which costs tens of tokens per screen instead of the thousands a screenshot OCR pipeline would burn. Second, the AX tree works in any native Mac app, not only inside the browser window. The April 18 ACP bump did not touch the accessibility layer at all; the absorb happened entirely inside acp-bridge, the Node subprocess that speaks JSON-RPC to the SDK. Fazm's perception layer and Fazm's model layer are independent on purpose.

fazm.AI Computer Agent for macOS
© 2026 fazm. All rights reserved.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.