Skip to content

v0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 03 Mar 05:49
· 1 commit to main since this release
c76cdfe

Downloads

Desktop App

Platform Download Size
Windows (x64) CachiBot-Setup-0.3.0-win.exe 154.2 MB
macOS (Apple Silicon) CachiBot-0.3.0-mac.dmg 214.3 MB
Linux (x64 AppImage) CachiBot-0.3.0-linux.AppImage 206.9 MB
Linux (x64 .deb) CachiBot-0.3.0-linux.deb 164.6 MB
Linux (x64 .rpm) CachiBot-0.3.0-linux.rpm 173.6 MB

Mobile App

Platform Download Size
Android (APK) CachiBot-0.3.0.apk 79.8 MB

Downloads become available once the build pipeline completes (~10 min after release).

macOS users: This build is not yet notarized by Apple. After installing, open Terminal and run:

xattr -cr /Applications/CachiBot.app

Then open the app normally. This only needs to be done once.

Python Package (pip)

pip install cachibot==0.3.0

Changes

CachiBot grew a nervous system this week. Bots can now extend themselves with external plugins, render rich artifacts inline, enter workspace modes with task tracking, and spin up entire multi-bot projects from a single conversation. Underneath, the storage layer was refactored into a generic repository pattern and every route file got a spring cleaning with centralized guard helpers.

Highlights

  • External plugins can be installed from archives or auto-installed from the official registry at startup, each gated by bot capabilities and managed through a new Plugins view
  • Agents can now produce rich artifacts — code with syntax highlighting, live HTML previews, SVG, Mermaid diagrams, images, and downloadable documents — rendered in a resizable side panel
  • Workspace mode lets plugins define a focused context with custom system prompts, toolbars, and live task progress checklists streamed over WebSocket
  • A full project creation flow classifies user intent, generates a multi-bot proposal with editable personalities, and batch-creates bots and rooms in one shot
  • Per-message model selection via an inline ModelPill in the chat footer, with model white-labeling through public ID aliases
  • Browse Templates card added to the bot creation wizard, linking directly to the marketplace
Technical changes

Plugin system

  • ExternalPluginService (cachibot/services/external_plugins.py) scans ~/.cachibot/plugins/ for plugin.toml manifests, dynamically imports plugin modules, and injects them into CACHIBOT_PLUGINS and CAPABILITY_PLUGINS registries keyed by ext_<name>
  • WSL-aware directory resolution probes /mnt/c/Users/*/ and /mnt/d/Users/*/ to find the Windows user profile when running under WSL
  • install_plugin_from_archive() supports .zip and .tar.gz with filter="data" on tar extraction to block path-traversal attacks; validates manifest, checks Python imports, and rejects name collisions with built-in plugins
  • install_official_plugins() fetches a remote registry at startup, compares versions via .official marker files, and downloads newer defaults without overwriting user-modified directories
  • enforce_permissions() blocks declared allow_env_vars from containing system env vars (PATH, HOME, etc.)
  • Plugin API routes (cachibot/api/routes/external_plugins.py): list, enable/disable with lifecycle hooks, reload, install from upload, uninstall (blocked for official plugins), and serve static HTML for view-type plugins
  • Plugin base class gains on_install(), on_uninstall(), on_enable(bot_id), on_disable(bot_id) lifecycle hooks and a workspace_config property
  • Five example plugins added: hello_world, code_canvas, doc_writer, html_preview, website_builder
  • Full plugin documentation added under docs/plugins/ covering manifests, skills, artifacts, views, lifecycle, and examples

Plugin SDK

  • cachibot/plugins/sdk.py provides typed artifact constructors (code_artifact, html_artifact, markdown_artifact, svg_artifact, mermaid_artifact, image_artifact, document_artifact, react_artifact, custom_artifact) and artifact_update(), all returning dicts with __artifact__: True sentinels
  • emit_artifact() pushes artifacts immediately via ctx.on_artifact callback for streaming multiple artifacts from a single tool call
  • cachibot/plugins/sdk_types.py adds protocol classes (PluginProtocol, ExternalPluginProtocol, SkillResult) for IDE autocompletion without requiring inheritance

Artifact system

  • Artifact and ArtifactUpdate Pydantic models with ArtifactType enum: code, html, markdown, svg, mermaid, react, image, custom, document
  • WebSocket handler parses tool_result events for __artifact__, __artifact_update__, and __workspace_progress__ sentinels and routes them as typed WS messages instead of generic TOOL_END
  • Proactive artifact emission via _artifact_sender closure passed as on_artifact to the agent context
  • Frontend ArtifactPanel with type-specific renderers: CodeRenderer (syntax highlighting, inline edit), HtmlRenderer (sandboxed iframe with print/refresh), MermaidRenderer (lazy-loaded mermaid.js v11), SvgRenderer (sanitized inline SVG), ImageRenderer (fullscreen overlay), DocumentRenderer (PDF embed or download card for Office formats), CustomRenderer (plugin iframe with postMessage bridge), MarkdownRenderer
  • ArtifactCard inline cards in message bubbles link to the side panel
  • Zustand useArtifactsStore with persisted panel width ratio and transient active/open state; panel auto-closes on chat switch

Workspace mode

  • WorkspaceConfig model carries display_name, icon, description, system_prompt, default_artifact_type, toolbar, auto_open_panel, accent_color
  • WorkspaceProgressPlugin registers plan_tasks and update_task tools that return __workspace_progress__: True sentinel dicts
  • Agent factory injects workspace system prompts and external plugin prompts into the agent's enhanced system prompt
  • GET /api/bots/{bot_id}/workspaces endpoint discovers all workspace-capable plugins for a bot
  • Frontend WorkspaceSelector renders chip row in empty chats; TaskProgress renders inline checklist with status icons and progress bar
  • ChatView splits into a resizable two-pane layout when the artifact panel is open, with a draggable divider

Project creation

  • classify_purpose() uses LLM extraction to determine single vs project intent with confidence scoring
  • generate_project_proposal() produces structured ProposalBotSpec and ProposalRoomSpec entries with creative naming, personality traits, tone, expertise level, and system prompts
  • compose_system_prompt_with_personality() translates structured personality fields into natural-language "Communication Profile" directives
  • POST /creation/create-project batch-creates all bots and rooms with temp_id -> real_id mapping and bot-to-room assignment
  • Frontend wizard adds ClassificationStep (animated AI classification with override), ProjectDetailsStep (SSE-streamed questions with rotating loading messages), ProjectProposalStep (fully editable bot/room cards with icon picker, color swatches, model selector, personality chips), and ProjectConfirmStep (summary view)
  • CreationStore extended with ai-assisted-project flow, proposal mutation actions, and FlowKey-based step resolution

Model white-labeling

  • _resolve_public_id() queries model_toggles for public_id aliases, resolving user-facing names to real provider model paths
  • /api/models endpoint applies public ID remapping before returning grouped model lists; new /api/models/defaults endpoint returns all three default slots in one request
  • OpenAI-compatible /v1/chat/completions resolves aliases internally but returns the user-facing name in responses
  • Bot reply messages store the actual model used in metadata.model

Per-message model selection

  • ModelPill component in chat footer: compact pill with search dropdown, provider grouping, capability badges, context window sizes, and manual entry mode
  • Selected model flows through the WS sendMessage payload as model and models.default

Storage refactor

  • BaseRepository[ModelT, EntityT] generic abstract class (cachibot/storage/base.py) provides _session(), _fetch_one, _fetch_all, _scalar, _add, _update, _delete, get_by_id, delete_by_id
  • Applied across AssetRepository, MessageRepository, JobRepository, and others, eliminating async with db.ensure_initialized()() as session: boilerplate
  • Bot.default_model property unifies access to the effective model, replacing duplicated fallback logic

API route cleanup

  • require_found(value, label) generic 404 guard with TypeVar return-type preservation; require_room_ownership, require_member, require_role added
  • require_bot_ownership and require_room_ownership now return the record, enabling chaining
  • Mechanically applied across ~25 route files, replacing hundreds of inline if not x: raise HTTPException(...) blocks

Frontend cleanup

  • Removed syncPlatformChats polling and loadPlatformChatMessages; WS handler now calls addChat directly for incoming platform messages
  • useModelsStore.refresh() consolidated from three separate API calls to one getAllDefaults() request
  • Marketplace API client deduplicated via generic fetchRemoteList/fetchRemoteItem helpers
  • BotCapabilities type gains an index signature for dynamic ext_* capability keys
  • ToolIconRenderer gains optional toolId, name alias, style prop, and exported resolveIconName function

Marketplace telemetry

  • Fire-and-forget install and view tracking POSTs to the remote marketplace API with 5-second timeout

Dev tooling

  • dev.ps1 gains Stop-ProcessTree recursive function for clean Uvicorn worker shutdown on port cleanup

Details