diff --git a/simulations/mix_lez_chat/run_simulation_lgx.sh b/simulations/mix_lez_chat/run_simulation_lgx.sh index bd6d3d0..0a10faa 100755 --- a/simulations/mix_lez_chat/run_simulation_lgx.sh +++ b/simulations/mix_lez_chat/run_simulation_lgx.sh @@ -621,9 +621,18 @@ EOF # alone leaves last_synced_block=0 even though storage.json knows about # accounts at higher chain_index values. Query sequencer for current # head and pass as the sync target. - CHAIN_HEAD=$(curl -sS -m 5 -X POST -H 'Content-Type: application/json' \ - --data '{"jsonrpc":"2.0","method":"getLastBlockId","params":[],"id":1}' \ - http://127.0.0.1:3040/ 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["result"])' 2>/dev/null) + # Probe sequencer for current head. On testnet there's no local + # server on 3040; use the testnet RPC URL instead. Wrap in || true + # to defuse set -e under pipefail when curl returns connection-refused. + if [ "$SIM_NETWORK" = "local" ]; then + CHAIN_HEAD=$(curl -sS -m 5 -X POST -H 'Content-Type: application/json' \ + --data '{"jsonrpc":"2.0","method":"getLastBlockId","params":[],"id":1}' \ + http://127.0.0.1:3040/ 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["result"])' 2>/dev/null || true) + else + CHAIN_HEAD=$(curl -sS -m 10 -X POST -H 'Content-Type: application/json' \ + --data '{"jsonrpc":"2.0","method":"getLastBlockId","params":[],"id":1}' \ + "$TESTNET_RPC_URL" 2>/dev/null | python3 -c 'import json,sys; print(json.load(sys.stdin)["result"])' 2>/dev/null || true) + fi : "${CHAIN_HEAD:=10000}" log " chain head=$CHAIN_HEAD (for wallet sync)" # selfRegisterRln args go via @file JSON object — logoscore-cli's `call` diff --git a/simulations/mix_lez_chat/sim-monitor/src/qml/MonitorView.qml b/simulations/mix_lez_chat/sim-monitor/src/qml/MonitorView.qml index 1def250..65436dc 100644 --- a/simulations/mix_lez_chat/sim-monitor/src/qml/MonitorView.qml +++ b/simulations/mix_lez_chat/sim-monitor/src/qml/MonitorView.qml @@ -302,73 +302,62 @@ ApplicationWindow { text: "NET " + parent.parent.peers + " peers" + (parent.parent.mixRdy ? " · mix ✓ pool " + parent.parent.pool : "") } Item { Layout.fillHeight: true } - - // MSG badges - RowLayout { - spacing: 12 - Repeater { - model: [{ label: "MSG OUT", val: parent.parent.parent.parent.out_, c: root.accent }, - { label: "MSG IN", val: parent.parent.parent.parent.in_, c: root.blue }] - Row { - spacing: 4 - Text { font.family: root.monoFont; font.pixelSize: 9; color: root.textSecond; text: modelData.label } - Rectangle { - width: 32; height: 20; radius: 4 - color: modelData.val > 0 ? modelData.c : root.bgPanel - border.color: modelData.val > 0 ? modelData.c : root.border - Text { anchors.centerIn: parent; font.family: root.monoFont; font.pixelSize: 12; font.bold: true - color: modelData.val > 0 ? "#000" : root.textTertiary; text: modelData.val } - } - } - } - } } } - // ── Message flow arrows ── + // ── Message flow arrows (large, central) ── Item { - Layout.preferredWidth: 60 + Layout.preferredWidth: 80 Layout.fillHeight: true ColumnLayout { anchors.centerIn: parent - spacing: 8 + spacing: 4 - // Forward arrow (sender → receiver) + // Sent count (large) Text { - font.family: root.monoFont; font.pixelSize: 16; font.bold: true - color: monitor.senderMsgOut > 0 ? root.accent : root.border - text: "→" - horizontalAlignment: Text.AlignHCenter + font.family: root.monoFont; font.pixelSize: 24; font.bold: true + color: monitor.senderMsgOut > 0 ? root.accent : root.textTertiary + text: monitor.senderMsgOut > 0 ? String(monitor.senderMsgOut) : "0" Layout.alignment: Qt.AlignHCenter - - SequentialAnimation on opacity { - id: fwdArrowAnim; loops: 1; running: false - NumberAnimation { to: 1.0; duration: 100 } - NumberAnimation { to: 0.5; duration: 400 } - } - opacity: monitor.senderMsgOut > 0 ? 1.0 : 0.3 } Text { - font.family: root.monoFont; font.pixelSize: 9; color: root.textSecond - text: monitor.senderMsgOut > 0 ? monitor.senderMsgOut + " sent" : "" + font.family: root.monoFont; font.pixelSize: 10; color: root.textSecond + text: "SENT →" + Layout.alignment: Qt.AlignHCenter + } + + // Separator + Rectangle { width: 40; height: 1; color: root.border; Layout.alignment: Qt.AlignHCenter } + + // Received count (large) + Text { + font.family: root.monoFont; font.pixelSize: 24; font.bold: true + color: monitor.receiverMsgIn > 0 ? root.accent : root.textTertiary + text: monitor.receiverMsgIn > 0 ? String(monitor.receiverMsgIn) : "0" + Layout.alignment: Qt.AlignHCenter + } + Text { + font.family: root.monoFont; font.pixelSize: 10; color: root.textSecond + text: "← RECV" + Layout.alignment: Qt.AlignHCenter + } + + // Separator + Rectangle { width: 40; height: 1; color: root.border; Layout.alignment: Qt.AlignHCenter } + + // Reply count + Text { + font.family: root.monoFont; font.pixelSize: 16; font.bold: true + color: monitor.senderMsgIn > 0 ? root.blue : root.textTertiary + text: monitor.senderMsgIn > 0 ? String(monitor.senderMsgIn) : "0" Layout.alignment: Qt.AlignHCenter } Text { font.family: root.monoFont; font.pixelSize: 9; color: root.textSecond - text: monitor.receiverMsgIn > 0 ? monitor.receiverMsgIn + " recv" : "" + text: "← REPLY" Layout.alignment: Qt.AlignHCenter } - - // Reverse arrow (receiver → sender) - Text { - font.family: root.monoFont; font.pixelSize: 16; font.bold: true - color: monitor.senderMsgIn > 0 ? root.blue : root.border - text: "←" - horizontalAlignment: Text.AlignHCenter - Layout.alignment: Qt.AlignHCenter - opacity: monitor.senderMsgIn > 0 ? 1.0 : 0.3 - } } } @@ -439,25 +428,6 @@ ApplicationWindow { text: "NET " + parent.parent.peers + " peers" + (parent.parent.mixRdy ? " · mix ✓ pool " + parent.parent.pool : "") } Item { Layout.fillHeight: true } - - RowLayout { - spacing: 12 - Repeater { - model: [{ label: "MSG OUT", val: parent.parent.parent.parent.out_, c: root.accent }, - { label: "MSG IN", val: parent.parent.parent.parent.in_, c: root.blue }] - Row { - spacing: 4 - Text { font.family: root.monoFont; font.pixelSize: 9; color: root.textSecond; text: modelData.label } - Rectangle { - width: 32; height: 20; radius: 4 - color: modelData.val > 0 ? modelData.c : root.bgPanel - border.color: modelData.val > 0 ? modelData.c : root.border - Text { anchors.centerIn: parent; font.family: root.monoFont; font.pixelSize: 12; font.bold: true - color: modelData.val > 0 ? "#000" : root.textTertiary; text: modelData.val } - } - } - } - } } } }