Skip to content

feat(dashboard): list the obsidian service in the Services tab#78

Merged
AlienWalker1995 merged 1 commit into
mainfrom
feat/obsidian-dashboard-entry
Jul 9, 2026
Merged

feat(dashboard): list the obsidian service in the Services tab#78
AlienWalker1995 merged 1 commit into
mainfrom
feat/obsidian-dashboard-entry

Conversation

@AlienWalker1995

Copy link
Copy Markdown
Owner

What

The obsidian memory-vault GUI service (added in PR #76) was missing from the dashboard's Services tab. This adds it, following the stack's established SSO-routed-service pattern (identical shape to codebase-memory-ui).

Changes

File Change
dashboard/services_catalog.py Add obsidian entry to SERVICES — health check http://obsidian:3000/obsidian/ (SUBFOLDER-aware), no url key (SSO-routed)
dashboard/static/index.html Add obsidian: '/obsidian/' to SSO_ROUTES so serviceOpenHref builds the clean same-origin Open link
v2/docker/ops-api/main.py Add obsidian to ALLOWED_SERVICES so the row's start/stop/restart/logs controls work

Dashboard id (obsidian) == compose service name (obsidian), so no OPS_SERVICE_MAP entry is needed — matching how codebase-memory-ui is wired.

Validation (live on ordo-v2 — only dashboard + ops-api rebuilt & recreated)

  • (a) GET /api/services returns the obsidian entry with "ok":true, "error":null
  • (b) entry has no url key + SSO_ROUTES['obsidian'] = '/obsidian/' → frontend Open link resolves to /obsidian/ (same-origin)
  • (c) ops-api accepts obsidian: GET /api/ops/services/obsidian/logs?tail=3 returns real obsidian container logs (read-only check — obsidian was not restarted)
  • (d) dashboard + ops-api healthy post-recreate; /api/hardware still reports disk (1171/1999 GB) + both GPUs (GTX 1070 @ index 0, RTX 5090) — no env-override regression
  • (e) untouched container IDs unchanged: obsidian a23f5cc89dee, llamacpp c8ba78363863, agent ac79a12620ef. Only dashboard and ops-api recreated.

Tests

  • Root CI subset: ruff check dashboard tests … clean; pytest tests/test_services_and_throughput.py tests/test_dashboard_health.py → 12 passed
  • v2 substrate suite unchanged: 185 passed / 6 skipped both with and without this diff (identical baseline in the same throwaway container)

🤖 Generated with Claude Code

The obsidian memory-vault GUI (PR #76) was missing from the dashboard's
Services tab. Add it following the established SSO-routed-service pattern
(the same shape used for codebase-memory-ui):

- dashboard/services_catalog.py: add an `obsidian` entry to SERVICES with
  health check http://obsidian:3000/obsidian/ (SUBFOLDER-aware, returns 200
  on the subpath). No `url` key — the clean same-origin Open link is built
  from SSO_ROUTES via serviceOpenHref.
- dashboard/static/index.html: add `obsidian -> /obsidian/` to SSO_ROUTES so
  the frontend renders the /obsidian/ Open link.
- v2/docker/ops-api/main.py: add `obsidian` to ALLOWED_SERVICES so the row's
  start/stop/restart/logs controls work. Dashboard id == compose service name,
  so no OPS_SERVICE_MAP entry is needed (mirrors codebase-memory-ui).

Validated live on ordo-v2 (only dashboard + ops-api rebuilt/recreated):
/api/services returns obsidian ok=true; ops-api accepts obsidian on the
read-only logs route; hardware widget still reports disk + both GPUs;
obsidian/llamacpp/agent container IDs unchanged.

Root ruff + dashboard tests green; v2 substrate suite unchanged.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@AlienWalker1995
AlienWalker1995 merged commit 6c57bf2 into main Jul 9, 2026
5 checks passed
@AlienWalker1995
AlienWalker1995 deleted the feat/obsidian-dashboard-entry branch July 9, 2026 21:28
AlienWalker1995 added a commit that referenced this pull request Jul 10, 2026
…obsidian :3000) (#79)

The operator saw the obsidian Services card showing a raw `:3000` instead of
the clean `/obsidian/` SSO link, even though PR #78 shipped correctly:
/api/services returns the obsidian entry with NO `url`/`check` echoed (only
id/name/port/hint/ok), and serviceOpenHref takes the `APP_PREFIX &&
SSO_ROUTES['obsidian']` branch -> `/obsidian/`. The card never renders `port`
as text. So current code cannot produce `:3000` — the browser was serving a
CACHED pre-#78 index.html.

Root cause: Starlette's StaticFiles sends ETag + Last-Modified but NO
Cache-Control on index.html, so browsers apply heuristic freshness and serve
the stale app shell without revalidating. Every dashboard rebuild (new SSO
routes / service cards) can therefore keep showing the old shell until a hard
refresh — a recurring drift, not a one-off. Fixing per-incident ("tell the
operator to hard-refresh") would repeat forever; the real fix is upstream.

Fix: subclass StaticFiles to add `Cache-Control: no-cache` to HTML responses
only. The shell stays cached but MUST revalidate its ETag every load, so new
builds appear immediately; hashed static assets keep long-cache behavior.

Tests: index.html sends Cache-Control: no-cache (+ retains ETag); obsidian
entry has the SSO-routed shape (no `url`, port for probe only, hint uses the
same-origin `/obsidian/` path, never `:3000`) — regression-locking the shape
against codebase-memory-ui.

Validated live on ordo-v2 (only dashboard rebuilt/recreated): served shell now
carries `cache-control: no-cache` + the obsidian SSO route; /api/services
obsidian entry unchanged & clean; /api/hardware still reports disk
(1999.8GB) + both GPUs (1070+5090); dashboard healthy; obsidian/llamacpp/agent
container IDs unchanged. Root ruff (dashboard/) + tests green (118 passed).

Co-authored-by: Hermes Bot <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
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