Repository navigation
feat(dsh): present the LoopX personal workspace as a DSH sidebar panel - #8352
Conversation
ef9a568 to
7638bba
Compare
CI triage after rebaseRebased onto
What this change does pass: The new head re-runs CI; I will rebase again once the main-side repairs land. Happy to help with either pre-existing failure separately if useful. |
7638bba to
151d5e9
Compare
Consolidated CI triage (all four red checks are repo-wide, not this diff)Rebased head:
Checks that pass for this change include: No code fix for those four belongs in this PR; I will rebase again as main-side repairs land and once the remaining shards finish. |
Register one global sidebar entry and its matching central panel in the web Client. The panel embeds the personal workspace served by `loopx dashboard` on its default loopback address, states the recovery command and offers Retry when that service is absent, and never starts, reads or duplicates LoopX state. Add the dashboard locale namespace, unit coverage for the embedded panel and its fallback/retry states, and extend the client artifact smoke to assert both new slot registrations and the loopback address. Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
151d5e9 to
cd4a1bf
Compare
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | reasoning_effort=max
未发现由本 PR 引入的阻断性代码问题。完整 quality 检查仍有一项既有失败,详见下文。
动机 / Motivation
DSH 用户在处理多个 Goal 时,需要从会话进入已有的 LoopX 个人工作区查看完整工作。 旧入口只能显示紧凑 GoalBar,查看完整工作区还要离开 DSH;本次增加一个 LoopX 侧栏入口,在中央区域呈现已有工作区,服务不可达时给出恢复命令和重试。 验证确认新入口和中央面板使用同一个标识,服务恢复后可重试进入,禁用 Client 会清除注册、样式和 iframe。 范围是导航和呈现,不启动服务,不增加模型工具、绑定或控制面状态。 非默认端口、DSH 0.2.2 兼容资格和真实用户长期采用仍不在本次已验证范围内。
改动思路 / Approach
侧栏条目和中央 main slot 都使用 loopx-dashboard,由 DSH 原有布局选择面板;面板只嵌入 loopx dashboard 已有页面。LoopX 保留状态与操作权限,DSH 保留 Session 和执行权。没有加入代理服务、第二套配置或自动启动命令。相比仅增加外部链接,嵌入方式能保持会话所在的工作环境;相比自动启动服务,这个边界可独立撤销,也没有增加初始化权限。
服务探测是有界的呈现状态,失败进入恢复提示;Retry 同时重新探测和重挂 iframe。插件开关仍由宿主所有,页面可达不等于 Driver 激活。保留一个全局导航条目和一个已有 UI 的承载面板,机制与当前问题相称。当前 PR 边界是可发现的导航、不可达恢复及禁用清理;不扩展控制面或宿主兼容声明。
具体改动 / Changes
当前准确 head:cd4a1bf1832374135d9ac11f4d94568d2a92c84b;实际 PR base:c63a8f9cfc023ff22f39db5cb8b734da7653e83d。完整 12 文件 +446/-16:生产 UI +211,依赖清单和锁文件 +8,测试及 smoke +184/-11,文档 +43/-5。原先审阅的 151d5e97e66895d63b58cb7ed0222207a2bb4a2d 随后被重基;已比较完整范围,12 个 PR 文件逐字一致,新增的 10 个主干文件没有改动 Client、SDK、Driver 或传输契约。
关键代码讲解
src/client/index.tsx:38的apply注册 dashboard locale,再注入 sidebar 和 keyed main。SDK 的MainPanel按 active panel key 选择条目,侧栏按注册 id/order 构造列表。原 GoalBar 的 id、顺序、locale 和 exact-Session 注入保持。src/client/dashboard.tsx:61的LoopXDashboardPanel使用AbortController与 2.5 秒超时,只派生probing/ready/unavailable。iframe 始终指向 loopback;失败显示命令及 Retry,重试递增 attempt,清理时取消旧探测。src/client/locale.ts:86的 dashboard 字典沿用 zh/en locale owner;新增 SDK 引用均为 type-only。打包产物没有新增外部运行时 require,也没有增加模型工具或 Host 服务。
规范依据:docs/integrations/deepseek-harness-control-plane-adapter.md,不可变版本 c63a8f9cfc023ff22f39db5cb8b734da7653e83d。逐项判断:Authority Boundary — implemented,原有执行/状态 owner 不变;GoalBar — implemented,原 dock 配置与 Session 语义对照保持;Failure And Privacy Boundaries — implemented,固定 loopback、无新增 RPC/状态通道;Validation And Removal — implemented,原生隔离 profile 安装、移除及 runtime smoke 通过。侧栏本身是本 PR 提出的呈现增量,不把旧三表面描述当作禁止扩展的规则。
对主干的风险 / Risks
PASS:三项 TypeScript 检查、build、artifact、peer-range。当前 head 的标准 premerge 执行 4 个直接检查、19 个选择检查;package 和 runtime 两阶段通过,包含真实隔离 DSH profile 的安装/移除、Client 物化、slot 共存及 live-disable。完整单测为 232 PASS / 1 FAIL。
FAIL 保留:tests/admission-closeout.integration.spec.ts 的 invalid_schema: LoopX returned an incompatible response schema。同一独立命令在不可变当前 base 与当前 head 都失败,完整失败段、fixture 和依赖环境匹配;出错路径是未改动的 Driver admission/CLI 解码,在新增 UI 执行前失败。主干协议兼容问题仍须由其 owner 修复,没有将它标成通过。当前面板的注册、失败恢复和清理另有通过的产物、浏览器及 runtime 证据。
基线/候选 Client factory 对照确认原 GoalBar 配置相同、注册时没有 RPC,禁用后两侧均清空注册与 locale。Ego 实际渲染打包 factory 的独立样例,检查 1440×900、1100×760、长标题与下部内容,并完成断连→提示→恢复服务→Retry→禁用的读回。该样例使用合成 slot/iframe 和 URL 替换,不能证明真实后端数据新鲜度。原生完整 profile/runtime 验证与视觉样例分别记录。
我的整体评价 / Verdict
原有 slot、locale 和 workspace UI 已拥有导航及状态;保留一个全局入口和一个承载面板,没有新增控制面。 当前 PR 边界:导航、不可达恢复及禁用清理;不扩展控制面或宿主兼容声明。
判断为 justified_increment:导航与恢复提供了实用、可单独验证和撤销的增量。long_horizon preserved:没有新增续跑或持久化 owner;user_experience improved:减少切出 DSH 的导航,并保留明确的失败恢复。固定地址限制已披露;安装或可达性不激活 Driver,也不改变绑定和报告等可选功能的权限。
已目视检查打包 Client 的外层面板:桌面完整页面、窄视口内的长标题和展开样例、不可达提示及重试恢复;面板本身没有新增折叠层。 视觉证据使用合成 iframe 内容和 slot 宿主,仅替换测试用 loopback URL;未独立操作安装态 DSH 的真实窗口。原截图来源为 151d5e9,12 个 PR 文件及依赖配置在 cd4a1bf 逐字一致。
代码量与问题相称,复用了原有 slot、locale、iframe UI 和卸载生命周期,无需另造状态服务。局部可用性 union 和 panel id 属于插件 UI 词汇,不是新的共享控制面状态。既有 quality 失败及未验证的宿主版本保留为独立限制;本结论不授予合并权限。
English verdict: APPROVE: scoped sidebar navigation and recovery are independently validated.
|
Thanks for the exact-head review at
|
Goal And Delivered Outcome
loopx dashboardin a separate browser. The loopback workspace already exists (defaulthttp://127.0.0.1:8767/chat/); DSH had no entry point for it.docs/integrations/deepseek-harness-control-plane-adapter.md. Intended basemain.Author Declaration
Implemented against
packages/dsh-loopx-plugin/README.mdanddocs/integrations/deepseek-harness-control-plane-adapter.mdat this head (ef9a5680b).LOOPX_DASHBOARD_PANEL_ID,ctx.slots.inject('sidebar.panellist', …)insrc/client/index.tsxtests/goalbar-client.spec.tsx,smoke/dsh-client-artifact-smoke.mjsmainpanel occupies the central columnctx.slots.inject('main', …);LoopXDashboardPanelinsrc/client/dashboard.tsxtests/dashboard-client.spec.tsx,smoke/dsh-goalbar-runtime-smoke.mjsLOOPX_DASHBOARD_URL; iframe inLoopXDashboardPaneltests/dashboard-client.spec.tsxLoopXDashboardPaneltests/dashboard-client.spec.tsx(inc. retry recovery)DASHBOARD_LOCALE_NAMESPACEinsrc/client/locale.tsapprovedRequires)packages/dsh-loopx-plugin/README.md(Personal workspace panel), adapter doc surface listScope And Continuation
0.2.2-rc.xline and the release act (version bump, install-URL repin, bilingual release notes) are separate and are not claimed here. The panel is exercised on a0.2.2-rc.1prototype under an exact-version exemption (see Validation); the declared peer ranges still end at0.2.1-rc.x, so this PR does not advertise 0.2.2 compatibility.Validation
ef9a5680bcb4df96627b12e554f8231d934f8776staticpassedpnpm typecheck(host, client, tests tsconfigs)unitpassedpnpm test— 232 passed, 1 failed. The failure istests/admission-closeout.integration.spec.ts(invalid_schema: LoopX returned an incompatible response schema), which reproduces identically on the unmodified baseline (a02be1269) with the same local Python/CLI resolution; it is an environment mismatch, not this diff. 3 new panel cases were added and pass.integrationpassedpnpm smoke:peer-range,pnpm smoke:mcp-transport,pnpm smoke:artifactintegrationpassedpnpm smoke:profile— packed install into an isolated real DSH profilereal_entrypointpassedpnpm smoke:runtimeon DSH 0.2.1-rc.2: packed install, init readiness, served/materialized Client, slot coexistence, loopback fence, live-disablemanualpassedintegrationpassedloopx canary premerge --from-git-diff --git-diff-base origin/main:packageandruntimephases passed;qualityphase fails only on the pre-existing admission-closeout test above; public-boundary scan passedintegrationnot_runsmoke:docker(needs Docker + base images) andsmoke:registry(needs a release tarball) are out of scope for this client changeFrontend / Visual Evidence
changed插件/自动化任务, no LoopX row.插件and自动化任务.1440x900and1100x760(narrow; no page overflow); reachable state above; absent-service state (notice + Retry) is covered by the unit test and was captured during development. Plugin-manager install surfaces: installed list and detail.synthetic— three neutral demo goals in a temporary isolated registry; no live or private LoopX state, and the captured pages were scanned for local paths before publication. Evidence images live on a separate evidence branch so the PR diff stays source-only.Type of Change
LoopX Area
Technical Direction
docs/integrations/deepseek-harness-control-plane-adapter.md); presentation-only companion to the existing GoalBar/Driver/skills surfaces.Shared-authority RFC fixture impact
loopx-dashboard, the availability union) and copy keys, not shared LoopX state vocabulary.Boundary Checklist
.loopx/,.codex/goals/, and liveACTIVE_GOAL_STATE.md). Screenshots use a synthetic workspace; the hostname/paths of the capturing machine were scanned out.python3 scripts/check_rfc_bilingual.py --base origin/main --head HEADpassed in the canary run).none.Signed-off-bytrailer (git commit -s).