Bub 0.6.0 Bub 0.6.0, the first stable release of the project's 0.6 line, splits the framework into an embeddable agent kernel, bub.core, and the full application, bub[app], so that `pip install bub` now installs only the kernel with four dependencies: republic, pydantic, loguru and typing-extensions. The release moves built-in model access to Republic for provider authentication, message encoding and streaming, and turns the agent loop into events on an EventBus (RunStarted/RunFinished, LLMCallStarted/LLMCallFinished, ToolCallStarted/ToolCallFinished, StepFinished, MessagesPending, ChatFinished) shared by plugins and SDK users. It also exposes code mode as bub.core.codemode, adds an AgentPlugins adapter for reusing Bub plugins with any core Agent, and publishes multi-arch Docker images at ghcr.io/bubbuild/bub:0.6.0, :0.6 and :latest. Repository navigation Bub 0.6.0 is the first stable release of the 0.6 line. It splits Bub into an embeddable agent kernel, bub.core , and the full app, bub app . It also moves model access to Republic and turns the agent loop into events that plugins and SDK users share. This note covers everything since 0.5.1 . If you tested the 0.6.0 alphas, the changes after 0.6.0a3 are listed in Since 0.6.0a3 since-060a3 . Highlights pip install bub installs only the agent kernel bub.core installs and imports without the rest of Bub. Its only dependencies are republic , pydantic , loguru and typing-extensions . The CLI, gateway, channels, plugin system and TUI prompts are in the app extra : pip install "bub app " full Bub: CLI, gateway, channels, plugins pip install bub kernel only, for embedding bub.core.Agent If you run bub without the extra, it lists the missing packages and tells you how to install them. The Docker image, install.sh / install.ps1 and bub install already install bub app . An event-driven core Agent bub.core.Agent runs the agent loop over a tape store and reports every step on an EventBus : RunStarted / RunFinished , LLMCallStarted / LLMCallFinished , ToolCallStarted / ToolCallFinished , StepFinished , MessagesPending , ChatFinished . It also accepts: - Republic built-in tools WebSearch , WebFetch , CodeExecution , ImageGeneration , NativeTool alongside ordinary tools. The provider runs them server-side. - max tool concurrency= to limit how many tool calls from one response run at once. The system prompt and tools are now prepared once per run, so the request prefix stays stable across the steps of a turn and prompt caching works better. The system prompt is recorded on the tape only when it changes. Reuse Bub plugins with any core Agent bub.hooks.agent.AgentPlugins connects plugin agent-loop hooks before/after llm call , before/after tool call , continue prompt , provide steering inbox , system prompt , tape store/context/sidecar, load state , provide environment , and the new provide tools to any bub.core.Agent : plugins = AgentPlugins builtin + installed plugins agent = Agent model=model, plugins.components plugins.attach agent BubAgent uses the same adapter, so plugins behave the same in both. Code mode as a reusable component Code mode lives in bub.core.codemode . Any core agent can use it without the app extra. Code can call Republic models and pass media attachments. python from bub.core.codemode import CodeMode code mode = CodeMode search, fetch , models="openai:gpt-5" agent = Agent model=model, tools= code mode.run code , system prompt= "You are ...", code mode.prompt Models and accounts through Republic Built-in model requests use Republic https://pypi.org/project/republic/ for provider authentication, message encoding and streaming. Reasoning and provider data survive tape reload and replay. - ChatGPT plan access: codex: