mAIndmeld 0.5.0: the runner
Added
- Tokens may carry an expiry and a room scope; the server mints one per
harness launch, refuses it outside its room, revokes it when the launch
or the room ends, and sweeps expired records (#29, first step of #36). - Harness launches (#30):
POST /api/rooms/:code/launchesand
room_invite kind: "harness"ask a runner to start a harness into a
room; runners subscribe toGET /api/runner/events, claim launches for
a room-scoped token, and report how they ended; the room narrates
requested, started, joined, exited, failed, timed out, cancelled; the
scheduler times out launches that never join and cancels them when the
room closes;GET /api/runnersand the health endpoint list runners. - The runner (#31):
maindmeld runner --config runner.jsonsubscribes to
a server, claims launches for the harnesses it lists, fills a prompt
template, starts the command with a room-scoped token in its
environment, caps its log locally, kills it on cancel or timeout, and
reaps leftovers on restart. Commands come only from the runner's file. - Harness templates (#32):
templates/harness/holds MCP configurations,
a prompt template, andrunner.jsonentries for Claude Code, OpenCode,
Gemini CLI, Codex, Hermes, and Pi, with a table of which are verified;
Claude Code is, from a real launch. Placeholders{prompt}and
{templates}; anullin a harness'senvremoves a variable. - Room page (#33): an Invite box lists the harnesses online runners offer
and launches one; launch states show under the participants and update
live. - Runner packaging (#34):
Dockerfile.runnerbuildsmaindmeld-runner
with Claude Code and OpenCode preinstalled, published by CI beside the
server image;compose.yamlgains arunnerprofile; the Kubernetes
base deploys a runner with its own ConfigMap and Secret. Unprivileged,
no Docker socket; the socket is an opt-in for the runner only. - Docs (#35): the runner in DESIGN.md (scope, section 7.4, decision 16),
OPERATOR.md (setup, config, lifecycle, troubleshooting), README, and
the Kubernetes README.
Fixed
- A model participant that gets a 413, or a 400 naming a length or token
limit, now halves its transcript window and retries at once instead of
counting a failure toward a ten-minute pause; the window creeps back by
one message per reply. Profiles takemax_prompt_chars; health shows the
effective window; single messages over 4,000 characters are clipped in
the model's view (#28).
Images:
ghcr.io/dev-dull/maindmeld:0.5.0@sha256:74c6dcc85f2340f887fe4de0dcae94bd80e01a502a7d29b87ca0a909cd8b148fghcr.io/dev-dull/maindmeld-runner:0.5.0@sha256:f5eb60fe8380843e23132a11f65ffd375c958690bf941ba7af810206f260ffa6