v0.51.0
·
132 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Minor release: the product surface goes public. The Cloudflare event-server
Worker and the admin sidecar were previously reachable only through a grant on
the private deploy repo; both now ship in this repo, and the admin wire format
they speak is a documented, versioned contract rather than an internal
agreement between two halves of one team's infrastructure. Self-hosting the
durable event tier no longer requires anything private. This is Lane 1 of the
repo reorg (plans/2026-07-29-repo-reorg.md, Phases 1-5); the reference
container image and the ops-repo consolidation follow in later releases.
Added
- The Cloudflare Worker event server is public (#880).
event-server/worker/
is a third npm workspace package alongsidesrc/(local) andcore/. It is
the durable variant of the same protocol the Node servers speak - same webhook
verification, same bubble model, same topics - with per-deployment sessions in
Durable Objects and replay in KV, so registrations and cursors survive a
restart. It lands as its own workspace rather than more files under
event-server/src/because the two compile units are mutually exclusive: the
local unit is Node-only (lib es2024+@types/node), the Worker needs
Cloudflare's globals andworker-configuration.d.ts, and their vitest configs
are node-environment vs.defineWorkersConfig.wrangler.jsoncships with a
placeholder KV namespace id that fails loudly atwrangler deploy- a fresh
clone cannot silently deploy against someone else's namespace. Deployment
walkthrough indocs/SELF_HOSTED_EVENT_SERVER.md("Deploying the Worker").
Requires a Workers Paid plan, because the Durable Objects are SQLite-backed. bobi agent <name> supervise(#880). The admin sidecar, restored as a
first-class public CLI surface. It spawns and probes the manager, publishes
heartbeat and lifecycle telemetry, and listens on the admin topic so a wedged
manager can still be restarted from outside the box. Everything after--
forwards to the manager's start command
(bobi agent <name> supervise -- --foreground). This is what a container
entrypoint runs as PID 1, not an interactive command. The agent name is a CLI
positional; the privatebobi-supervisorshim that read it fromBOBI_ROOT
is gone.docs/ADMIN_PROTOCOL.md(#880). The admin channel as a documented,
versioned contract - topics, envelopes, command and telemetry schemas, and the
auth model. This, not the code move, is what an external consumer binds to.
bobi/supervisor/admin.pybinds the two sides byte-for-byte, so the server
half of a documented contract cannot stay private.
Changed
- Positioning: the Worker is a self-host option, not a paid tier (#880).
README.mdanddocs/SELF_HOSTED_EVENT_SERVER.mdnow present three
self-hosted shapes - tunnel, standalone Node, Worker - and tell you to pick on
durability rather than on price. The in-memory restart caveat carries an
explicit pointer to the durable answer. - Packaging: neither the wheel nor the sdist carries the Worker sources, and
now that is stated rather than incidental. The wheel's event-server inputs
are declared assrc/**/*.ts+core/src/**/*.ts(bobi/events/artifact.py),
which cannot matchworker/. The sdist takesevent-serveras a whole
directory, so the Worker workspace was in scope and fell out only by
accident: Hatch'ssafe_walkfollows the npm workspace symlink
node_modules/bobi-events-worker -> ../workerand then prunes the real
directory as an already-visited inode, which made the sdist's contents depend
on whethernpm cihad run (coreescaped only by sorting ahead of
node_modules).event-server/workeris now an explicit sdistexclude,
pinned bytests/test_sdist_contents.py. No published bytes change - this is
what the release workflow already emitted - but the result is now
deterministic. Nothing in the Python distribution builds or runs the Worker;
its deploy path is a git clone pluswrangler deploy. - The event-server npm tree audit is default-deny (#880). Only
extraneous:
is treated as non-fatal inbobi/events/server.py; everything else blocks.
npm 10.8.2 (bundled with Node 20) reports the Worker's optional dev deps as
extraneous from a lockfile npm 11 calls clean, and the audit must not be
loosened wholesale to absorb that.
Removed
- The repo-split bridges (#880). The npm publish path for
@moda-labs/bobi-events-core(core/scripts/{pack,smoke}.mjs) and the
worker-integration.ymlcross-repo CI existed only to carry code across the
private/public boundary. With the Worker home, they dissolve.
Fixed
validate_teamno longer invalidates its own hash (#873). Finalizing a
team could land in a state where install was permanently unreachable -
"the team source changed since validate_team last passed" - and re-running
validate_teamre-armed the same trap. When the setup'srun/directory sits
inside the source tree, savingrun/state/setup.jsonrewrites a file the
freshness hash just covered, so the frozen digest is stale the instant it is
recorded.source_tree_hashgains anexcludeset and both call sites pass
the setup state file. Two guards close the way in: create mode now applies the
same empty-target bar the registry branch enforced, and therun/containment
check rejects a location that enclosesrun/(the agents root) and not only
one nested inside it.- Plan-artifact CI reads heading-style phase markers (#885). The check
recognized list-style markers only, so a plan whose phases are headings passed
vacuously. - The unit-test matrix reports under a stable required check (#877). A
skipped matrix job never expands its matrix, so requiredUnit tests (3.12)
contexts never reported and the PR hung forever. A non-matrix gate job now
checks the matrix result explicitly. - A plan's review surface freezes at approval, not before (#878).