From adf0a9eda1608fba1b7d136f8166974b355eb778 Mon Sep 17 00:00:00 2001 From: Andre Merzky Date: Tue, 25 Aug 2026 01:51:27 +0200 Subject: [PATCH 1/2] A lane title links to whatever serves the lane Pool-backed lanes (`pool:` in the session's endpoints map) keep leading to the task dispatcher's Explorer page; an endpoint-backed lane now leads to that endpoint's own rhapsody page instead -- the dispatcher has nothing to say about a role that never touches a pool. An aliasing learning lane follows the inference lane's answer; with nothing known yet the dispatcher page stays the default. Dashboard v0.10.1. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016Npyz3Hbnwos12ESsdJ2YU --- src/digitaltwin/service/ui/dt_dash.js | 24 +++++++++++++++++++----- src/digitaltwin/service/ui/index.html | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/digitaltwin/service/ui/dt_dash.js b/src/digitaltwin/service/ui/dt_dash.js index 4dcebe1..7799a23 100644 --- a/src/digitaltwin/service/ui/dt_dash.js +++ b/src/digitaltwin/service/ui/dt_dash.js @@ -77,7 +77,7 @@ (() => { - const VERSION = '0.10.0'; + const VERSION = '0.10.1'; const SCHEMA = 'dt-dash-recording/1'; // ------------------------------------------------------------------------- @@ -2075,13 +2075,27 @@ ui) { panel(ctx, r, border, title, C.frame_label, S); - // the pool title is a link: pools are the task dispatcher's, so the - // title leads to its surface (REST for now; its Explorer page when - // one exists). `link:` hits navigate instead of toggling. + // The pool title is a link, and where it leads follows what serves + // the lane: a dispatcher-managed pool (`pool:` in the session's + // endpoints map) leads to the task dispatcher's Explorer page, a + // plain endpoint to that endpoint's own rhapsody page. An aliasing + // learning lane follows the inference lane's answer; with nothing + // known yet the dispatcher page is the default. `link:` hits + // navigate instead of toggling. if (ui) { + let eps = w.endpoints[lane] || []; + if (!eps.length && lane === 'learning' && w.endpoints.alias) { + eps = w.endpoints.inference || []; + } + const pooled = eps.some(n => String(n).startsWith('pool:')); + const plain = eps.filter(n => n && !String(n).startsWith('pool:')); + const target = (pooled || !plain.length) + ? '#plugin/broker/task_dispatcher' + : `#plugin/${plain[0]}/rhapsody`; + ctx.font = `600 ${Math.round(10 * S)}px ${FONT}`; const tw2 = ctx.measureText(title.toUpperCase()).width + 22 * S; - ui.hits.push({ key: 'link:#plugin/broker/task_dispatcher', + ui.hits.push({ key: 'link:' + target, x: r.x, y: r.y, w: Math.min(tw2, r.w * 0.5), h: Math.round(24 * S) }); } diff --git a/src/digitaltwin/service/ui/index.html b/src/digitaltwin/service/ui/index.html index bce8322..2d949fe 100644 --- a/src/digitaltwin/service/ui/index.html +++ b/src/digitaltwin/service/ui/index.html @@ -70,8 +70,8 @@ header draws -- if the two disagree, the page is stale. The plugin serves these by path and ignores the query, so the live host is unaffected. --> - - + + - + +