diff --git a/pyproject.toml b/pyproject.toml
index 9c7aeca..79e5602 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "ratatoskr"
-version = "0.17.12"
+version = "0.17.13"
description = "Worldtree Conversation API debug TUI — multi-pane observability dashboard"
readme = "README.md"
requires-python = ">=3.12"
diff --git a/src/ratatoskr/web/static/index.html b/src/ratatoskr/web/static/index.html
index 08eea23..c93850a 100644
--- a/src/ratatoskr/web/static/index.html
+++ b/src/ratatoskr/web/static/index.html
@@ -510,6 +510,14 @@ body {
+
+
+
+
@@ -734,19 +742,35 @@ async function startSession() {
try {
// end_user_id is server-configured (RATATOSKR_END_USER_ID) — not sent
// from the browser; the server ignores any end_user_id in this body.
+ // Issue #17: the browser selects only the PLANE; the consumer key + host
+ // are server-held (the key never reaches the browser).
+ const plane = $("bifrost-plane").value;
+ const reqBody = { agent_id: agentId };
+ if (plane) reqBody.bifrost_plane = plane;
const r = await fetch("/api/sessions", {
method: "POST", headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ agent_id: agentId }),
+ body: JSON.stringify(reqBody),
});
if (r.status !== 201) {
- $("setup-err").textContent = "create session failed: HTTP " + r.status;
+ let detail = "HTTP " + r.status;
+ try {
+ const err = await r.json();
+ if (err && err.error_code) {
+ detail = err.error_code + (err.bifrost_error ? " (" + err.bifrost_error + ")" : "");
+ }
+ } catch (_) { /* non-JSON body */ }
+ $("setup-err").textContent = "create session failed: " + detail;
$("start-btn").disabled = false;
return;
}
const info = await r.json();
state.sessionId = info.session_id;
+ // Issue #17 bound-state indicator: plane + endpoint (never the key).
+ const boundTag = info.bifrost
+ ? ` · ⇄ ${esc(info.bifrost.plane)} ${esc(info.bifrost.endpoint)}`
+ : "";
$("identity").innerHTML =
- `${esc(agentId)} · …${esc(info.session_id.slice(-8))}`;
+ `${esc(agentId)} · …${esc(info.session_id.slice(-8))}${boundTag}`;
setConn("idle", "connected");
$("setup").style.display = "none";
$("workspace").classList.add("live");
diff --git a/uv.lock b/uv.lock
index 907c63a..e41d344 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1052,7 +1052,7 @@ wheels = [
[[package]]
name = "ratatoskr"
-version = "0.17.12"
+version = "0.17.13"
source = { editable = "." }
dependencies = [
{ name = "httpx" },