Watch
1
0
Fork
You've already forked souveraine
0

shell: re-home the subconscious surface from the ii tree to souveraine

The subconscious three-tier surface (SubconsciousTicker + SubconsciousEventPanel)
is Souveraine-original, not upstream ii. It lived under ii-base/modules/ii only
because it had never been re-homed, so the ii -> souveraine shell migration
silently stranded it: the files survived, but the running shell (qs -c souveraine)
never loaded them, and the feature dropped off the device.

Relocated into modules/souveraine/subconscious/, decoupled from the ii overlay
system it was riveted to:

- SubconsciousTicker: was clean of ii imports but opened the panel through the
  ii OverlayContext singleton. Now emits requestOpenPanel(); a host connects it.
- SubconsciousEventPanel: was a StyledOverlayWidget (qs.modules.ii.overlay). Now
  plain content a host instantiates; the pin/close/drag affordances were the
  overlay host's job, not the content's.

The model (services/Ai.qml) was already substrate-neutral and never moved; only
the views were stranded. GAP NAMED: no souveraine overlay host mounts these yet,
so they do not reach the glass until one exists — the ii overlay host was
intentionally not ported. The dangling ii references (AiChat, OverlayContext,
OverlayWidgetDelegateChooser) are removed.
This commit is contained in:
Fimeg 2026-07-30 12:57:19 -04:00
commit 25898a9d14
5 changed files with 41 additions and 31 deletions

View file

@ -15,7 +15,6 @@ Singleton {
{ identifier: "resources", materialSymbol: "browse_activity" },
{ identifier: "notes", materialSymbol: "note_stack" },
{ identifier: "volumeMixer", materialSymbol: "volume_up" },
{ identifier: "subconsciousEventPanel", materialSymbol: "psychology" },
]
readonly property bool hasPinnedWidgets: root.pinnedWidgetIdentifiers.length > 0

View file

@ -13,7 +13,6 @@ import qs.modules.ii.overlay.fpsLimiter
import qs.modules.ii.overlay.recorder
import qs.modules.ii.overlay.resources
import qs.modules.ii.overlay.notes
import qs.modules.ii.overlay.subconsciousEventPanel
DelegateChooser {
id: root
@ -26,5 +25,4 @@ DelegateChooser {
DelegateChoice { roleValue: "resources"; Resources {} }
DelegateChoice { roleValue: "notes"; Notes {} }
DelegateChoice { roleValue: "volumeMixer"; VolumeMixer {} }
DelegateChoice { roleValue: "subconsciousEventPanel"; SubconsciousEventPanel {} }
}

View file

@ -527,8 +527,6 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
}
}
SubconsciousTicker {}
Rectangle { // Input area
id: inputWrapper
property real spacing: 5

View file

@ -1,13 +1,11 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell
import qs
import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
import qs.modules.ii.overlay
// Tier 2 of the subconscious three-tier visibility design (see
// docs/tasks/subconscious-surfacing-threshold.md): a persistent, interactive
@ -17,12 +15,28 @@ import qs.modules.ii.overlay
// closing docs/bugs.md B-005 ("subconscious messages not expandable").
// Fed by Ai.subconsciousEvents; the live Tier-1 ticker is snapshotted into
// it on pass end.
StyledOverlayWidget {
//
// Souveraine-original, relocated out of the ii tree on 2026-07-30. It was
// previously a StyledOverlayWidget (qs.modules.ii.overlay) riveted into the
// ii overlay system; that base is intentionally NOT ported, because we are
// exiting ii. This is now plain content a host (a souveraine overlay
// surface, a sidebar, or a future viewtop scene node) instantiates and places
// it. The pin/close/drag affordances were the overlay host's job, not the
// content's, so they are not here. GAP NAMED: no souveraine host mounts this
// yet, so it does not reach the glass until one exists.
Item {
id: root
title: Translation.tr("Subconscious")
showCenterButton: true
contentItem: Rectangle {
// A host may read these to label/chrome the panel.
property string title: Translation.tr("Subconscious")
property int contentRadius: Appearance.rounding.normal
implicitWidth: body.implicitWidth
implicitHeight: body.implicitHeight
Rectangle {
id: body
anchors.fill: parent
radius: root.contentRadius
color: Appearance.colors.colLayer1
implicitWidth: 340

View file

@ -13,11 +13,20 @@ import Quickshell
// Visible only while Ai.subconsciousActive; fed by Ai.subconsciousStream;
// cleared (and snapshotted to the Tier-2 log) when the pass ends.
//
// This is Souveraine-original work, not anything inherited from the upstream
// ii shell. It lived under the ii tree only because it had not been re-homed;
// relocated into modules/souveraine/ on 2026-07-30 so it is no longer tangled
// with a shell we are exiting. The model it reads (Ai.qml, in services/) is
// already substrate-neutral and never moved.
//
// Interaction: the psychology icon is a real affordance, not decoration.
// tap expand/collapse an inline mini-log (last few entries) in place
// long-press open the Tier-2 Subconscious event panel as a draggable
// overlay pane (and pin it), so the live stream and the persistent log
// are one gesture apart.
// long-press ask the host to open the Tier-2 event panel
//
// The long-press emits requestOpenPanel() rather than reaching into an overlay
// manager. Whoever mounts the panel connects that signal; the view itself owns
// no overlay state. That decoupling is the point: this component renders
// wherever a host places it sidebar, scene element, or a future viewtop node.
Rectangle {
id: root
Layout.fillWidth: true
@ -30,6 +39,11 @@ Rectangle {
property real padding: 6
property bool expanded: false
/// Ask the host to open the Tier-2 subconscious event panel. The view does
/// not know how panels are mounted; it only declares the intent. Unconnected
/// until a souveraine overlay host exists see SubconsciousEventPanel.qml.
signal requestOpenPanel()
Behavior on opacity {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
@ -50,19 +64,6 @@ Rectangle {
}
}
function _openPanel() {
// Open the Tier-2 Subconscious event panel as a draggable overlay
// pane and pin it, so it stays after the overlay closes. Mirrors what
// OverlayTaskbar's WidgetButton does on click.
const id = "subconsciousEventPanel";
const open = Persistent.states.overlay.open;
if (!open.includes(id)) {
Persistent.states.overlay.open.push(id);
}
OverlayContext.pin(id, true);
GlobalStates.overlayOpen = true;
}
ColumnLayout {
id: col
anchors.fill: parent
@ -74,7 +75,7 @@ Rectangle {
spacing: root.padding
// The icon is the affordance: tap = expand inline, long-press =
// open the overlay panel. Press-and-hold beats a separate button
// open the event panel. Press-and-hold beats a separate button
// keeps the ticker visually quiet.
Item {
Layout.alignment: Qt.AlignVCenter
@ -98,7 +99,7 @@ Rectangle {
MouseArea {
anchors.fill: parent
onClicked: root.expanded = !root.expanded
onPressAndHold: root._openPanel()
onPressAndHold: root.requestOpenPanel()
cursorShape: Qt.PointingHandCursor
}
}
@ -137,7 +138,7 @@ Rectangle {
MouseArea {
anchors.fill: parent
onClicked: root.expanded = !root.expanded
onPressAndHold: root._openPanel()
onPressAndHold: root.requestOpenPanel()
cursorShape: Qt.PointingHandCursor
}
StyledToolTip {
@ -148,7 +149,7 @@ Rectangle {
// Inline mini-log: the last several entries (newest at the bottom),
// shown when expanded. Read-only the full searchable log lives in
// the Tier-2 overlay panel.
// the Tier-2 panel.
ColumnLayout {
Layout.fillWidth: true
visible: root.expanded && Ai.subconsciousStream.length > 0