In the gold rush of Artificial Intelligence, developers often obsess over model parameters, token limits, and inference speeds. But in the Apple ecosystem, a groundbreaking AI model is only as good as the interface that houses it. If your app delivers world-changing insights but hides them behind a keyboard or makes them invisible to VoiceOver users, it isn't a "smart" app—it’s a broken one. Build
The previous two posts covered how events flow from the SDK to the UI. This post focuses on visualizing one specific type of event: tool calls. Tool invocations are the most frequent operations in an Agent application. A typical task might call tools twenty or thirty times—reading files, writing files, executing commands, searching code. If every tool call renders as the same gray block, it's hard
Post 1 covered how AgentBridge converts the SDK's AsyncStream<SDKMessage> into [AgentEvent]. This post looks at what [AgentEvent] becomes — how TimelineView renders 18 event types, handles scroll behavior, and stays smooth when the event count gets large. TimelineView is the main body of the workspace, filling all the space between the sidebar and the input box. Its view hierarchy is shallow: Time
Post 0 painted the full picture: AsyncStream<SDKMessage> → AgentBridge → EventMapper → SwiftUI. This post breaks open the two middle layers: AgentBridge and EventMapper, to see how they transform the SDK's message stream into an event list that SwiftUI can consume directly. Let's start with the conclusion: AgentBridge is the single most complex file in the entire app. It does five things at once:
Across the previous seven articles plus a bonus chapter, we thoroughly explored the inner workings of Open Agent SDK — Agent Loop, the tool system, MCP integration, multi-Agent collaboration, conversation persistence, and multi-LLM support. The bonus chapter even embedded the SDK into a macOS native app, Motive, and ran it live. But Motive was just a backend-swap experiment. The real question is:
When you have 5 unrelated questions, should you pack them into one message to the LLM, or send 5 requests simultaneously? Which is faster? Splitting into multiple independent parallel requests is almost always faster. This isn't a gut feeling — it's determined by the underlying inference mechanism of LLMs. Let's walk through the reasoning from first principles. To understand this problem, you firs
Imagine an AI chatbot that forgets everything the moment you close the app. Every interaction starts from scratch, every preference is lost, and the "intelligence" feels fleeting. For modern AI applications, persistence isn't just a convenience—it’s a fundamental requirement. To build a truly robust AI agent, you need to provide it with a "long-term memory." SwiftData, Apple’s modern persistence f