Skip to content

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

Open
xiaoan17 wants to merge 1 commit into
loopx-project:mainfrom
xiaoan17:codex/loopx-dashboard-panel
Open

xiaoan17 wants to merge 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.

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 7638bba to 151d5e9 Compare November 8, 2026 08:56

This branch has not been deployed

No deployments
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.

1 participant