feat(#288, #302): Dashboard v1 phase 6 — direct + full-screen viewing (one-time IndexedDB handoff) + File-menu restructure#306
Merged
Conversation
…+ File-menu restructure WIP checkpoint (gate green: 3559 tests, per-file coverage, build OK). - DashboardOpenSource contract + ?ws/?dash/?st route parsing (never ?state) - one-time IndexedDB token handoff store + persistent detached-views store - session-bundle glue (build/materialize/mode-resolve), viewer edit/view/not-found - Dashboard header File menu (import/export/open-for-viewing); workbench header Dashboard→ nav; Dashboard section removed from the Workbench File menu (#302) - ADR-0003; boundary test extended to src/workspace Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GLMprUnwnz4oaz3cnLRKcz
…p) + CHANGELOG - openDashboardForViewing: skip the token write + handoff grant when the popup is blocked (openWindow → null), so a blocked "Open for viewing" leaves no un-consumable (up-to-10MB) IndexedDB record; toast to allow pop-ups instead. - CHANGELOG [Unreleased]: Phase 6 viewing + #302 File-menu restructure. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GLMprUnwnz4oaz3cnLRKcz
This was referenced Jul 18, 2026
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Dashboard v1 Phase 6 — direct + full-screen viewing with a one-time IndexedDB handoff (#288, the final phase of #280), landed together with the File-menu restructure (#302). Also closes the "open in its own window" half of #153.
Owner-refined two-mode model (recorded in ADR-0003):
Dashboard →(new tab)current-workspace—?ws=&dash=Highlights:
DashboardOpenSourceroute contract parsed as query params on/dashboard(?ws=&dash=edit,?st=&dash=one-time view handoff) — pathname stays/dashboardsoconfigBase/isDashboardRoute/OAuth-redirect are untouched and the params survive the OAuth strip. The token param isst, neverstate(that's bootstrap's OAuth CSRF value).PortableBundleV1snapshot is written under an unguessable 256-bit token before the tab opens, atomically consumed exactly once (get+delete in one txn), and the token stripped from the URL viahistory.replaceState. It materializes into a persistent detached-views store under its own id, so the view survives relogin while staying detached from later Workbench edits.sessionStoragealone is insufficient. Credential auth-handoff is unchanged (the token carries state, not credentials).Dashboard →control (shown only when a Dashboard exists), and Import/Export Dashboard moved to the Dashboard page's own resource-scoped File menu (which also hosts "Open for viewing…"). Import still runs the transactional planner and commits atomically; no portable-format/schema/persistence semantics change.src/workspace).New modules:
dashboard/application/dashboard-open-source.ts,dashboard/application/session-bundle.ts,core/handoff-token.ts,workspace/indexeddb-handoff-store.ts,workspace/indexeddb-detached-views-store.ts(+ their type seams), all behind the injected IndexedDB/crypto seams.Verification beyond the unit gate: the two new IndexedDB stores + the full handoff→materialize→detached-views round-trip were driven against real browser IndexedDB in Chromium and WebKit (the fake-vs-real gap that hid two transaction auto-commit bugs during development — now fixed: get+delete are issued synchronously within one active transaction).
Closes #288. Closes #302. Completes the #280 epic (6/6). Reconciled: #149 architecture note, #68 roadmap,
CHANGELOG.md, and the #288/#302 issue bodies (reconciled-design banners).Checklist
npm testpasses (the per-file coverage gate is non-negotiable) — 3559 tests, per-file thresholds metnpm run buildsucceeds (single-filedist/sql.html)src/core/+src/dashboard/**, side-effects behind injected seams, DOM insrc/ui/CHANGELOG.md([Unreleased]) updated🤖 Generated with Claude Code
https://claude.ai/code/session_01GLMprUnwnz4oaz3cnLRKcz