Repository navigation
0.1.5-rc4 (harness 0.1.5-rc.2)
Pre-release
Pre-release
Targets harness 0.1.5-rc.2 — every harness peer is pinned to exactly that release.
What changed since 0.1.5-rc3
- The loop engine is a per-session choice. One router factory owns the process's single agent-factory slot and dispatches each session to the engine its agent preset names: the built-in
in-processloop, or one ofclaude-code,codex,pi,kimi. Sessions on different engines run concurrently — one chat can be on Codex while another is on Kimi. - Any open, idle session can move to another engine. Between two hosted engines the move is an in-place handover: the same
Sessionobject, its store entry and its write handle pass to the successor, so the session never leaves the registry and the page never disconnects. A move involvingin-processcannot be handed over in place (the harness loop neither yields a live session nor adopts one it did not create): the host releases that session's agent and the page reloads, after asking first. Thedsh webprocess is never restarted. A move is refused while a turn is running, and subagent sessions cannot move. - One shared model route. Every hosted engine logs the same provider label,
external, which advertises exactly one entry,default. The model menu no longer shows one identical group per engine (the browser catalog is built without a session and shared across the whole host generation, so it cannot be filtered per session). - The model selection is handed to the engine — endpoint and credential included. A session that selects a real dsh model has that model's endpoint, protocol and credential resolved from dsh's own configuration (provider directory → settings namespace → the credentials service; never
process.env) and passed through the engine's own surface: Claude Code'sANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN, Kimi'sKIMI_MODEL_*environment, a plugin-owned Pi agent directory plus--provider/--api-key, and Codex's-c model_providers…plus its credential environment. Whether an engine can speak a given protocol is the engine's business — a refusal is reported, not swallowed.default, no selection, or an unresolvable endpoint injects nothing. - A session's model seat now follows its engine, written where the host reads it, and picking the deployment default is contained:
session.selectModelalso saves the pick as the deployment default, which the router now rewrites for sessions built on the harness loop. The Codex driver's parsed-but-unusedconfig.envis consumed as of this release. - Both READMEs were slimmed (English 471 → 75 lines) with their runnable procedure moved into
docs/source-checkout.md.
Known open items
docs/optimization-backlog.md carries them, numbered for incremental work. The four P0 items all need a real machine: Codex's -c parsing and wire_api compatibility, Kimi's environment-defined model appearing in session/new's configOptions, Claude Code's acceptance of the endpoint's request path, and Pi's tolerance of a minimal models.json.
Install
dsh plugin --profile web add dsh-loop-engineSee the README for requirements, usage, and the known limitations, and docs/ for the details.