feat(orbit): add shared library foundations and gated host tools

Extract the HTTP host and catalog layer into qbz-control, preserve the
existing daemon API, and keep private session credentials out of SSE.

Scope library stores and scan workers to their host. Share bounded source
search and show Local results alongside Qobuz in the Qt search page.

Add the launch-gated Qt Orbit laboratory and persistent remote-context
banner. Let qbzd run --orbit own and administer its file library through
instance-scoped API and CLI operations. Full remote UI control remains
pending.

Validate library/control/daemon suites, Qt search and QML regressions,
two isolated daemon processes, Qt release build and final cargo check.

cx
This commit is contained in:
vicrodh committed 2026-09-12 13:02:29 -06:00
1 parent 6394ef176c
commit 74e1610433
75 files changed
+6437 -1470

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
// Persistent context identity. No dismiss button or mutable visibility state.
// A lost connection keeps the selected host visible; only ending remote
// control may remove the banner. Host verification does not activate it.
import QtQuick
import com.blitzfc.qbz
import "../theme"
Rectangle {
id: root
property bool remoteActive: false
property bool connectionLost: false
property string hostName: ""
visible: remoteActive
height: remoteActive ? Math.max(38, label.implicitHeight + 16) : 0
color: theme.surfaceElevated
border.width: 1
border.color: theme.accent
Accessible.role: Accessible.StaticText
Accessible.name: label.text
QbzTheme { id: theme }
Text {
id: label
objectName: "orbitContextLabel"
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: 16
anchors.verticalCenter: parent.verticalCenter
text: "Orbit · " + QbzSession.tr("Controlling {}", QbzSession.trRev).replace("{}", root.hostName)
+ (root.connectionLost ? " · " + QbzSession.tr("Connection lost. Remote controls are unavailable.", QbzSession.trRev) : "")
textFormat: Text.PlainText
wrapMode: Text.WordWrap
color: theme.textPrimary
font.pixelSize: theme.fontBody
font.weight: theme.weightSemibold
}
}