Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
17b7015
fix(updater): skip a component whose branch was deleted upstream so o…
gmmcosta15 Jul 16, 2026
a34b965
fix(updater): reclone rung for local==origin corruption; klipper->mas…
gmmcosta15 Jul 16, 2026
06ed4a2
fix(updater): per-component update isolation, main release channel, a…
gmmcosta15 Jul 17, 2026
9004111
fix: change to release branch
gmmcosta15 Jul 17, 2026
63ca2bc
fix(updater): guard against host downgrade to a pre-updater commit; o…
gmmcosta15 Jul 20, 2026
dffee8b
refactor(updater): reduce all radon hotspots below grade C and fix 4 …
gmmcosta15 Jul 21, 2026
a8b5d43
test(updater): mock git_ref_hash and _assert_https_remote in update-f…
gmmcosta15 Jul 21, 2026
92f62c0
fix(updater): guard in-flight marker writes, terminal disk-space call…
gmmcosta15 Jul 21, 2026
a8fde9c
feat(updater): gate Spoolman provision/update on a real /api/v1/healt…
gmmcosta15 Jul 21, 2026
98fd8eb
fix(updater): extend dead-branch batch guard to unconfigured componen…
gmmcosta15 Jul 21, 2026
3286761
fix(updater): ruff formatting
gmmcosta15 Jul 21, 2026
c041505
fix: field-install self-heal (venv/executor/spoolman/usb/hostname) + …
gmmcosta15 Aug 17, 2026
67be61d
fix: usb_max_current self-heal never applied via updater (post-merge …
gmmcosta15 Aug 17, 2026
93c1c61
fix(x11): regenerate .Xauthority when it lacks a cookie for the curre…
gmmcosta15 Aug 17, 2026
26b9c36
fix(ci): resolve ruff/bandit/pytest failures and condense multi-line …
gmmcosta15 Aug 18, 2026
9a07aac
Merge remote-tracking branch 'origin/dev' into bugfix/field-install-s…
gmmcosta15 Aug 18, 2026
7edfa11
fix(updater): fix monotonic 0.0 sentinel skipping first refresh, band…
gmmcosta15 Aug 18, 2026
8459ec7
fix(updater): drop healthcheck scripts from repo
gmmcosta15 Aug 18, 2026
58e7b26
fix(updater): resync UI on daemon restart, extract git-step helper, w…
gmmcosta15 Aug 19, 2026
5effd67
fix(updater): re-poll on fetch failure and order daemon after network…
gmmcosta15 Aug 19, 2026
ab11138
Merge remote-tracking branch 'origin/refactor/updater-complexity-hots…
gmmcosta15 Aug 19, 2026
d613657
test(updater): mock git_ref_hash via autouse fixture in TestGitUpdate
gmmcosta15 Aug 19, 2026
cb18943
Merge branch 'dev' into bugfix/field-install-selfheal
gmmcosta15 Sep 25, 2026
00a3c24
fix(updater): hash-pin heal and stage resets, sha256-verify python ta…
gmmcosta15 Sep 25, 2026
85bc9f0
fix(updater): keep untracked files across reclone, read spoolman from…
gmmcosta15 Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,10 @@ cython_debug/
*.drawio
*.logs
*.log
# TimedRotatingFileHandler appends a date suffix, so *.log alone leaves logs/ dirty on every box.
logs/
# Bench-only acceptance/diagnostic suite: stays local, never shipped to the fleet.
scripts/healthcheck/

*/*Zone.Identifier
*:Zone.Identifier
Expand Down
2 changes: 2 additions & 0 deletions BlocksScreen/lib/moonrakerComm.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class MoonWebSocket(QtCore.QObject, threading.Thread):
klippy_connected_signal = QtCore.pyqtSignal(bool, name="klippy_connection_status")
klippy_state_signal = QtCore.pyqtSignal(str, name="klippy_state")
query_server_info_signal = QtCore.pyqtSignal(name="query_server_information")
server_components_signal = QtCore.pyqtSignal(list, name="server_components")

_KLIPPY_NOTIFY_METHODS: typing.ClassVar[frozenset[str]] = frozenset(
{
Expand Down Expand Up @@ -307,6 +308,7 @@ def on_message(self, *args) -> None:
if "error" in response:
return
_result = response.get("result", {})
self.server_components_signal.emit(_result.get("components", []))
_klippy_state = _result.get("klippy_state")
if not _klippy_state:
return
Expand Down
44 changes: 27 additions & 17 deletions BlocksScreen/lib/panels/filamentTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ def __init__(
self._color_selected_callback: typing.Callable[[str], None] | None = None
self._selected_spool: dict | None = None
self._material_filter: str | None = None
self.moonraker_run = True
self._spoolman_available: bool | None = None
self._popup_form_page: QtWidgets.QWidget | None = None
self._popup_spool_page: QtWidgets.QWidget | None = None

self._setup_pre_gate_popup()
self._setup_load_popup()
Expand Down Expand Up @@ -126,7 +128,7 @@ def __init__(
lambda: self.change_page(self.indexOf(self._basic_panel))
)

self.ws.connected_signal.connect(self.handle_moonraker_components)
self.ws.server_components_signal.connect(self.handle_moonraker_components)

self.run_gcode.connect(self.ws.api.run_gcode)

Expand All @@ -139,20 +141,27 @@ def in_case_error(self):
self.load_state = False
self.load_popup.hide()

def handle_moonraker_components(self):
"""Build the pre-gate popup pages once, choosing spoolman vs. manual-entry order."""
if self.moonraker_run:
components = self.ws._moonRest.get_server_info()
if "spoolman" not in components.get("result", {}).get("components", []):
self.fp_button_2.hide()
self._popup_stack.addWidget(self._build_form_page())
self._popup_stack.addWidget(self._build_spool_page())
else:
self.fp_button_2.show()
self._popup_stack.addWidget(self._build_spool_page())
self._popup_stack.addWidget(self._build_form_page())
self.request_filament_change_page.emit()
self.moonraker_run = False
@QtCore.pyqtSlot(list, name="handle_moonraker_components")
def handle_moonraker_components(self, components: list) -> None:
"""Re-check spoolman on each server.info: updates add it without a UI restart."""
available = "spoolman" in components
if available == self._spoolman_available:
return
self._spoolman_available = available
if self._popup_form_page is None:
self._popup_form_page = self._build_form_page()
self._popup_spool_page = self._build_spool_page()
# insertWidget moves an existing page; the second move makes index 0 current.
pages = (
(self._popup_spool_page, self._popup_form_page)
if available
else (self._popup_form_page, self._popup_spool_page)
)
for i, page in enumerate(pages):
self._popup_stack.insertWidget(i, page)
self.fp_button_2.setVisible(available)
if available:
self.request_filament_change_page.emit()

def change_page(self, index: int) -> None:
"""Requests a page change page to the global manager
Expand Down Expand Up @@ -975,9 +984,10 @@ def on_mmu_state_changed(self, mmu_state):
)
self.amupage.request_keyboard.connect(self._on_show_keyboard)
self.amupage.request_color_wheel.connect(self._open_color_wheel)
# Latch here: an early single-gate state must not veto a later AMU.
self.amu_configured = True
else:
self.load_status_widget.set_left_text("Auxiliary Extruder")
self.amu_configured = True

if self.load_state:
if mmu_state.action == "Idle":
Expand Down
Loading
Loading