This repository was archived by the owner on Jul 24, 2026. It is now read-only.
convoy: per-network ding-service selector (node st ding | rust ding) - #99
Merged
Conversation
Adds a `ding` field to <net>/convoy.toml letting a network choose its ding sidecar: "node" (smalltalk's `st ding`, the default — unset → node, so every existing user is unchanged) or "rust" (compoundingtech/ding — full st-ding parity, ~0% CPU). Both take IDENTICAL args, so the selector swaps ONLY the binary prefix; --identity/--root and the whole flag surface are untouched. - network-config.ts: DingService type + `ding` field, read/write + validation. - launch.ts: dingBin()/dingCommand(service) — writePtyToml reads the net's choice and bakes the right ding binary into each agent's pty.toml. The pre-#43 ding-heal path stays node-only (it only ever matches `st ding` tomls; a rust ding is new and already carries --root, so heal skips it). - convoy init --ding node|rust records the choice (mirrors --megarepo), also surfaced in the command table (completions + flag allow-list). Coordinated with ding-rust-claude: the rust `ding` is a confirmed drop-in (same positional session-id, same --identity/--root, zero new required config). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MCzqQKSpPiNX2ketyubByS
myobie
added a commit
that referenced
this pull request
Jul 21, 2026
…ml (#104) Adds an `env` field to <net>/convoy.toml: a string->string map merged into EVERY agent's derived pty.toml session env at render — BOTH the harness and the ding session — UNDER the derived wiring (ST_AGENT/ST_ROOT/PTY_ROOT always win, so a network key can't repoint the agent at another bus). A per-agent `env` still overrides a network default. Unset -> no network env. This is the fleet-wide runtime-knob seam: e.g. PTY_REAP_ON_EXIT=false to preserve finished sessions network-wide (the pty daemon reads it from its OWN env, so it must go on both sessions). Pairs with the ding selector (#99) so ONE re-render bakes both ding=rust and PTY_REAP_ON_EXIT=false. - network-config.ts: env field + isEnvMap validation (a non-string-map is dropped whole, never a half-valid launch env), read + write. - launch.ts: precedence networkEnv < spec.env < derived wiring, on both sessions. - +2 tests: round-trip/validation; both-sessions + derived-wins + per-agent-override. Claude-Session: https://claude.ai/code/session_01MCzqQKSpPiNX2ketyubByS Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a per-network ding-service selector so a convoy network chooses which ding sidecar runs — node (smalltalk's
st ding, the default) or rust (compoundingtech/ding: fullst dingparity, ~0% CPU).Unset →
node, so every existing user is unchanged. Our network (Mac + hetz) setsding = "rust".How
The rust
dingis a confirmed drop-in (coordinated with ding-rust-claude): same positional<session-id>, same--identity/--root, zero new required config. So the selector swaps only the binary prefix (st ding→ding); the args are byte-identical.network-config.ts—DingServicetype +dingfield onNetworkConfig, read/write + validation (a garbage value falls back to the node default).launch.ts—dingBin()/dingCommand(service);writePtyTomlreads the network's choice from<net>/convoy.tomland bakes the right ding binary into each agent'spty.toml. The pre-launch: bake --root <net> into the ding command line (durable ST_ROOT fix) [HOLD for smalltalk#85] #43 ding-heal path stays node-only (it only ever matchesst dingtomls; a rust ding is new and already carries--root, so heal skips it).convoy init --ding node|rustrecords the choice (mirrors--megarepo); surfaced in the command table (completions + flag allow-list).Verification
dingCommandservice param,writePtyTomlconvoy.toml → baked-binary).dingon hetz:usage: ding <pty-session> [--identity ID] [--root PATH]— accepts the exact generated invocation (--rooteven aliases--st-root,--identitydefaults to$ST_AGENT). Confirmed drop-in.convoy init --ding banana→invalid --ding "banana" (want: node | rust);convoy --helpshows the flag.Follow-ups (not in this PR)
ding = "rust"on our existing net'sconvoy.toml(ops).ding <session> --health-checksignal that catches wedged dings (live pid, stuck loop) thatkill -0can't see — a future upgrade todingHealthPlan, to pair with ding-rust-claude.🤖 Generated with Claude Code
https://claude.ai/code/session_01MCzqQKSpPiNX2ketyubByS