Skip to content

branch: zed-web-server.rs: feat/responsive-shell-and-storage-console - #65

Draft
ORESoftware wants to merge 3 commits into
mainfrom
feat/responsive-shell-and-storage-console
Draft

ORESoftware wants to merge 3 commits into
mainfrom
feat/responsive-shell-and-storage-console

Conversation

@ORESoftware

Copy link
Copy Markdown
Contributor

Fleet sync 20260911 from the citadel Mac (~/codes/zed-pkg/zed-web-server.rs).

Branch feat/responsive-shell-and-storage-console carries 3 commit(s) not on main; 17 files changed, 2249 insertions(+), 134 deletions(-)

Files:

  • Cargo.toml
  • README.md
  • contracts/storage-status.v1.json
  • docs/registry-ui-parity.md
  • src/lib.rs
  • src/routes/mod.rs
  • src/routes/storage.rs
  • src/views/layout.rs
  • src/views/mod.rs
  • src/views/storage.rs
  • src/web_api_plane.rs
  • static/app.js
  • static/icon.svg
  • static/manifest.webmanifest
  • static/offline.html
  • static/styles.css
  • static/sw.js

Rules followed: no rebase, no stash, no reset, no force-push; conflicts (if any) are resolved semantically per oresoftware/my-ai/AGENTS.md before this is marked ready.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G7RjB22qc4AaKq4zqeVBVY

ORESoftware and others added 3 commits August 28, 2026 16:25
… console

Two changes that share a stylesheet.

**The UI is now mobile-first and installable.** The old stylesheet was written
for a desktop and patched narrow with one breakpoint, which is how a few
screens end up never being looked at on the device people actually open them
on. Every rule now applies to a phone first and the two breakpoints only add
room. Concretely: touch targets are 44px throughout, inputs are 16px so iOS
stops zooming on focus, tables scroll inside their own box instead of widening
the page, `viewport-fit=cover` plus `env(safe-area-inset-*)` handles the notch
and home indicator, the breadcrumb hides rather than truncating, and the
package page becomes content plus a sticky metadata rail on a wide screen.
`prefers-reduced-motion` and `prefers-contrast` are honoured, focus rings are
never removed, and there is a skip link.

A web manifest, an offline page, and a service worker make it installable. The
worker is deliberately narrow: it precaches the stylesheet, scripts, and icons
and serves an offline page for failed navigations, but it never caches HTML —
a package page can be private, and a shared on-device cache is the wrong place
for anything whose visibility depends on who asked. It is served from `/sw.js`
rather than `/static/sw.js` because a worker's scope is the directory it came
from, and root scope is what the navigation fallback needs.

Installed as a PWA there is no browser chrome at all, so a bottom tab bar
carries the primary destinations. `app.js` is progressive enhancement only —
copy buttons, the current-tab marker, service-worker registration — and
everything works with it blocked. Both new assets are same-origin, so
`script-src 'self'` needed no widening; a test now pins that, and pins the
`default-src` fallback the manifest and worker rely on.

**`/console/storage` describes the artifact backend.** The obvious version of
this page frames Cloudflare's dashboard, which answers the question for exactly
one provider and has to be rebuilt the day the bucket moves. Instead the page
renders `zed-api-server`'s own provider-agnostic report, so it reads the same
on R2, S3, Google Cloud Storage, MinIO, a directory, or process memory. It
shows which backend is live, whether it is answering, what the registry
believes is stored, and — given a published digest — whether the store still
holds it. A test asserts the page contains no iframe and no vendor console
link, because that is the property worth keeping.

The web server holds no storage credential and never speaks to an object store:
it makes one delegated GET with the viewer's own token, through the existing
`delegated_get` helper, and rotates the session cookie onto whatever it
renders. A digest is validated before it can become a request path. "The API is
down" and "storage is down" render as different states, since the second is a
finding and the first is a failure.

Both repositories now carry the same `contracts/storage-status.v1.json` and
assert their own decoder accepts it, so the API and this console cannot drift
apart without a test failing — and the console ignores unknown fields, so the
API can report more without a coordinated deploy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fvi78rjurJXbT9XYJv72by
"Reach parity with npm" is not a task anyone can pick up. A row saying the
package page has no README because the read model exposes no readme column is.

Feature-by-feature across the four reference registries, marked shipped,
partial, or blocked, with the repository each remaining piece belongs to — the
common case being that the UI is straightforward and the data plane is the gap,
so the ticket belongs in zed-lib-core or zed-interfaces rather than here.

Also records what the reference registries do not have, because parity is a
floor. Four of those are already shipped — the dependency graph, the verifiable
audit log, the vendor-neutral storage console, the local project registry — and
one is the largest unclaimed differentiator in the product: polyglot packages,
where one coordinate carries several ecosystems' slices and the consumer picks.
No single-language registry has a concept for it, and the UI barely surfaces it.

The suggested order is by what unblocks the most rather than by difficulty, and
the file ends with the rule that keeps it worth reading: a change that closes a
row edits the row in the same commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fvi78rjurJXbT9XYJv72by
Salvage pass 2026-08-29: work that existed only in the working tree.
Staged by explicit path (no -A); build output and key material excluded.
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