Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: boxlite-ai/boxlite
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.5.9
Choose a base ref
...
head repository: boxlite-ai/boxlite
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v0.5.10
Choose a head ref
  • 12 commits
  • 46 files changed
  • 9 contributors

Commits on Feb 4, 2026

  1. feat(sdk): add orchestration API for multi-box messaging (#206)

    * feat(sdk): add Ray-style orchestration API for multi-box messaging
    
    Add BoxRuntime orchestration API with:
    - Ray-style decorator API (@box.task, @box.on_message, @box.on_event)
    - Cloudpickle serialization for closures (auto-installed via pip)
    - Auto-detected Python version for image selection
    - Point-to-point messaging and pub/sub events between boxes
    - Minimal implementation (~400 lines total)
    
    Also includes:
    - Guest boot logging improvements (info level default)
    - RUST_BACKTRACE forwarding to guest
    - Two comprehensive examples (ai_pipeline, multi_agent)
    
    * style: format Python and Rust code
    DorianZheng authored Feb 4, 2026
    Configuration menu
    Copy the full SHA
    7e7c943 View commit details
    Browse the repository at this point in the history

Commits on Feb 6, 2026

  1. fix(images): handle tar extraction edge cases and PAX long paths (#199)

    Fixes multiple OCI layer tar extraction issues:
    
    Path handling:
    - Use entry.path() instead of entry.header().path() to support PAX extensions
    - Properly handle filenames >100 bytes (tar header limit)
    - PAX/GNU longname extensions now correctly applied to restore full paths
    - Fixes file truncation during extraction (e.g., discord-api-types package)
    
    Hardlinks:
    - Deferred hardlink mechanism for targets appearing later in tar
    - Fixes pnpm compatibility where hardlinks precede target files
    
    Directory handling:
    - File-to-directory replacements when creating parent dirs
    - Missing directories removed by whiteout processing
    
    Refactoring:
    - Introduces EntryMetadata with ownership/timestamps composition
    - Reduces apply_ownership parameters from 9 to 3
    - Adds builder pattern to avoid clippy warnings
    - Improves memory efficiency (DirMeta only stores needed fields)
    
    Test coverage:
    - Comprehensive tests for deferred hardlinks
    - Parent directory replacement scenarios
    - pnpm structure validation
    
    Signed-off-by: Wenyu Huang <[email protected]>
    uran0sH authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    edfb9ca View commit details
    Browse the repository at this point in the history
  2. feat(examples): add interactive Claude Code box example (#209)

    * feat(examples): add interactive Claude Code box example
    
    Provide a persistent interactive terminal example for installing Claude Code and document it in the examples README.
    
    Co-authored-by: Cursor <[email protected]>
    
    * Apply suggestion from @Copilot
    
    Co-authored-by: Copilot <[email protected]>
    
    * Apply suggestion from @Copilot
    
    Co-authored-by: Copilot <[email protected]>
    
    * Apply suggestion from @Copilot
    
    Co-authored-by: Copilot <[email protected]>
    
    * Apply suggestion from @Copilot
    
    Co-authored-by: Copilot <[email protected]>
    
    ---------
    
    Co-authored-by: Cursor <[email protected]>
    Co-authored-by: dorianzheng <[email protected]>
    Co-authored-by: Copilot <[email protected]>
    4 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    86cc923 View commit details
    Browse the repository at this point in the history
  3. feat(cli): add shell completion for bash, zsh, and fish (#208)

    * feat(cli): add shell completion for bash, zsh, and fish
    
    - Add hidden subcommand `boxlite completion <bash|zsh|fish>` using clap_complete
    - Add completion tests (exit success, non-empty output, subcommands present, invalid shell fails)
    
    Co-authored-by: Cursor <[email protected]>
    
    * fix(cli): satisfy clippy in completion tests (collapsible_if, trim_split_whitespace)
    
    Co-authored-by: Cursor <[email protected]>
    
    * style(cli): format completion test to satisfy cargo fmt
    
    Co-authored-by: Cursor <[email protected]>
    
    ---------
    
    Co-authored-by: shayne-snap <[email protected]>
    Co-authored-by: Cursor <[email protected]>
    3 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    8338ea6 View commit details
    Browse the repository at this point in the history
  4. docs(cli): add CLI README, development guide, and CONTRIBUTING link (#…

    …211)
    
    - boxlite-cli/README.md: user-facing CLI docs (commands, flags, troubleshooting)
    - docs/development/cli.md: contributor guide (make cli, make test:cli, test layout)
    - CONTRIBUTING.md: add boxlite-cli to project structure, link to CLI dev guide
    
    Co-authored-by: shayne-snap <[email protected]>
    Co-authored-by: Cursor <[email protected]>
    3 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    55acf3d View commit details
    Browse the repository at this point in the history
  5. feat(cli): add -p/--publish and -v/--volume to create and run (#207)

    * feat(cli): add -p/--publish and -v/--volume to create and run
    
    - Port publish (-p, --publish): spec [hostPort:]boxPort[/tcp|udp], applied to create and run
    - Volume (-v, --volume): bind mount (hostPath:boxPath[:ro]) and anonymous (boxPath), with Windows path handling (e.g. C:\data:/app/data)
    - create: to_box_options now takes GlobalFlags, returns Result; apply publish and volume
    - run: add PublishFlags and VolumeFlags to RunArgs, apply in BoxRunner with home for anonymous volumes
    - Tests: publish/volume success and invalid format for create and run; run volume tests for bind, :ro, and anonymous
    
    Co-authored-by: Cursor <[email protected]>
    
    * fix(cli): resolve clippy doc_lazy_continuation and collapsible_if
    
    Co-authored-by: Cursor <[email protected]>
    
    ---------
    
    Co-authored-by: shayne-snap <[email protected]>
    Co-authored-by: Cursor <[email protected]>
    3 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    0dd8f0d View commit details
    Browse the repository at this point in the history
  6. feat(cli): add inspect command (#197)

    * feat(cli): add inspect command for box details
    
    - Add `boxlite inspect [OPTIONS] BOX [BOX...]` with --latest support
    - Output formats: json, yaml, or Go template (e.g. {{.State}}, {{.Id}})
    - PascalCase output (Id, Name, Image, State, Cpus, Memory) aligned with Docker/Podman
    - Template aliases: .ID -> .Id, .ImageID -> .Image
    - Reject table format; use formatter + BoxInfo/BoxStateInfo from boxlite
    - Tests: no args, nonexistent, by name/id, multiple boxes, --latest, formats, table rejected
    
    Co-authored-by: Cursor <[email protected]>
    
    * inspect: parse template once, serialize once per box; align format with Docker/Podman
    
    - Formatter: GtmplWithJson parse-once render-many; add json template
      function and format_go_style_value for object output. Remove
      format_gtmpl_with_json; tests use GtmplWithJson::parse().render().
    - Inspect: parse template once before loop, serialize each presenter
      to JSON once and reuse for path lookup and gtmpl context. Use
      value_from_serde_json and GtmplWithJson; drop presenter_to_gtmpl_value.
    - looks_like_template: require both {{ and }}.
    - Add gtmpl_value dep; add inspect tests for template formats.
    
    Co-authored-by: Cursor <[email protected]>
    
    * style: apply rustfmt to inspect and formatter
    
    Co-authored-by: Cursor <[email protected]>
    
    * fix(clippy): remove redundant use tempfile in inspect tests
    
    Co-authored-by: Cursor <[email protected]>
    
    * refactor(core): use From<&BoxInfo> for BoxStateInfo
    
    - Replace BoxStateInfo::from_box_info with impl From<&BoxInfo>
    - Update inspect command to use BoxStateInfo::from(info)
    
    Co-authored-by: Cursor <[email protected]>
    
    ---------
    
    Co-authored-by: shayne-snap <[email protected]>
    Co-authored-by: Cursor <[email protected]>
    3 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    6e601a2 View commit details
    Browse the repository at this point in the history
  7. feat(examples): add OpenClaw (ClawdBot/Moltbot) example (#212)

    * feat(examples): add OpenClaw (ClawdBot/Moltbot) example
    
    Add clawboxlite.py demonstrating how to run OpenClaw AI agent
    gateway in a BoxLite container with:
    - Port forwarding and volume mounting
    - Gateway configuration with LAN binding
    - Claude API authentication setup
    - Service readiness polling
    
    * docs(examples): add clawboxlite.py to README
    
    Document the OpenClaw example with usage instructions.
    DorianZheng authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    57d72f5 View commit details
    Browse the repository at this point in the history
  8. fix(examples): address review feedback on interactive Claude example (#…

    …210)
    
    Rename file to remove "ubuntu" misnomer, remove unused BoxOptions,
    consolidate imports, and improve documentation.
    
    Co-authored-by: Yingjun Wu <[email protected]>
    Co-authored-by: Claude Opus 4.6 <[email protected]>
    3 people authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    d8cceff View commit details
    Browse the repository at this point in the history
  9. chore: bump SDK versions (#213)

    - Workspace/Rust/C/Python: 0.5.9 → 0.5.10
    - Node.js: 0.2.6 → 0.2.7
    DorianZheng authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    006bbf2 View commit details
    Browse the repository at this point in the history
  10. fix(error): prevent cleanup error from masking original error (#214)

    When box initialization fails (e.g., image pull failure), the cleanup
    guard removes the box from DB. If stop() is then called (e.g., from a
    finally block), it would try to save to a non-existent box, returning
    NotFound which masked the original error.
    
    Changes:
    - box_impl.rs: Handle NotFound gracefully in stop() - if box was already
      removed by cleanup, return Ok(()) instead of propagating the error
    - Remove redundant "Box not found:" prefix from NotFound error messages
      since #[error("box not found: {0}")] already adds this prefix
    
    Before: "box not found: Box not found: abc123"
    After:  "box not found: abc123"
    
    And most importantly, users now see the actual error:
    "storage error: Failed to pull image 'xxx' after trying 1 registry"
    instead of the misleading "box not found" error.
    DorianZheng authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    b422926 View commit details
    Browse the repository at this point in the history
  11. fix(python): make cloudpickle an optional dependency (#215)

    - Move cloudpickle from required to optional-dependencies[orchestration]
    - Add lint check in lint.yml to enforce no required dependencies
    - Update build-wheels.yml comment explaining --no-index as lint
    - Bump Node SDK version to 0.2.7
    
    The BoxRuntime orchestration feature requires cloudpickle for
    serializing Python closures into VMs. Most users don't need this,
    so it's now opt-in via: pip install boxlite[orchestration]
    
    Fixes wheel build failure where --no-index couldn't resolve cloudpickle.
    DorianZheng authored Feb 6, 2026
    Configuration menu
    Copy the full SHA
    348eef1 View commit details
    Browse the repository at this point in the history
Loading