mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-07-27 12:18:59 +00:00
8980910153
* feat: add node-scoped Networking operator page Adds a Networking view with overview, topology, inventory, and findings. Shared aggregate reads back the page; Resources keeps prune and redirects here. Includes fail-closed network delete guards, operator docs, and /nodes/:slug/networking routing. * fix: rename unused variable n to _n to satisfy no-unused-vars lint * fix: keep top bar search clickable when nav grows * feat: complete Compose-first Networking Phase 2 operator assistant * fix: move networking action visibility helper out of component module * feat(networking): complete Compose-first Networking operator page Finish the node-scoped Networking page (Overview, Networks, Topology, Findings) with design-system parity and correct finding semantics. - Rebuild detail sheets on SystemSheet/SheetSection; align the tab band, masthead, and mobile tone with Fleet and Security. - Encode the host-mode and exposure severity matrix; fix collision counts so intentional shared externals are not flagged; add one typed drift predicate shared by inventory, topology, badges, and overview counts. - Preserve per-container attachments and IPs on topology node clicks; drawer-only click with an explicit logs action; ownership and boolean filters; bound large graphs before layout. - Aggregate cached Compose Doctor findings into the Findings tab with honest source labels, structural merge and dedupe, staleness reconciliation, and a shared exposure-context helper both engines use. - Networks tab: privacy-safe service search, precise ownership counts, schema v3 with version-2 adapters on every endpoint, pre-confirm delete reasons, and the shared sortable table with an internal scroll region. - Interop: Fleet node-card networking signal with pending-intent navigation, stack-to-node backlink, and Dossier/Drift deep links. - Enrich sanitized inspect with an allowlisted connected-container list; fetch topology once and filter client-side. - Docs and tests across every new finding kind, adapter, and flow. * fix(networking): correct drift count, exposure fail-soft, and inspect crash paths Address code-review findings on the Networking page implementation: - Fix the Overview drift count to use the shared drift-kind predicate instead of a hardcoded list that omitted external-network-missing. - Gate Compose Doctor's unclassified-exposure and reverse-proxy-undocumented rules on exposure-context availability, so a DB read failure no longer fabricates findings (mirrors the live engine's existing fail-soft behavior). - Guard the per-stack exposure-intent read in topology aggregation so a transient DB failure degrades to unknown intent instead of failing the whole response. - Harden the network detail drawer against a partial inspect payload from an older remote node, and log the real error instead of a bare catch. - Remove now-duplicated severity-rank and drift-kind helpers in favor of the shared modules; drop dead backend-only exports; widen the frontend schema version type to a plain number instead of casting past a literal type. - Add coverage for the delete-guard precedence, the full host-mode severity matrix, the schema-2 compatibility adapter, and the sanitized connected- container allowlist; tighten two tests that were not exercising the behavior they claimed to. * fix: add missing onOpenNodeNetworking prop to FleetView experimental test The added required prop on FleetViewProps broke the merge-build when the test file (on main but not on this branch) was compiled against the updated FleetView interface.
92 lines
5.5 KiB
Plaintext
92 lines
5.5 KiB
Plaintext
---
|
|
title: Deep links and URLs
|
|
description: Bookmark, share, and refresh Sencho views with real browser URLs that survive Back and Forward.
|
|
---
|
|
|
|
Every major screen in Sencho now has a stable address in the browser bar. Refresh the page, paste a link to a teammate, or use Back and Forward without losing your place.
|
|
|
|
## What gets its own URL
|
|
|
|
Sencho encodes the active node, the view you are on, and the deep state that view cares about.
|
|
|
|
| Destination | Example path | What it opens |
|
|
|-------------|--------------|---------------|
|
|
| Home dashboard | `/nodes/local/dashboard` | The home dashboard for the `local` node |
|
|
| Stack list (phone) | `/nodes/local/stacks` | The full-width stack list on a phone |
|
|
| Stack detail | `/nodes/local/stacks/radarr` | Radarr's stack detail (anatomy). Sidebar entry point |
|
|
| Compose editor | `/nodes/local/stacks/radarr/compose` | Radarr's compose.yaml Monaco editor |
|
|
| Env tab + file | `/nodes/local/stacks/radarr/env?env=.env.prod` | Radarr's env tab with a specific env file selected |
|
|
| Resources | `/nodes/local/resources` | Resources for the active node |
|
|
| Networking | `/nodes/local/networking` | Networking operator page for the active node |
|
|
| Security tab | `/nodes/local/security/images` | Security view on the Images tab |
|
|
| Settings section | `/nodes/local/settings/nodes` | Settings on the Nodes section |
|
|
| Fleet tab | `/nodes/local/fleet/snapshots` | Fleet on the Snapshots tab (desktop) |
|
|
| Schedules filter | `/nodes/local/schedules?node=3` | Scheduled operations filtered to node `3` |
|
|
|
|
Remote nodes use a slug derived from the node name and id (for example `/nodes/nas-box-42/dashboard`). The default local node keeps the short `local` slug.
|
|
|
|
## Stack detail vs compose editor
|
|
|
|
Clicking a stack in the sidebar opens **stack detail** at `/nodes/<node>/stacks/<stack>` (anatomy on the right). Opening the compose, env, or files editor appends that tab to the path:
|
|
|
|
- `/stacks/radarr` — detail
|
|
- `/stacks/radarr/compose` — compose.yaml editor
|
|
- `/stacks/radarr/env` — env editor
|
|
- `/stacks/radarr/files` — file browser (desktop)
|
|
|
|
Closing the Monaco editor returns you to the detail URL for that stack.
|
|
|
|
|
|
## Env tab URLs
|
|
|
|
Sencho encodes env file selection in the `?env=` query on the Env tab only:
|
|
|
|
- **Default file omitted:** when the stack's first env file is selected (usually `.env`), the URL is `/env` with no query parameter.
|
|
- **Non-default files use basenames only:** `?env=.env.prod`, never a server filesystem path.
|
|
- **Legacy bookmarks:** older links that used an absolute path in `?env=` still open the matching file by basename. Sencho normalizes the URL to basename form when the address bar updates.
|
|
- **Unknown basenames:** if `?env=` does not match any file on the stack, Sencho opens the default env file.
|
|
|
|
Compose and Files routes never carry `?env=`.
|
|
|
|
## Node slugs
|
|
|
|
- The primary local node is always `/nodes/local/...`.
|
|
- Every other node uses `/nodes/<name-slug>-<id>/...`, which stays stable when you rename the node (the id suffix is what Sencho resolves).
|
|
|
|
## Bookmarks and sharing
|
|
|
|
Copy the address bar after you land on a screen. Anyone with access to that Sencho instance and the right role can open the same view from the link. Sencho waits for permissions and license metadata to finish loading before it redirects a link you are allowed to see, so a valid paid or admin-only URL is not rewritten while metadata is still in flight.
|
|
|
|
If a link points at a stack that cannot be loaded (for example the node is offline), Sencho keeps the URL and shows a retryable error in the sidebar or on the phone stack detail screen instead of silently sending you home.
|
|
|
|
## Back, Forward, and refresh
|
|
|
|
- **Back / Forward** walk through the views you opened in order, including stack editor tabs where applicable.
|
|
- **Refresh** reloads the current URL and restores the same node, view, stack, and surface (detail vs compose/env/files editor) when the underlying data is available.
|
|
- **Unsaved edits** still block navigation. Sencho prompts before you leave a dirty compose or env buffer via Back, a sidebar link, or another stack.
|
|
|
|
## Phone layout
|
|
|
|
On a phone, Home and the stack list are distinct URLs even though both relate to stacks on desktop:
|
|
|
|
- `/nodes/local/dashboard` opens the home dashboard.
|
|
- `/nodes/local/stacks` opens the stack list.
|
|
|
|
On desktop, opening the stack list at `/nodes/local/stacks` canonicalizes to `/nodes/local/dashboard` because the sidebar stack list is part of the home layout on a wide screen.
|
|
|
|
Settings follows the same list/detail split: `/nodes/local/settings` is the section list; `/nodes/local/settings/<section>` opens a section directly.
|
|
|
|
On a phone, `/nodes/local/stacks/<stack>/files` opens the compose editor instead. Sencho does not expose a separate file-browser URL on a phone.
|
|
|
|
## What is not in the URL
|
|
|
|
Some in-app state is intentionally not encoded:
|
|
|
|
- **Stack Anatomy sub-tabs** (Anatomy, Activity, Dossier, Drift, Environment, and the rest) stay in memory only. Refresh returns you to the default Anatomy tab for that stack. A [Networking](/features/networking) finding's action can open a stack directly on its Doctor, Dossier, or Drift tab; this is in-app navigation, not a separate URL, so the same refresh behavior applies.
|
|
|
|
## Tips
|
|
|
|
- Use the global search palette (<kbd>Ctrl</kbd>+<kbd>K</kbd>) as today; navigation still updates the URL when you pick a page, node, or stack.
|
|
- Deep links use stack directory names (the name you see in the sidebar), not internal compose filenames.
|
|
- Opening Sencho at `/` sends you to the active node's dashboard once you are signed in.
|