Skip to content

🦋 New version release - #6

Merged
brentrager merged 1 commit into
mainfrom
changeset-release/main
Apr 17, 2026
Merged

🦋 New version release#6
brentrager merged 1 commit into
mainfrom
changeset-release/main

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

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

@smooai/smooth@0.4.0

Minor Changes

  • e7e533e: MCP servers, CLI-wrapper plugins, and project-scoped config.

    • th mcp add/list/remove/test/path for stdio MCP servers (Playwright,
      GitHub, filesystem, etc.). Servers register as <server>.<tool>.
    • th plugin init/list/path/remove for file-based CLI-wrapper tools at
      .smooth/plugins/<name>/plugin.toml. Plugins register as
      plugin.<name> and run the configured shell command with
      {{placeholder}} substitution.
    • Both MCP and plugins resolve from ~/.smooth/ (global) and
      <repo>/.smooth/ (project); project entries shadow global on
      name collision. --project flags on add / init / remove /
      path scope to the repo.
    • No trust gate on loading configs — Narc screens every tool call
      (CliGuard, injection, secrets, LLM judge) and the microVM contains
      the blast radius. See SECURITY.md and docs/extending.md.
  • 3657db9: Chat gets sessions. The smooth-web chat page now lists prior
    sessions in a sidebar, each persisting its own message history in
    the Dolt session_messages table. New /api/chat/sessions
    endpoints (create/list/get/delete + messages). The LLM receives the
    last 50 messages on every turn so multi-turn context is preserved.
    Session titles auto-rename to the first 60 chars of the opening
    prompt. Chat layout fixed so the input row sits flush to the
    viewport bottom (no stray scroll).

  • 3657db9: Retire SQLite. Pearls, sessions, memories, config, and worker metadata
    all live in the Dolt store at ~/.smooth/dolt/ (home) or
    <repo>/.smooth/dolt/ (per-project). smooth.db is gone; the
    dashboard reads "Dolt store (pearls + config)" instead of
    "Database (SQLite)". th pearls migrate-from-sqlite removed —
    transitional tool, no longer needed.

  • 3657db9: Run in sandbox — the agent does its work in a microVM, you review it live.

    • smooai/smooth-operator image (unified — agent installs toolchains at
      runtime via mise; covers node/python/rust/go/bun/deno/~140 more).
    • th run [pearl-id] [--keep-alive] [--image ...] [--memory-mb N] —
      dispatches via /api/tasks, streams SSE events, optionally keeps the
      VM alive for dev-server review.
    • th operators list / kill <id> — see and tear down running VMs.
    • th cache list / prune / path / clear — project-scoped sandbox
      cache at ~/.smooth/project-cache/<name>-<hash>/, bind-mounted
      at /opt/smooth/cache inside the VM. LRU prune by mtime.
    • Auto-forward common dev-server ports (3000, 3001, 4000, 4200, 5000,
      5173, 8000, 8080, 8888) on keep-alive runs; print reachable
      http://localhost:<host> URLs after the agent completes.
    • Per-run memory override threaded through
      TaskRequest → SandboxConfig.
  • 4f91014: th service — background service wrapper for th up.

    User-level install by default on all three platforms:

    • macOS: writes ~/Library/LaunchAgents/com.smooai.smooth.plist,
      drives launchctl bootstrap gui/$UID.
    • Linux: writes ~/.config/systemd/user/smooth.service, drives
      systemctl --user enable --now. Prints a hint to run
      loginctl enable-linger so the service survives logout.
    • Windows: creates a logon-triggered Scheduled Task via schtasks.

    Commands: install [--system], uninstall, start, stop, restart,
    status, logs [-f]. --system prints the system-level artifact +
    install instructions to stdout instead of running under sudo.

    Logs stream to ~/.smooth/service.log and ~/.smooth/service.err.

Patch Changes

  • 11f0c00: Fix 5 cast_integration tests that had been failing in CI since the
    Wonk bearer-token auth was added in f7676d8. The release workflow
    has been red for ~8 days, stranding 12 changesets and blocking every
    version bump.

    Root cause: ALLOW_EXAMPLE_POLICY has [auth] token = "test-token",
    so Wonk's require_operator_token middleware rejects any request
    without Authorization: Bearer test-token with a 401 (empty body).
    The tests built reqwest::Client::new() directly and called
    .post(...).json(...).send().await.unwrap().json().await.unwrap(),
    which panicked at the final .json() with
    reqwest::Error { kind: Decode, source: Error("EOF while parsing a value") }.

    Fix: introduce TEST_AUTH_TOKEN = "test-token" next to the policy
    fixture, attach .bearer_auth(TEST_AUTH_TOKEN) to every direct Wonk
    request, and switch spawn_goalie to WonkClient::with_auth so its
    /check/* calls carry the header too. The goalie_forwards_..._for_allowed_request
    test had surfaced as a 403 != 200 assertion for the same reason —
    Goalie was failing its auth to Wonk and correctly denying the request.

    Narc / Scribe / Archivist tests were never affected (those services
    do not require auth).

  • 3b1a88a: Diagnostic logging on the sandboxed dispatch path so we can tell
    why th run / th code --headless fail when they do:

    • bill::exec_sandbox logs exec start + non-zero-exit with
      captured stdout/stderr tails (was silent before, making code=-1
      failures opaque).
    • Dispatch handler now runs a preflight /bin/sh probe against
      the sandbox before exec-ing the runner — surfaces whether
      bind-mounts landed, whether the runner binary is visible + executable,
      and what the guest's /opt actually contains.

    Pearl th-1ec3ce (P0) tracks the underlying issue: on plain alpine,
    microsandbox's bind-mounts aren't reaching the guest at all, so
    every sandboxed dispatch fails with exit=-1 stderr="". Fix requires
    digging into microsandbox's mount-arg plumbing; these changes just
    give us the visibility to do it.

  • 72f7eef: Fix P0 (th-1ec3ce): sandbox bind-mounts not landing in the guest VM.

    The microsandbox guest agent does not mkdir -p mount targets before
    calling mount -t virtiofs — mounts to paths that don't pre-exist in
    the rootfs (/opt/smooth/bin, /opt/smooth/policy, /workspace)
    silently fail. We were falling back to plain alpine because our
    custom smooth-operator image was only in Docker Desktop's local
    store and microsandbox couldn't pull it; alpine has an empty /opt,
    so every mount missed.

    Fix: publish smooai/smooth-operator and smooai/boardroom images
    to GitHub Container Registry (public), and default to pulling from
    there. The Dockerfile.smooth-operator pre-creates /workspace,
    /opt/smooth/bin, and /opt/smooth/cache/mise — so every bind-mount
    target now exists before the guest agent tries to mount on top of it.

    • SandboxConfig default image: alpine → ghcr.io/smooai/smooth-operator:latest
    • th run default: smooai/smooth-operator:latest → ghcr.io/smooai/smooth-operator:latest
    • scripts/build-smooth-operator-image.sh + build-boardroom-image.sh:
      default SMOOTH_IMAGE_REPO to ghcr.io/smooai/..., add --push
      flag so one command builds + publishes.
    • Preflight probe now confirms mounts land: /opt/smooth/bin/smooth-operator-runner
      is executable inside the VM and the runner boots as expected.

    Users can override with SMOOTH_WORKER_IMAGE / SMOOTH_OPERATOR_IMAGE
    if they publish a fork to a different registry. Public pulls from
    ghcr.io/smooai/* require no auth.

  • 3657db9: Buildable OCI images for the microVM cast:

    • docker/Dockerfile.smooth-operator + scripts/build-smooth-operator-image.sh
      → smooai/smooth-operator:<version> (alpine + mise + runner).
    • docker/Dockerfile.boardroom + scripts/build-boardroom-image.sh
      → smooai/boardroom:<version> (alpine + boardroom bin + smooth-dolt).
    • Both scripts delegate to the existing cross-compile flow
      (build-operator-runner.sh / build-boardroom.sh).
    • Fixed a latent package-name bug in build-boardroom.sh
      (-p smooth-bigsmooth → smooai-smooth-bigsmooth).

    Still pending: registry publish on release so microsandbox can
    pull without Docker on end-user machines.

  • 3657db9: Pearl fixes:

    • /api/pearls + /api/projects/pearls default to unbounded
      (?limit=0). The dashboard was silently capped at 100 — a repo
      with 150+ pearls showed "100 closed, 0 open" when the open ones
      were past the limit. LLM tool callers still get a 100-row
      default via list_pearls().
    • PearlStore::close is now invoked on every error-path exit of
      the sandboxed dispatch handler (runner not found, workspace
      create failed, LLM provider missing, runner exited non-zero).
      Previously only exit-0 closed the pearl; leaked Task: ...
      pearls accumulated from E2E runs.
    • install:th now re-adhoc-signs a neighbor smooth-dolt binary
      in ~/.cargo/bin/ so scp'd copies work under launchd
      without a manual codesign.
  • 3657db9: th doctor --init-home-repo scaffolds ~/.smooth/ as a git repo for
    backup / cross-machine sync. Writes a .gitignore that excludes
    secrets (providers.json), service logs, audit logs, the Dolt
    store (has its own push/pull), the project cache, and ephemeral
    debug captures. Idempotent. Optional --remote <url> adds origin.

  • 3657db9: Wordmark + cast renames in user-facing surfaces:

    • th CLI + web dashboard now say "Big Smooth" (not "Leader") and
      "Smooth Operators" (not "Sandbox").
    • New horizontal logo (images/logo.png, crates/smooth-web/web/public/logo.svg)
      replaces the old mark.
    • th up / th status / th doctor banners render "Smooth" with
      the logo's gradient colors via ANSI 24-bit truecolor escapes
      ("Smoo" orange→pink, "th" teal→blue).
    • /health service field renamed smooth-leader → big-smooth.
    • SMOOTH_SANDBOX_MAX_CONCURRENCY env + th up --max-operators N
      flag expose the previously hardcoded pool cap of 3.
  • 3b1a88a: Wordmark gradient ("Smoo" orange→pink, "th" teal→blue) live in
    th up / th status / th doctor banners via a new
    gradient module in smooth-cli. Helper smooth() stitches the
    two halves into the full word; smoo_ai() covers the Smoo AI
    brand. Pure ANSI 24-bit truecolor, no new deps. 4 unit tests.

@brentrager
brentrager force-pushed the changeset-release/main branch from 555dacb to d79e0f9 Compare April 17, 2026 14:49
@brentrager
brentrager merged commit 532834e into main Apr 17, 2026
brentrager added a commit that referenced this pull request Jun 23, 2026
…red reads

Extends the macOS Seatbelt bash profile toward the plan's P1 security
acceptance criteria:
- P1 #5: kernel-deny writes to workspace/.git/config (not just .git/hooks).
  A writable git config can repoint core.hooksPath or install executing
  aliases that later run OUTSIDE the sandbox — same escape class as a
  planted hook.
- P1 #6: extend credential read-denial from ~/.ssh / ~/.aws / ~/.config/gh
  / ~/.gnupg to also cover ~/.config/gcloud, ~/.kube, ~/.docker, ~/.netrc.

Adds two adversarial tests (run + pass on macOS): a postinstall-style
attempt to plant .git/hooks/post-checkout and overwrite .git/config both
fail (files never exist), and cat-ing cloud/registry/netrc creds leaks no
secret material. 34 smooth-tools tests pass; clippy clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wBikCFJyoowRokiWK5rX1
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.

1 participant