Adds the first portal page backed by the CurrenciCombo orchestrator
(PR A-F). Renders:
- /transactions \u2014 list of recent plans with state chip,
instrument hint, owner, last-updated.
- /transactions/:planId \u2014 detail view with three cards:
1. 12-state machine grid highlighting current + visited states.
2. Audit trail table: from\u2192to, actor, actor_role (SoD),
reason, timestamp \u2014 straight from state_transitions.
3. Signed event stream: id, type, signature, prev_hash, at \u2014
straight from events (PR D).
Backend wiring (src/services/orchestrator.ts):
- listPlans() GET /api/plans
- getPlanState(id) GET /api/plans/:id/state
- getPlanEvents(id) GET /api/plans/:id/events
- probeOrchestrator() GET /health
If VITE_ORCHESTRATOR_URL is unset (orchestrator not deployed yet),
every call returns deterministic demo data so the 12-state view and
audit trail still render. Mirrors how proxmox/dbisCore fall back.
Badge on every card shows LIVE / DEGRADED / DEMO.
Also registers the orchestrator in backendCatalog so the existing
BackendStatusBar on the Dashboard picks it up automatically.
PortalLayout gets a new 'Transactions' nav item (GitBranch icon).
Portal code from PR #2 is untouched except for the new route + nav
entry.