{"slug": "bub-0-6-0", "title": "Bub 0.6.0", "summary": "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.", "body_md": "## Repository navigation\n\nBub 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).\n\n## Highlights\n\n### `pip install bub` installs only the agent kernel\n\n`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**:\n\n```\npip install \"bub[app]\"      # full Bub: CLI, gateway, channels, plugins\npip install bub             # kernel only, for embedding bub.core.Agent\n```\n\nIf 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]`.\n\n### An event-driven core `Agent`\n\n`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:\n\n- Republic built-in tools (`WebSearch` ,`WebFetch` ,`CodeExecution` ,`ImageGeneration` ,`NativeTool` ) alongside ordinary tools. The provider runs them server-side.\n- `max_tool_concurrency=` to limit how many tool calls from one response run at once.\n\nThe 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.\n\n### Reuse Bub plugins with any core `Agent`\n\n`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`:\n\n```\nplugins = AgentPlugins()                      # builtin + installed plugins\nagent = Agent(model=model, **plugins.components())\nplugins.attach(agent)\n```\n\n`BubAgent` uses the same adapter, so plugins behave the same in both.\n\n### Code mode as a reusable component\n\nCode 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.\n\n``` python\nfrom bub.core.codemode import CodeMode\n\ncode_mode = CodeMode([search, fetch], models=\"openai:gpt-5\")\nagent = Agent(model=model, tools=[code_mode.run_code], system_prompt=[\"You are ...\", code_mode.prompt])\n```\n\n### Models and accounts through Republic\n\nBuilt-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.\n\n- ChatGPT plan access: `codex:<model>` with`bub login codex` (supports`--device-auth` ).`openai:<model>` uses API credentials.\n- Named endpoints keep separate credentials. Provider-specific request fields go in `extra_body` .\n\n### CLI improvements\n\n- `bub` without a command starts`bub chat` .\n- `bub --version` /`-V` , and`bub plugins` shows each loaded plugin's distribution and version.\n- `,model` completion lists the models each configured provider offers.`,model <provider>:` narrows the list to one provider.\n- Token speed is measured from the first streamed chunk. Usage events now report `elapsed_seconds` ,`ttft_seconds` and`total_seconds` .\n- Bub reports its status to the terminal with OSC 7501. The sequences are not written when output is redirected.\n\n### Docker images on GHCR\n\nEach release publishes a multi-arch image: `ghcr.io/bubbuild/bub:0.6.0`, `:0.6` and `:latest`. See [Deploy the app](https://bub.build/docs/operate/deploy/).\n\n### New docs\n\nThe docs at [bub.build](https://bub.build) are reorganized into SDK (`bub.core`) and app (` bub[app]`) guides, in English and Chinese.\n\n## Fixes\n\n- Context size errors such as `exceed_context_size_error` now start the automatic handoff instead of failing the turn.\n- Models no longer call `tool_describe` again for deferred tools they have already loaded.`tool_describe` lists them under`already_loaded` .\n- The \"reply via channel\" instruction is added only to turns run by the channel manager, so `bub acp` and direct`process_inbound()` turns no longer look for a Telegram token.\n- A failed tool call is reported in `tool_results` as a`BubError` , so consumers such as the ACP server can mark it failed.\n- The `bub chat` prompt no longer redraws itself forever.\n- Fuzzy and non-ASCII tape search works again, and multi-byte UTF-8 characters split across shell output chunks are preserved.\n- Tool calls recorded in Chat Completions format by older tapes replay correctly.\n- Security updates for `aiohttp` ,`multidict` ,`urllib3` ,`certifi` and`uv` .\n\n## Upgrade notes\n\n- **Install the `app` extra** wherever you use the CLI, gateway, channels or plugins:`pip install \"bub[app]\"` /`uv add \"bub[app]\"` .`pip install -U bub` alone leaves the`bub` command without its dependencies.\n- **Module moves.**`bub.tape` ,`bub.tools` ,`bub.store` and`bub.sidecars` are now in`bub.core.*` . The old names still import as aliases, and so do`LlmCallRequest` /`LlmCallResult` /`LlmCallDecision` , so most 0.5.x plugins work unchanged. Code mode internals moved without aliases:`bub.builtin.codemode.code_runner` →`bub.core.codemode.runner` ,`bub.builtin.codemode.republic_bridge` →`bub.core.codemode.republic_bridge` ,`LocalEnvironment` /`LocalProcess` →`bub.environment` .\n- **Event renames:**`BeforeLlmCall` →`LLMCallStarted` ,`AfterLlmCall` →`LLMCallFinished` ,`BeforeToolCall` →`ToolCallStarted` ,`AfterToolCall` →`ToolCallFinished` ,`ChatCompleted` →`ChatFinished` . Hook names are unchanged.\n- **Tools.**`@tool` no longer registers tools globally, and`bub.core.tools.REGISTRY` is no longer filled. Plugins should provide tools with the new`provide_tools` hook. Tools that an entry-point plugin creates with`@tool` at import time are still collected, with a`DeprecationWarning` . To look up tools, use an agent's`tools` or`framework.get_tools()` .\n- **Agent overrides.**`Agent.pending_messages` ,`has_pending_messages` and`continue_prompt` are gone. Handle the`MessagesPending` event and set`StepFinished.next_prompt` instead.\n- **Failed tool results.** Failed entries in`ToolExecution.tool_results` and in`tool_results` event data are now`BubError` instances, not dicts. The tape still records them as dicts. Failed results are no longer spilled.\n- **Models.** For ChatGPT plan access, switch to`codex:<model>` and run`bub login codex` . Pass provider options through to Republic, and put provider-specific fields in`extra_body` .\n- **Smaller changes:**`.env` loading moved from`bub.framework` to`bub.configure` .`run_once` is an async generator. The kernel's`FileTapeStore` matches by substring; the builtin plugin still provides fuzzy search through`bub.builtin.store.FuzzyFileTapeStore` .\n\n## Since 0.6.0a3\n\nThe breaking changes in this list are `AgentPlugins` / `provide_tools` ([#371](https://github.com/bubbuild/bub/pull/371)) and `BubError` tool results ([#385](https://github.com/bubbuild/bub/pull/385)). The other changes are Republic-based models and `bub login codex` ([#349](https://github.com/bubbuild/bub/pull/349)), OSC 7501 status ([#345](https://github.com/bubbuild/bub/pull/345)), per-run prompt and tool preparation ([#376](https://github.com/bubbuild/bub/pull/376)), the new CLI options and `,model` completion ([#377](https://github.com/bubbuild/bub/pull/377), [#380](https://github.com/bubbuild/bub/pull/380), [#381](https://github.com/bubbuild/bub/pull/381), `bub` → `bub chat`), the token speed fix ([#386](https://github.com/bubbuild/bub/pull/386)), the channel prompt fix ([#384](https://github.com/bubbuild/bub/pull/384)), the deferred tools fix ([#387](https://github.com/bubbuild/bub/pull/387)), the context size fix ([#388](https://github.com/bubbuild/bub/pull/388)), security updates ([#374](https://github.com/bubbuild/bub/pull/374), [#378](https://github.com/bubbuild/bub/pull/378)) and the docs overhaul ([#375](https://github.com/bubbuild/bub/pull/375)).\n\n## Changes\n\n### 🚨 Breaking Changes\n\n- Extract an event-driven core agent into bub.core  -  by [@frostming](https://github.com/frostming) in[#356](https://github.com/bubbuild/bub/pull/356)[`(67407)`](https://github.com/bubbuild/bub/commit/67407e1)\n- Install only bub.core by default and streamline the agent kernel  -  by [@frostming](https://github.com/frostming) in[#361](https://github.com/bubbuild/bub/pull/361)[`(1a583)`](https://github.com/bubbuild/bub/commit/1a583b5)\n- Make code mode a reusable core component  -  by [@frostming](https://github.com/frostming) in[#367](https://github.com/bubbuild/bub/pull/367)[`(52d2f)`](https://github.com/bubbuild/bub/commit/52d2fea)\n- Reuse plugin agent-loop hooks with core Agent through events  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#371](https://github.com/bubbuild/bub/pull/371)[`(3a78b)`](https://github.com/bubbuild/bub/commit/3a78b91)\n\n### 🚀 Features\n\n- Expose republic models and media attachments in code mode  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#351](https://github.com/bubbuild/bub/pull/351)[`(a826e)`](https://github.com/bubbuild/bub/commit/a826ef2)\n- Accept republic built-in tools in core Agent  -  by [@frostming](https://github.com/frostming) in[#358](https://github.com/bubbuild/bub/pull/358)[`(56ae0)`](https://github.com/bubbuild/bub/commit/56ae04e)\n- Add max_tool_concurrency to core Agent  -  by [@frostming](https://github.com/frostming) in[#366](https://github.com/bubbuild/bub/pull/366)[`(8963b)`](https://github.com/bubbuild/bub/commit/8963b18)\n- Add OSC 7501 program status  -  by [@PsiACE](https://github.com/PsiACE) and[@frostming](https://github.com/frostming) in[#345](https://github.com/bubbuild/bub/pull/345)[`(9348e)`](https://github.com/bubbuild/bub/commit/9348edc)\n- Only record system prompt if it changes  -  by [@frostming](https://github.com/frostming)[`(7608e)`](https://github.com/bubbuild/bub/commit/7608e07)\n- Prepare the system prompt and tools once per run  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#376](https://github.com/bubbuild/bub/pull/376)[`(65876)`](https://github.com/bubbuild/bub/commit/6587606)\n- List provider models for ,model completion and model options  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#381](https://github.com/bubbuild/bub/pull/381)[`(15805)`](https://github.com/bubbuild/bub/commit/1580520)\n- **cli** :\n  - Add bub --version  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#377](https://github.com/bubbuild/bub/pull/377)[`(5abc2)`](https://github.com/bubbuild/bub/commit/5abc2a9)\n  - Add bub plugins to show plugin versions  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#380](https://github.com/bubbuild/bub/pull/380)[`(71d7d)`](https://github.com/bubbuild/bub/commit/71d7dbf)\n  - Set default command to 'chat' when no command is provided  -  by [@frostming](https://github.com/frostming)[`(c2049)`](https://github.com/bubbuild/bub/commit/c2049c1)\n- Add bub --version  -  by \n- **website** :\n\n### 🐞 Bug Fixes\n\n- Preserve UTF-8 across shell output chunks  -  by [@yunyv](https://github.com/yunyv) in[#360](https://github.com/bubbuild/bub/pull/360)[`(0bb39)`](https://github.com/bubbuild/bub/commit/0bb39f5)\n- Restore fuzzy and Unicode tape search  -  by [@yunyv](https://github.com/yunyv) in[#365](https://github.com/bubbuild/bub/pull/365)[`(db418)`](https://github.com/bubbuild/bub/commit/db41819)\n- Carry failed tool calls as BubError in tool_results  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#385](https://github.com/bubbuild/bub/pull/385)[`(e1fd3)`](https://github.com/bubbuild/bub/commit/e1fd38e)\n- Let the channel manager inject the reply-via-channel prompt  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#384](https://github.com/bubbuild/bub/pull/384)[`(fd877)`](https://github.com/bubbuild/bub/commit/fd877e9)\n- Stop the model from reloading deferred tools  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#387](https://github.com/bubbuild/bub/pull/387)[`(a3f62)`](https://github.com/bubbuild/bub/commit/a3f62c2)\n- Recognize context size errors for automatic handoff  -  by [@PsiACE](https://github.com/PsiACE) in[#388](https://github.com/bubbuild/bub/pull/388)[`(ad057)`](https://github.com/bubbuild/bub/commit/ad05783)\n- **ci** :\n- **cli** :\n  - Stop the chat prompt from redrawing itself forever  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#379](https://github.com/bubbuild/bub/pull/379)[`(e5df5)`](https://github.com/bubbuild/bub/commit/e5df525)\n  - Measure token speed from the first chunk and trim the toolbar  -  by [@frostming](https://github.com/frostming) in[#386](https://github.com/bubbuild/bub/pull/386)[`(c1494)`](https://github.com/bubbuild/bub/commit/c14941a)\n- Stop the chat prompt from redrawing itself forever  -  by \n- **deps** :\n  - Patch aiohttp, multidict and urllib3 security advisories  -  in [#374](https://github.com/bubbuild/bub/pull/374)[`(a93f5)`](https://github.com/bubbuild/bub/commit/a93f5b8)\n  - Patch certifi and uv security advisories  -  by [@frostming](https://github.com/frostming) and**Kimi** in[#378](https://github.com/bubbuild/bub/pull/378)[`(c1713)`](https://github.com/bubbuild/bub/commit/c1713b1)\n- Patch aiohttp, multidict and urllib3 security advisories  -  in", "url": "https://wpnews.pro/news/bub-0-6-0", "canonical_source": "https://github.com/bubbuild/bub/releases/tag/0.6.0", "published_at": "2026-10-31 19:47:43+00:00", "updated_at": "2026-10-31 19:51:06.058274+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "large-language-models"], "entities": ["Bub", "bub.core", "bub[app]", "Republic", "AgentPlugins", "CodeMode", "GHCR", "BubAgent"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/bub-0-6-0", "markdown": "https://wpnews.pro/news/bub-0-6-0.md", "text": "https://wpnews.pro/news/bub-0-6-0.txt", "jsonld": "https://wpnews.pro/news/bub-0-6-0.jsonld"}}