Skip to content

feat(dsh): present the LoopX personal workspace as a DSH sidebar panel - #8352

Merged
huangruiteng merged 1 commit into
loopx-project:mainfrom
xiaoan17:codex/loopx-dashboard-panel
Nov 8, 2026
Merged

huangruiteng merged 1 commit into
loopx-project:mainfrom
xiaoan17:codex/loopx-dashboard-panel

Conversation

@xiaoan17

@xiaoan17 xiaoan17 commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

Goal And Delivered Outcome

  • Outcome basis / optional anchor: self-contained contribution to the DSH native integration; no public issue exists for this surface.
  • Goal/source and gap: DSH users see LoopX through the compact GoalBar and the installed skills, but reaching the personal workspace means leaving the harness and opening loopx dashboard in a separate browser. The loopback workspace already exists (default http://127.0.0.1:8767/chat/); DSH had no entry point for it.
  • Observable before → after: before, the DSH sidebar has no LoopX row and the workspace is only reachable outside DSH. After, one global LoopX sidebar row opens a central panel that embeds the already-running workspace; when that loopback service is absent the panel states the recovery command and offers Retry.
  • Issue/task and intended base: no issue; related to the DSH native integration contract in docs/integrations/deepseek-harness-control-plane-adapter.md. Intended base main.

Author Declaration

  • Written by: model_agent — DeepSeek Harness (deepseek-v4.1-flash), operated by @xiaoan17.

Implemented against

  • Specification and revision: no written specification; the request in this PR is the basis, plus the existing plugin contract in packages/dsh-loopx-plugin/README.md and docs/integrations/deepseek-harness-control-plane-adapter.md at this head (ef9a5680b).
  • Criteria:
Criterion Disposition Symbol / path Test or command
One global sidebar entry, id stable across the panel implemented LOOPX_DASHBOARD_PANEL_ID, ctx.slots.inject('sidebar.panellist', …) in src/client/index.tsx tests/goalbar-client.spec.tsx, smoke/dsh-client-artifact-smoke.mjs
Keyed main panel occupies the central column implemented ctx.slots.inject('main', …); LoopXDashboardPanel in src/client/dashboard.tsx tests/dashboard-client.spec.tsx, smoke/dsh-goalbar-runtime-smoke.mjs
Embeds the existing loopback workspace; starts nothing implemented LOOPX_DASHBOARD_URL; iframe in LoopXDashboardPanel tests/dashboard-client.spec.tsx
Absent service shows recovery command and Retry implemented availability probe + notice in LoopXDashboardPanel tests/dashboard-client.spec.tsx (inc. retry recovery)
zh/en copy through the plugin locale owner implemented DASHBOARD_LOCALE_NAMESPACE in src/client/locale.ts artifact smoke locale assertions
Presentation only: no LoopX state, authority, tool or credential added implemented client bundle requires unchanged (approvedRequires) artifact smoke, runtime smoke
Documented product journey + install/removal boundary implemented packages/dsh-loopx-plugin/README.md (Personal workspace panel), adapter doc surface list manual read

Scope And Continuation

  • Completed scope and remaining work: the client-only panel, its locale copy, unit/smoke coverage, and both documentation anchors. No LoopX core behavior, authority, registry, quota or binding semantics change. The package version is untouched: source-only compatibility and feature changes ride an independent plugin release.
  • Slice boundary / successor: qualified DSH peer-range extension for the 0.2.2-rc.x line and the release act (version bump, install-URL repin, bilingual release notes) are separate and are not claimed here. The panel is exercised on a 0.2.2-rc.1 prototype under an exact-version exemption (see Validation); the declared peer ranges still end at 0.2.1-rc.x, so this PR does not advertise 0.2.2 compatibility.

Validation

  • Tested revision: ef9a5680bcb4df96627b12e554f8231d934f8776
  • Run state: finished
  • Input classes: synthetic
Check kind Result Public-safe evidence / limitation
static passed pnpm typecheck (host, client, tests tsconfigs)
unit passed pnpm test — 232 passed, 1 failed. The failure is tests/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.
integration passed pnpm smoke:peer-range, pnpm smoke:mcp-transport, pnpm smoke:artifact
integration passed pnpm smoke:profile — packed install into an isolated real DSH profile
real_entrypoint passed pnpm smoke:runtime on DSH 0.2.1-rc.2: packed install, init readiness, served/materialized Client, slot coexistence, loopback fence, live-disable
manual passed Packed build of this head installed in an isolated DSH 0.2.2-rc.1 web profile under an exact-version exemption: sidebar row, embedded panel, and absent-service fallback + Retry verified (screenshots below). Represents the prototype/packaged boundary, not a compatibility claim.
integration passed loopx canary premerge --from-git-diff --git-diff-base origin/main: package and runtime phases passed; quality phase fails only on the pre-existing admission-closeout test above; public-boundary scan passed
integration not_run smoke:docker (needs Docker + base images) and smoke:registry (needs a release tarball) are out of scope for this client change
  • Coverage and gaps: the changed paths are the web Client registration/bundle, locale dictionaries, two smokes, one client test and documentation. The real-host runtime smoke exercises a packed install end to end on the qualified host line; the 0.2.2-rc.1 run is a manual, exemption-scoped observation and does not qualify that host line for release.

Frontend / Visual Evidence

  • UI impact: changed
  • Before: sidebar from an isolated profile with the official beta.6 release asset — 插件 / 自动化任务, no LoopX row.

Before: no LoopX row

  • After: same profile shape with this build — new LoopX row between 插件 and 自动化任务.

After: sidebar entry

  • First viewport and preview: clicking the row opens the embedded workspace in the central column (1440x900); the iframe fills the panel next to the DSH sidebar.

After: embedded workspace panel

  • States and viewports shown: sidebar entry and panel at 1440x900 and 1100x760 (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.
  • Narrow view: sidebar and panel.
  • Source data: 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.
  • Attention review: the new row earns its place as the only in-harness route to the full workspace; the panel is full-bleed and adds no copy beyond the absent-service notice, which keeps the recovery command and one Retry action. Nothing else in the sidebar was reordered or restyled.
  • Craft review: registration follows the host's own list-slot conventions (id/order/label) and the panel reuses the package's design-token variables rather than new raw colors; loading is a plain iframe mount, and the designed failure state is text + one action. The panel does not duplicate any LoopX control already available in DSH.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring (no functional changes)
  • Documentation update
  • Test update

LoopX Area

  • Control plane (goals, todos, quota, scheduler, registry, runtime)
  • Benchmark boundary (adapters, runners, verifiers, scoring, evidence)
  • Capability or extension (providers, adapters, skills)
  • Public docs or presentation surface (README, protocols, dashboard)
  • Build, packaging, installer, or CI
  • Host or runtime integration

Technical Direction

  • Direction / acceptance reference, when applicable: DSH native integration (docs/integrations/deepseek-harness-control-plane-adapter.md); presentation-only companion to the existing GoalBar/Driver/skills surfaces.

Shared-authority RFC fixture impact

  • Production-scale fixture schema: N/A
  • Semantic dimensions changed, or reviewed no-impact rationale: N/A — no TypeScript control-plane or shared Goal Authority change. The advisory semantic-vocabulary probe reports no supported new carriers; the new names are local UI identity (loopx-dashboard, the availability union) and copy keys, not shared LoopX state vocabulary.
  • Provider conformance arms run: N/A
  • Read-only legacy/file/PostgreSQL three-arm rehearsal: N/A

Boundary Checklist

  • Neither the diff nor this PR body/comments/attachments disclose private state, credentials, raw traces or verifier output, internal links, or local machine paths (including .loopx/, .codex/goals/, and live ACTIVE_GOAL_STATE.md). Screenshots use a synthetic workspace; the hostname/paths of the capturing machine were scanned out.
  • I did not duplicate maintainer-owned benchmark work unless a maintainer split out a public issue for it.
  • I kept the change scoped to the linked outcome.
  • Existing English/Chinese RFC pairs (including ledger entries) both have a diff, or no paired RFC changed — no RFC touched here (python3 scripts/check_rfc_bilingual.py --base origin/main --head HEAD passed in the canary run).
  • I completed the visual evidence section for UI changes, or marked UI impact none.
  • Every commit includes a DCO Signed-off-by trailer (git commit -s).

@xiaoan17

xiaoan17 commented Nov 8, 2026

Copy link
Copy Markdown
Contributor Author

CI triage after rebase

Rebased onto main @ e441ae1f2; new head 7638bba65. Workflow package phases for this diff pass locally, and two red checks are pre-existing main-side failures rather than regressions from this PR:

  1. dsh-plugin (ubuntu-latest) — tests/admission-closeout.integration.spec.ts fails with invalid_schema: LoopX returned an incompatible response schema. The dsh-plugin workflow has been failing on main since at least 2026-11-05 (runs 41961423900, 42352679375), and the same failure reproduces on this branch with the PR commit removed.
  2. typescript-core (3/3) — tests/control_plane_ts/effect_runtime_handler_loading.test.ts asserts /task_lease_acquire_decision.ts is not imported. It reproduces on a pristine origin/main checkout (e441ae1f2) with no files from this PR, so the import-graph drift is on main.

What this change does pass: pnpm typecheck, pnpm build, pnpm test (232/233; the one failure is item 1), smoke:peer-range, smoke:mcp-transport, smoke:artifact, smoke:profile, smoke:runtime, and loopx canary premerge package + runtime phases (quality is blocked only by item 1).

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.

@xiaoan17
xiaoan17 force-pushed the codex/loopx-dashboard-panel branch from 7638bba to 151d5e9 Compare November 8, 2026 08:56
@xiaoan17

xiaoan17 commented Nov 8, 2026

Copy link
Copy Markdown
Contributor Author

Consolidated CI triage (all four red checks are repo-wide, not this diff)

Rebased head: 151d5e97e on main @ c263f7c78.

Check Cause Cross-branch / baseline evidence
build Desktop manifest download failed (HTTP 504); retry the site build. — external site-build download infrastructure flake; a maintainer rerun is the remedy (I do not have rerun permission)
dsh-plugin (ubuntu-latest) tests/admission-closeout.integration.spec.ts: invalid_schema: LoopX returned an incompatible response schema dsh-plugin workflow red on main since 2026-11-05 (runs 41961423900, 42352679375); identical failure with this PR's commit removed
typescript-core tests/control_plane_ts/effect_runtime_handler_loading.test.ts: unexpected import of /task_lease_acquire_decision.ts fails on pristine origin/main checkout; also failing on codex/process-startup-cancellation-20261108 (run 42466085705)
windows-powershell tests/test_delegation_task_revalidation.py (KeyError: 'task_failure') same job fails on codex/process-startup-cancellation-20261108 (run 42466085705); this diff has no Python changes and the file is untouched

Checks that pass for this change include: Sign-off, dependency-review, dsh-pnpm-frozen (9.15.9 / 10.33.0 / 12.10.1), dsh-plugin (windows-latest), build package jobs, pnpm typecheck/build/test for the package (232/233; sole failure is the admission-closeout item above), smoke:peer-range/mcp-transport/artifact/profile/runtime, and loopx canary premerge package + runtime phases.

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>
@xiaoan17
xiaoan17 force-pushed the codex/loopx-dashboard-panel branch from 151d5e9 to cd4a1bf Compare November 8, 2026 10:02

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 或传输契约。

关键代码讲解

  1. src/client/index.tsx:38 的 apply 注册 dashboard locale,再注入 sidebar 和 keyed main。SDK 的 MainPanel 按 active panel key 选择条目,侧栏按注册 id/order 构造列表。原 GoalBar 的 id、顺序、locale 和 exact-Session 注入保持。
  2. src/client/dashboard.tsx:61 的 LoopXDashboardPanel 使用 AbortController 与 2.5 秒超时,只派生 probing/ready/unavailable。iframe 始终指向 loopback;失败显示命令及 Retry,重试递增 attempt,清理时取消旧探测。
  3. 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.

@xiaoan17

xiaoan17 commented Nov 8, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the exact-head review at cd4a1bf18. Status note from the author side:

  • The branch is now 4 commits behind main. I have deliberately not rebased again, so the reviewed exact head cd4a1bf18 stays unchanged; no code change has landed since the review.
  • To preserve the exact-head review, I'll leave the update to the maintainer merge workflow (or rebase immediately if you ask me to and will re-review the new head).
  • Remaining red checks are unchanged and repo-wide: build (Desktop manifest download HTTP 504, infrastructure — needs a maintainer rerun), dsh-plugin (ubuntu-latest) (pre-existing admission-closeout schema failure on main), typescript-core (pre-existing import-graph drift), windows-powershell (pre-existing delegation test). The large Python shard matrix is still queued.
  • No merge action taken; merge authority remains with the maintainers.

@huangruiteng
huangruiteng merged commit 115ea15 into loopx-project:main Nov 8, 2026
30 of 42 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants