Skip to content

Conversation

@github-actions
Copy link
Contributor

@github-actions github-actions bot commented Dec 31, 2025

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@opencode-vibe/core@0.3.0

Minor Changes

  • 963a6e9 Thanks @joelhooks! - feat(api): add API proxy route for CORS-free mobile access

    Implements ADR-013 Phase 1: API Proxy Route

    • Add /api/opencode/[port]/[[...path]] catch-all proxy route
    • Proxy all HTTP methods (GET, POST, PUT, DELETE, PATCH, OPTIONS)
    • Preserve headers (x-opencode-directory, content-type)
    • Stream request bodies with duplex: "half"
    • Port validation (1024-65535 range)
    • Error handling (400 for validation, 503 for connection failures)
    • Update client URLs to use /api/opencode/${port} instead of http://127.0.0.1:${port}

    This eliminates CORS issues when accessing OpenCode from mobile Safari via Tailscale.

  • fd68a7d Thanks @joelhooks! - feat: architecture investigation and multi-directory support

        ╔═══════════════════════════════════════════════════════════╗
        ║   🏗️ ARCHITECTURE DEEP DIVE COMPLETE 🏗️                   ║
        ╠═══════════════════════════════════════════════════════════╣
        ║                                                           ║
        ║   ┌─────────────────────────────────────────────────┐     ║
        ║   │  ADR-015: Event Architecture Simplification     │     ║
        ║   │  • Router: 4,377 LOC confirmed DEAD             │     ║
        ║   │  • Factory: 1,160 LOC verified                  │     ║
        ║   │  • 8 core gaps identified                       │     ║
        ║   │  • 31% reduction potential (4,971 LOC)          │     ║
        ║   └─────────────────────────────────────────────────┘     ║
        ║                                                           ║
        ║   ┌─────────────────────────────────────────────────┐     ║
        ║   │  ADR-016: Core Layer Responsibility             │     ║
        ║   │  • Model B: Smart Boundary (RECOMMENDED)        │     ║
        ║   │  • Core = Computed APIs + Effect services       │     ║
        ║   │  • React = UI binding only                      │     ║
        ║   │  • Router = DEPRECATED                          │     ║
        ║   └─────────────────────────────────────────────────┘     ║
        ║                                                           ║
        ╚═══════════════════════════════════════════════════════════╝
    

    "The purpose of abstraction is not to be vague, but to create
    a new semantic level in which one can be absolutely precise."
    — Dijkstra

    Core Layer

    • Enhanced SSE with heartbeat support (mobile Safari 30s timeout fix)
    • Improved connection state management with reconnection logic
    • Added events.ts for SSE event type definitions
    • Directory-scoped client creation

    React Layer

    • New multi-directory hooks: useMultiDirectorySessions, useMultiDirectoryStatus
    • New SSE state hook: useSSEState
    • Bootstrap utilities with retry logic
    • Status derivation utilities (3-source session status)
    • Improved factory hook composition
    • Batch update support in store

    Documentation

    • ADR-015: Event Architecture Simplification (verified via 5-worker swarm)
    • ADR-016: Core Layer Responsibility Model
    • 8 investigation documents
    • 3 audit documents
  • 8321b6f Thanks @joelhooks! - feat: ADR-016 Core Layer Responsibility Model - Smart Boundaries

        ╔══════════════════════════════════════════════════════════════╗
        ║                                                              ║
        ║   ┌─────────────────────────────────────────────────────┐    ║
        ║   │  BEFORE: React does everything                      │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  REACT (bloated 840 LOC business logic)       │  │    ║
        ║   │  │  • Status computation                         │  │    ║
        ║   │  │  • Data joining                               │  │    ║
        ║   │  │  • Token formatting                           │  │    ║
        ║   │  │  • SSE normalization                          │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   │                      ▼                              │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  CORE (thin wrapper + 4,377 LOC dead router)  │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   └─────────────────────────────────────────────────────┘    ║
        ║                                                              ║
        ║                          ⬇️  ⬇️  ⬇️                           ║
        ║                                                              ║
        ║   ┌─────────────────────────────────────────────────────┐    ║
        ║   │  AFTER: Smart Boundaries                            │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  REACT (lean - UI binding only)               │  │    ║
        ║   │  │  • Hooks call Core APIs                       │  │    ║
        ║   │  │  • Never imports Effect                       │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   │                      ▼                              │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  CORE (smart boundary)                        │  │    ║
        ║   │  │  • StatusService     • ContextService         │  │    ║
        ║   │  │  • MessageService    • Format utils           │  │    ║
        ║   │  │  • SSE normalization • Promise APIs           │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   └─────────────────────────────────────────────────────┘    ║
        ║                                                              ║
        ║   📉 -4,377 LOC (dead router deleted)                        ║
        ║   📉 -840 LOC moved from React to Core                       ║
        ║   ✅ Effect isolated - React never imports Effect            ║
        ║   ✅ Reusable - CLI/TUI can use Core APIs                    ║
        ║                                                              ║
        ╚══════════════════════════════════════════════════════════════╝
    

    "These responsibilities should tell a story of the high-level purpose
    and design of your system. Refactor the model so that the responsibilities
    of each domain object fit neatly within stated responsibility."
    — Eric Evans, Domain-Driven Design

    What Changed

    Core Layer (@opencode-vibe/core)

    New Effect Services:

    • StatusService - Session status computation (3-source logic)
    • MessageService - Messages + Parts join (eliminates client-side joins)
    • ContextService - Token usage computation

    New APIs:

    • sessions.getStatus() - Computed session status
    • sessions.listWithStatus() - Sessions with status pre-joined
    • messages.listWithParts() - Messages with parts pre-joined
    • prompt.convertToApiParts() - Prompt transformation

    New Utils:

    • formatRelativeTime() - "5m ago" formatting (SSR-safe)
    • formatTokens() - "1.5K" token formatting
    • normalizeStatus() - SSE status normalization

    Deleted:

    • packages/core/src/router/ - 4,377 LOC of dead code (0 invocations)

    React Layer (@opencode-vibe/react)

    Simplified Hooks:

    • useSessionStatus - Now uses Core's StatusService
    • useMessagesWithParts - Reads from SSE-populated store
    • useContextUsage - Reads from SSE-populated store
    • useSendMessage - Uses Core's prompt.convertToApiParts

    Effect Isolation:

    • React NEVER imports Effect types
    • All Effect programs wrapped with runWithRuntime()
    • Promise-based APIs at the boundary

    Migration

    No breaking changes. Existing code continues to work.

    Internal refactor moves computation from React to Core for:

    • Better reusability (CLI, TUI, mobile can use Core)
    • Better testability (pure Effect programs)
    • Better performance (pre-computed data)
  • 5e5e4e6 Thanks @joelhooks! - feat(world): unify world stream to atoms-only path

        ╔═══════════════════════════════════════════════════════╗
        ║           🐝 ATOMS ARE THE WAY 🐝                     ║
        ╠═══════════════════════════════════════════════════════╣
        ║                                                       ║
        ║   ┌─────────────┐                                     ║
        ║   │ SSE Events  │──┐                                  ║
        ║   └─────────────┘  │                                  ║
        ║                    ▼                                  ║
        ║   ┌─────────────────────────────────┐                 ║
        ║   │      createWorldStream()        │                 ║
        ║   │  ┌───────────────────────────┐  │                 ║
        ║   │  │      WorldStore           │  │                 ║
        ║   │  │  ┌─────┐ ┌─────┐ ┌─────┐  │  │                 ║
        ║   │  │  │sess │ │msgs │ │parts│  │  │                 ║
        ║   │  │  │Atom │ │Atom │ │Atom │  │  │                 ║
        ║   │  │  └─────┘ └─────┘ └─────┘  │  │                 ║
        ║   │  └───────────────────────────┘  │                 ║
        ║   └─────────────────────────────────┘                 ║
        ║                    │                                  ║
        ║                    ▼                                  ║
        ║   ┌─────────────────────────────────┐                 ║
        ║   │  { subscribe, getSnapshot }     │                 ║
        ║   └─────────────────────────────────┘                 ║
        ║                                                       ║
        ╚═══════════════════════════════════════════════════════╝
    

    "Simplicity is prerequisite for reliability."
    — Edsger W. Dijkstra

    Changes:

    • Remove --use-atoms flags from CLI (atoms are THE path now)
    • Delete redundant consumer.ts (stream.ts already has SSE-wired createWorldStream)
    • Delete WorldStateAggregator class (394 → 196 lines, 50% reduction)
    • CLI uses createWorldStream from core directly
    • Single unified path: SSE → WorldStore (atoms) → subscribe/getSnapshot

    CLI now works:

    $ swarm-cli status
    🌍 WORLD STATE 🌍
    Sessions: 89     Active: 0      Streaming: 0
    

Patch Changes

  • e9da5e5 Thanks @joelhooks! - fix: real-time UI updates for sessions and Task cards

        ╔═════════════════════════════════════════════════════════════╗
        ║   ⚡ REAL-TIME REFRESH RESURRECTION ⚡                       ║
        ╠═════════════════════════════════════════════════════════════╣
        ║                                                             ║
        ║   BEFORE:           AFTER:                                  ║
        ║   ┌─────────┐       ┌─────────┐                             ║
        ║   │ Session │       │ Session │ ← Status updates            ║
        ║   │ ??? lag │   →   │ ✓ LIVE  │   instantly visible!        ║
        ║   └─────────┘       └─────────┘                             ║
        ║                                                             ║
        ║   ┌─────────┐       ┌─────────┐                             ║
        ║   │  Task   │       │  Task   │ ← Metadata.summary          ║
        ║   │ frozen  │   →   │ flowing │   updates flow through      ║
        ║   └─────────┘       └─────────┘                             ║
        ║                                                             ║
        ║   Bug 1: Session status stale on projects-list              ║
        ║   Fix: Bootstrap now fetches SDK status immediately         ║
        ║                                                             ║
        ║   Bug 2: Task cards not updating during sub-agent work      ║
        ║   Fix: Memo now checks _opencode metadata on messages       ║
        ║        + Fixed pending→running state transition logic       ║
        ║                                                             ║
        ╚═════════════════════════════════════════════════════════════╝
    

    "Premature optimization is the root of all evil, but we should
    not pass up opportunities to make things work correctly."
    — Paraphrasing Knuth on debugging

    Fixes

    Session Status Lag (projects-list.tsx)

    • Bootstrap now properly fetches SDK status on initialization
    • Live sessions from SSE events now merge correctly with server-rendered sessions
    • Deduplication uses Map to prefer live data over stale initial data

    Task Card Real-Time Updates (tool.tsx)

    • Fixed React.memo comparison for Task tool parts
    • Now correctly handles pending→running state transitions
    • Compares _opencode metadata when present on messages
    • Sub-agent activity summaries now update in real-time

    MessageRenderer Memo (session-messages.tsx)

    • Added _opencode metadata to comparison logic
    • Tool invocations and results now trigger proper re-renders
    • Prevents stale UI during AI streaming
  • 7b21536 Thanks @joelhooks! - fix: session-based routing for multi-TUI setups

    When multiple TUI sessions run for the same directory (each spawning its own server), API requests were being routed to the wrong server. The atoms were calling createClient(directory) without the sessionId, causing directory-based routing to pick the first discovered port instead of the server that owns the session.

    Fixed by passing sessionId to createClient() in:

    • SessionAtom.get(), SessionAtom.promptAsync(), SessionAtom.command()
    • MessageAtom.list()
    • PartAtom.list()

    This enables session-based routing which tracks which server sent events for which session, ensuring requests go to the correct server.

@opencode-vibe/react@0.4.0

Minor Changes

  • 5131e7f Thanks @joelhooks! - feat(react): implement SSR plugin for provider-free hooks (ADR-013 Phase 2)

        🦋 THE GREAT PROVIDER PURGE 🦋
    
            ⋆ ˚。⋆୨♡୧⋆ ˚。⋆
        ,.  _~-.,               .
       ~'`~ \/,_. ~=.,,,.,,,   /|,
            /   '-._  /'   '\\=~
           |  \     \|        |
            \  '=.,_/         |
             '-.,_   '~-.,_  /
                  '~.,_    '~
    
        BEFORE:                    AFTER:
        ┌──────────────────┐      ┌──────────────────┐
        │ <Provider>       │      │ <SSRPlugin />    │
        │   <Provider>     │  →   │ {children}       │
        │     <Provider>   │      └──────────────────┘
        │       {children} │
        │     </Provider>  │      Zero ceremony.
        │   </Provider>    │      Zero wrappers.
        │ </Provider>      │      Just works.
        └──────────────────┘
    

    "Simplicity is prerequisite for reliability."
    — Dijkstra

    Implements uploadthing-inspired factory + SSR plugin pattern:

    • <OpencodeSSRPlugin> injects config via useServerInsertedHTML
    • generateOpencodeHelpers() creates hooks that read from globalThis
    • Zero hydration delay, zero provider wrappers, works in RSC
  • fd68a7d Thanks @joelhooks! - feat: architecture investigation and multi-directory support

        ╔═══════════════════════════════════════════════════════════╗
        ║   🏗️ ARCHITECTURE DEEP DIVE COMPLETE 🏗️                   ║
        ╠═══════════════════════════════════════════════════════════╣
        ║                                                           ║
        ║   ┌─────────────────────────────────────────────────┐     ║
        ║   │  ADR-015: Event Architecture Simplification     │     ║
        ║   │  • Router: 4,377 LOC confirmed DEAD             │     ║
        ║   │  • Factory: 1,160 LOC verified                  │     ║
        ║   │  • 8 core gaps identified                       │     ║
        ║   │  • 31% reduction potential (4,971 LOC)          │     ║
        ║   └─────────────────────────────────────────────────┘     ║
        ║                                                           ║
        ║   ┌─────────────────────────────────────────────────┐     ║
        ║   │  ADR-016: Core Layer Responsibility             │     ║
        ║   │  • Model B: Smart Boundary (RECOMMENDED)        │     ║
        ║   │  • Core = Computed APIs + Effect services       │     ║
        ║   │  • React = UI binding only                      │     ║
        ║   │  • Router = DEPRECATED                          │     ║
        ║   └─────────────────────────────────────────────────┘     ║
        ║                                                           ║
        ╚═══════════════════════════════════════════════════════════╝
    

    "The purpose of abstraction is not to be vague, but to create
    a new semantic level in which one can be absolutely precise."
    — Dijkstra

    Core Layer

    • Enhanced SSE with heartbeat support (mobile Safari 30s timeout fix)
    • Improved connection state management with reconnection logic
    • Added events.ts for SSE event type definitions
    • Directory-scoped client creation

    React Layer

    • New multi-directory hooks: useMultiDirectorySessions, useMultiDirectoryStatus
    • New SSE state hook: useSSEState
    • Bootstrap utilities with retry logic
    • Status derivation utilities (3-source session status)
    • Improved factory hook composition
    • Batch update support in store

    Documentation

    • ADR-015: Event Architecture Simplification (verified via 5-worker swarm)
    • ADR-016: Core Layer Responsibility Model
    • 8 investigation documents
    • 3 audit documents
  • 8321b6f Thanks @joelhooks! - feat: ADR-016 Core Layer Responsibility Model - Smart Boundaries

        ╔══════════════════════════════════════════════════════════════╗
        ║                                                              ║
        ║   ┌─────────────────────────────────────────────────────┐    ║
        ║   │  BEFORE: React does everything                      │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  REACT (bloated 840 LOC business logic)       │  │    ║
        ║   │  │  • Status computation                         │  │    ║
        ║   │  │  • Data joining                               │  │    ║
        ║   │  │  • Token formatting                           │  │    ║
        ║   │  │  • SSE normalization                          │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   │                      ▼                              │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  CORE (thin wrapper + 4,377 LOC dead router)  │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   └─────────────────────────────────────────────────────┘    ║
        ║                                                              ║
        ║                          ⬇️  ⬇️  ⬇️                           ║
        ║                                                              ║
        ║   ┌─────────────────────────────────────────────────────┐    ║
        ║   │  AFTER: Smart Boundaries                            │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  REACT (lean - UI binding only)               │  │    ║
        ║   │  │  • Hooks call Core APIs                       │  │    ║
        ║   │  │  • Never imports Effect                       │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   │                      ▼                              │    ║
        ║   │  ┌───────────────────────────────────────────────┐  │    ║
        ║   │  │  CORE (smart boundary)                        │  │    ║
        ║   │  │  • StatusService     • ContextService         │  │    ║
        ║   │  │  • MessageService    • Format utils           │  │    ║
        ║   │  │  • SSE normalization • Promise APIs           │  │    ║
        ║   │  └───────────────────────────────────────────────┘  │    ║
        ║   └─────────────────────────────────────────────────────┘    ║
        ║                                                              ║
        ║   📉 -4,377 LOC (dead router deleted)                        ║
        ║   📉 -840 LOC moved from React to Core                       ║
        ║   ✅ Effect isolated - React never imports Effect            ║
        ║   ✅ Reusable - CLI/TUI can use Core APIs                    ║
        ║                                                              ║
        ╚══════════════════════════════════════════════════════════════╝
    

    "These responsibilities should tell a story of the high-level purpose
    and design of your system. Refactor the model so that the responsibilities
    of each domain object fit neatly within stated responsibility."
    — Eric Evans, Domain-Driven Design

    What Changed

    Core Layer (@opencode-vibe/core)

    New Effect Services:

    • StatusService - Session status computation (3-source logic)
    • MessageService - Messages + Parts join (eliminates client-side joins)
    • ContextService - Token usage computation

    New APIs:

    • sessions.getStatus() - Computed session status
    • sessions.listWithStatus() - Sessions with status pre-joined
    • messages.listWithParts() - Messages with parts pre-joined
    • prompt.convertToApiParts() - Prompt transformation

    New Utils:

    • formatRelativeTime() - "5m ago" formatting (SSR-safe)
    • formatTokens() - "1.5K" token formatting
    • normalizeStatus() - SSE status normalization

    Deleted:

    • packages/core/src/router/ - 4,377 LOC of dead code (0 invocations)

    React Layer (@opencode-vibe/react)

    Simplified Hooks:

    • useSessionStatus - Now uses Core's StatusService
    • useMessagesWithParts - Reads from SSE-populated store
    • useContextUsage - Reads from SSE-populated store
    • useSendMessage - Uses Core's prompt.convertToApiParts

    Effect Isolation:

    • React NEVER imports Effect types
    • All Effect programs wrapped with runWithRuntime()
    • Promise-based APIs at the boundary

    Migration

    No breaking changes. Existing code continues to work.

    Internal refactor moves computation from React to Core for:

    • Better reusability (CLI, TUI, mobile can use Core)
    • Better testability (pure Effect programs)
    • Better performance (pre-computed data)
  • 8605599 Thanks @joelhooks! - feat(react): expand factory pattern with 6 new hooks

        ╔═══════════════════════════════════════════════════════════╗
        ║                                                           ║
        ║   🏭 THE HOOK FACTORY 🏭                                  ║
        ║                                                           ║
        ║      ┌─────────────────────────────────────────┐          ║
        ║      │  generateOpencodeHelpers()              │          ║
        ║      │  ═══════════════════════════════════    │          ║
        ║      │                                         │          ║
        ║      │  📦 INPUT: globalThis.__OPENCODE        │          ║
        ║      │                                         │          ║
        ║      │  🎣 OUTPUT:                             │          ║
        ║      │    ├── useSession                       │          ║
        ║      │    ├── useMessages                      │          ║
        ║      │    ├── useSendMessage                   │          ║
        ║      │    ├── useSessionList      ✨ NEW       │          ║
        ║      │    ├── useProviders        ✨ NEW       │          ║
        ║      │    ├── useProjects         ✨ NEW       │          ║
        ║      │    ├── useCommands         ✨ NEW       │          ║
        ║      │    ├── useCreateSession    ✨ NEW       │          ║
        ║      │    └── useFileSearch       ✨ NEW       │          ║
        ║      │                                         │          ║
        ║      └─────────────────────────────────────────┘          ║
        ║                                                           ║
        ║   "The purpose of abstraction is not to be vague,         ║
        ║    but to create a new semantic level in which            ║
        ║    one can be absolutely precise."                        ║
        ║                        — Dijkstra                         ║
        ║                                                           ║
        ╚═══════════════════════════════════════════════════════════╝
    

    ADR-013 Phase 3: Factory Hooks Expansion

    Expands the factory pattern from Phase 2 to include all OpenCode hooks.
    Components now import from @/app/hooks instead of @opencode-vibe/react.

    New Hooks in Factory

    • useSessionList - Zustand store selector, filters archived sessions
    • useProviders - API fetch with loading/error/refetch pattern
    • useProjects - API fetch with loading/error/refetch pattern
    • useCommands - Wraps base hook with directory config
    • useCreateSession - Async session creation
    • useFileSearch - Debounced search with fuzzysort

    Migration Pattern

    // Before
    import { useProviders, useCommands } from "@opencode-vibe/react";
    
    // After
    import { useProviders, useCommands } from "@/app/hooks";

    Files Changed

    • packages/react/src/factory.ts - Added 6 new hooks (9 total)
    • packages/react/src/factory-types.ts - Type utilities for router mapping
    • packages/react/src/factory.test.ts - 22 tests for all hooks
    • apps/web/src/app/hooks.ts - Exports all 9 factory hooks
    • 4 components migrated to @/app/hooks

Patch Changes

  • e9da5e5 Thanks @joelhooks! - fix: real-time UI updates for sessions and Task cards

        ╔═════════════════════════════════════════════════════════════╗
        ║   ⚡ REAL-TIME REFRESH RESURRECTION ⚡                       ║
        ╠═════════════════════════════════════════════════════════════╣
        ║                                                             ║
        ║   BEFORE:           AFTER:                                  ║
        ║   ┌─────────┐       ┌─────────┐                             ║
        ║   │ Session │       │ Session │ ← Status updates            ║
        ║   │ ??? lag │   →   │ ✓ LIVE  │   instantly visible!        ║
        ║   └─────────┘       └─────────┘                             ║
        ║                                                             ║
        ║   ┌─────────┐       ┌─────────┐                             ║
        ║   │  Task   │       │  Task   │ ← Metadata.summary          ║
        ║   │ frozen  │   →   │ flowing │   updates flow through      ║
        ║   └─────────┘       └─────────┘                             ║
        ║                                                             ║
        ║   Bug 1: Session status stale on projects-list              ║
        ║   Fix: Bootstrap now fetches SDK status immediately         ║
        ║                                                             ║
        ║   Bug 2: Task cards not updating during sub-agent work      ║
        ║   Fix: Memo now checks _opencode metadata on messages       ║
        ║        + Fixed pending→running state transition logic       ║
        ║                                                             ║
        ╚═════════════════════════════════════════════════════════════╝
    

    "Premature optimization is the root of all evil, but we should
    not pass up opportunities to make things work correctly."
    — Paraphrasing Knuth on debugging

    Fixes

    Session Status Lag (projects-list.tsx)

    • Bootstrap now properly fetches SDK status on initialization
    • Live sessions from SSE events now merge correctly with server-rendered sessions
    • Deduplication uses Map to prefer live data over stale initial data

    Task Card Real-Time Updates (tool.tsx)

    • Fixed React.memo comparison for Task tool parts
    • Now correctly handles pending→running state transitions
    • Compares _opencode metadata when present on messages
    • Sub-agent activity summaries now update in real-time

    MessageRenderer Memo (session-messages.tsx)

    • Added _opencode metadata to comparison logic
    • Tool invocations and results now trigger proper re-renders
    • Prevents stale UI during AI streaming
  • Updated dependencies [963a6e9, fd68a7d, 8321b6f, e9da5e5, 7b21536, 5e5e4e6]:

    • @opencode-vibe/core@0.3.0

@opencode-vibe/swarm-cli@0.2.0

Minor Changes

  • 5e5e4e6 Thanks @joelhooks! - feat(world): unify world stream to atoms-only path

        ╔═══════════════════════════════════════════════════════╗
        ║           🐝 ATOMS ARE THE WAY 🐝                     ║
        ╠═══════════════════════════════════════════════════════╣
        ║                                                       ║
        ║   ┌─────────────┐                                     ║
        ║   │ SSE Events  │──┐                                  ║
        ║   └─────────────┘  │                                  ║
        ║                    ▼                                  ║
        ║   ┌─────────────────────────────────┐                 ║
        ║   │      createWorldStream()        │                 ║
        ║   │  ┌───────────────────────────┐  │                 ║
        ║   │  │      WorldStore           │  │                 ║
        ║   │  │  ┌─────┐ ┌─────┐ ┌─────┐  │  │                 ║
        ║   │  │  │sess │ │msgs │ │parts│  │  │                 ║
        ║   │  │  │Atom │ │Atom │ │Atom │  │  │                 ║
        ║   │  │  └─────┘ └─────┘ └─────┘  │  │                 ║
        ║   │  └───────────────────────────┘  │                 ║
        ║   └─────────────────────────────────┘                 ║
        ║                    │                                  ║
        ║                    ▼                                  ║
        ║   ┌─────────────────────────────────┐                 ║
        ║   │  { subscribe, getSnapshot }     │                 ║
        ║   └─────────────────────────────────┘                 ║
        ║                                                       ║
        ╚═══════════════════════════════════════════════════════╝
    

    "Simplicity is prerequisite for reliability."
    — Edsger W. Dijkstra

    Changes:

    • Remove --use-atoms flags from CLI (atoms are THE path now)
    • Delete redundant consumer.ts (stream.ts already has SSE-wired createWorldStream)
    • Delete WorldStateAggregator class (394 → 196 lines, 50% reduction)
    • CLI uses createWorldStream from core directly
    • Single unified path: SSE → WorldStore (atoms) → subscribe/getSnapshot

    CLI now works:

    $ swarm-cli status
    🌍 WORLD STATE 🌍
    Sessions: 89     Active: 0      Streaming: 0
    

Patch Changes

@coderabbitai
Copy link

coderabbitai bot commented Dec 31, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot changed the title release: fix session-based routing for multi-TUI setups release: fix session-based routing for multi-tui setups Dec 31, 2025
@github-actions github-actions bot force-pushed the changeset-release/main branch from 37b941f to d0147d2 Compare December 31, 2025 04:15
@github-actions github-actions bot changed the title release: fix session-based routing for multi-tui setups release: fix session-based routing for multi-TUI setups Dec 31, 2025
@github-actions github-actions bot force-pushed the changeset-release/main branch from d0147d2 to 38a52ef Compare December 31, 2025 04:30
@github-actions github-actions bot changed the title release: fix session-based routing for multi-TUI setups release: add api proxy and ssr plugin with core refactoring Jan 2, 2026
@github-actions github-actions bot force-pushed the changeset-release/main branch from 38a52ef to 5505749 Compare January 2, 2026 00:29
@joelhooks joelhooks merged commit 9b734f4 into main Jan 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants