Skip to content

Merge dev into master: windows fixes, nomadnet watchdog, zstd image layers - #111

Merged
Sudo-Ivan merged 13 commits into
masterfrom
dev
Sep 22, 2026
Merged

Sudo-Ivan merged 13 commits into
masterfrom
dev

Conversation

@Sudo-Ivan

Copy link
Copy Markdown
Contributor

Summary

Ports and hardening landed on dev, all CI green on 7e82b1f:

  • fix(electron): filter Chromium GPU/logging flags out of backend argv
    (Windows Job Object / sandbox crash-storm fallback was leaking them)
  • fix(nomadnet): request watchdog bounds link requests stuck in SENT;
    clean failure + link eviction when link.request raises or returns
    nothing
  • fix(nomadnet): resend in-flight page/file downloads after websocket
    reconnect instead of spinning forever
  • fix(tutorial): pin page footer nav; stop overriding the backend
    default_bootstrap_only=false default
  • fix(map): inline desktop search, mobile-only overlay, onboarding
    tooltip re-anchored to the map tools button
  • style(nomadnet): tighter announces sort select
  • chore(build): CRLF-normalize the preload bundler; refresh
    preload.bundle.js and electron-shell.css
  • ci: GHCR image layers pushed with zstd (OCI), verified live;
    Docker Hub stays gzip via a second cache-hit export

Test plan

  • dev CI green: CI, Docker, Security, Android, Native build
  • GHCR :dev manifest serves application/vnd.oci.image.layer.v1.tar+zstd
  • 28 backend + 20 electron + ~250 frontend tests pass locally

Ivan added 11 commits September 21, 2026 04:44
The load-more spinner's standalone v-if sat between the virtualized list
and the plain-list v-else-if, severing the conditional chain. With 32 or
more announces both lists mounted at once: the plain list rendered every
row below the fold, doubled scroll handlers, and produced a second scroll
container that chained wheel events to the page. Moving the spinner after
the else chain reattaches the branches so exactly one list renders.
A swipe-back or pull-to-refresh that armed during touchmove kept its
distance when the finger reversed direction, so touchend still fired the
action on a stale value. touchcancel also shared the touchend handler,
letting interrupted gestures trigger navigation or reload.

Clear navSwipeBackDistance before evaluating pull intent in touchmove,
evaluate pull state unconditionally so reversals zero it, and route
touchcancel to a reset-only handler.
The GPU crash-storm fallback relaunches with --disable-gpu and friends
in process.argv, which leaked through getUserProvidedArguments into the
backend spawn and the shell path guard. Filter them alongside
--no-sandbox so only real user flags reach the Python side.
RNS only invokes failed_callback once a request receipt reaches
DELIVERED, so a packet request stuck in SENT, an unanswered request, or
a link torn down mid-request never timed out and the download spun
forever. Add an async watchdog that fails the request when the link
closes or the response window lapses, extending the deadline on
progress. Also handle link.request raising or returning no receipt by
evicting the cached link and reporting a clean failure.
Downloads issued on the previous socket report results to the dead
client, so pages, files, and images spun forever after a reconnect.
Keep the sent payload on each callback entry and, on reconnect, cancel
the orphaned backend transfer by its old download id before re-issuing
the request on the new socket. Ids are cleared first so the stale
cancelled event cannot purge the resent entry or flash cancelled UI.
Move the page-mode navigation buttons out of the scroll area into a
pinned footer so Back/Continue stay reachable on small screens. Stop
forcing default_bootstrap_only on in the recommended and discovery
modes; the backend default is off since it was decoupled from the
Reticulum config, so the tutorial was silently overriding it. Update
the English hint text to match.
Move the location search bar into the header row on sm and up so it no
longer overlays the map; the absolute overlay is now mobile-only behind
the search toggle. Point the onboarding tooltip at the map tools button
instead of the drawing toolbar export button, positioning it below the
button with a straight arrow, and drop the xl top offset that fought
the toolbar layout.
…sets

The bundler cut shellOrigin.js on a \n marker that never matches under
CRLF checkouts, so Windows builds inlined the main-process-only helpers
into the preload bundle. Normalize line endings when reading sources so
every platform emits the same bundle. Regenerate preload.bundle.js to
pick up the hardened isTrustedShellFileUrl, and rebuild
electron-shell.css, which was stale relative to the shell HTML sources.
GHCR accepts OCI zstd layers, which cut push and pull time versus gzip
at similar ratios. Export the GHCR build with compression=zstd and
force-compression so base layers are recompressed too. Docker Hub
regular repos still expect gzip, so the Hub push is now a second
cache-hit build with default compression. The GHCR digest continues to
feed the bloat check, trivy scan, and cosign signature.
docker/build-push-action has no compression, force-compression, or
oci-mediatypes inputs, so the previous commit's keys were ignored and
GHCR still received gzip layers. Move them into outputs as
type=image,push=true,compression=zstd,force-compression=true,
oci-mediatypes=true, which is the documented path for layer
compression. Tags still apply via the -t args the action adds.
Comment thread meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue Outdated
Comment thread meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
@kilo-code-bot

kilo-code-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (1 file in incremental diff)
  • meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue - the guarded $t fallback in the resend-failure toast resolves the previously flagged issue; matching test coverage added in tests/frontend/NomadNetworkPage.test.js
Previous Review Summaries (2 snapshots, latest commit acd9e67)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit acd9e67)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue 1730 Unguarded this.$t(...) call in the primary-page failure branch, while the reason fallback at line 1720 explicitly handles $t being unavailable; settling a failure in that environment would throw instead of toasting
Files Reviewed (2 changed files in incremental diff)
  • meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue - 1 issue
  • tests/frontend/NomadNetworkPage.test.js - no issues

Previous review findings both resolved: resent send-failures are now settled (entry removed, callback/loading state handled) and the reconnect-resend recovery path is covered by five new tests.

Fix these issues in Kilo Cloud

Previous review (commit 7e82b1f)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 2
Issue Details (click to expand)

SUGGESTION

File Line Issue
meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue 1712 resendInFlightNomadDownloads() ignores WebSocketConnection.send return values for both the cancel and the re-issued request; a socket drop during resend orphans the backend transfer and the spinner persists
meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue 1681 New reconnect-resend recovery path (id-clearing order, sent/payload gating, stale-cancelled-event survival) has no test coverage, unlike the other fixes in this PR
Files Reviewed (17 files)
  • .github/workflows/docker.yml - no issues
  • electron/assets/css/electron-shell.css - no issues (generated)
  • electron/mainHelpers.js - no issues
  • electron/preload.bundle.js - no issues (generated)
  • meshchatx/src/backend/nomadnet_downloader.py - no issues
  • meshchatx/src/frontend/components/TutorialModal.vue - no issues
  • meshchatx/src/frontend/components/map/MapPage.vue - no issues
  • meshchatx/src/frontend/components/map/internal/MapDrawingToolbar.vue - no issues
  • meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue - 2 issues
  • meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue - no issues
  • meshchatx/src/frontend/locales/en.json - no issues
  • meshchatx/src/frontend/public/assets/css/electron-shell.css - no issues (generated)
  • scripts/bundle-electron-preload.cjs - no issues
  • tests/backend/test_nomadnet_downloader.py - no issues
  • tests/electron/mainHelpers.test.js - no issues
  • tests/frontend/NomadNetworkPage.test.js - no issues
  • tests/frontend/NomadNetworkSidebar.test.js - no issues

Fix these issues in Kilo Cloud


Reviewed by glm-5.3-flash · Input: 0 · Output: 0 · Cached: 0

WebSocketConnection.send can return false if the socket dies between
the reconnect event and the resend. The cancel and re-issued payload
were silently dropped, leaving the download spinning. Fail the entry
through onFailureCallback like a failed initial send, and cover the
resend path with tests.
Comment thread meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue Outdated
The reason fallback already tolerates a missing $t helper. Apply the
same guard to the failure toast so settling a primary page download
cannot throw in a stubbed harness.
@Sudo-Ivan
Sudo-Ivan merged commit af00a26 into master Sep 22, 2026
69 checks passed
@Sudo-Ivan
Sudo-Ivan deleted the dev branch September 22, 2026 00:25
@Sudo-Ivan
Sudo-Ivan restored the dev branch September 22, 2026 00:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant