Skip to content

fix(lr-8657): repoint stale pending-navigate imports — fixes console stuck on 'Reconnecting'#223

Merged
akuehner merged 1 commit into
mainfrom
fix/lr-8657-pending-navigate-imports
Jun 11, 2026
Merged

fix(lr-8657): repoint stale pending-navigate imports — fixes console stuck on 'Reconnecting'#223
akuehner merged 1 commit into
mainfrom
fix/lr-8657-pending-navigate-imports

Conversation

@akuehner

Copy link
Copy Markdown
Member

Outage fixed

Every authenticated user was stuck on the "Reconnecting to server…" overlay at the console (survived hard reload, incognito, different browser). Login worked; post-login the app never connected.

Root cause

PR #217 (lr-a3ca) extracted getPendingNavigate/peekPendingNavigate into lib/public/modules/pending-navigate.js. filebrowser.js imports them for internal use but does not re-export them. Two consumers still imported them from filebrowser.js:

  • app.js:23getPendingNavigate
  • app-messages.js:22getPendingNavigate + peekPendingNavigate

In the browser this is a fatal ESM error (module './filebrowser.js' does not provide an export named 'getPendingNavigate'). App boot halts before connect(), so no WebSocket is opened and the overlay never clears. Login page is a standalone inline script, so it was unaffected — which masked it as a connection/daemon problem.

Fix

Import the two functions from pending-navigate.js in both consumers. 4 lines, 2 files.

Verification

Headless browser against the live daemon, authenticated:

  • before: zero WS events, overlay visible, [PAGEERROR] ... getPendingNavigate
  • after: OPEN wss://.../p/{slug}/ws, overlay hidden, app renders, no console errors

Why tests missed it

lr-a3ca regression tests import pending-navigate.js directly and exercise the peek/consume contract — they never load the real browser ESM module graph, so the broken cross-module import path was never exercised. Follow-up in lr-8657: add a headless boot-graph smoke test (assert no pageerror + a WS opens).

Task: lr-8657

…ports to pending-navigate.js

PR #217 (lr-a3ca) extracted pendingNavigate state into
lib/public/modules/pending-navigate.js, but two consumers kept importing
getPendingNavigate/peekPendingNavigate from filebrowser.js — which now
imports those names for internal use and does NOT re-export them.

In the browser this is a fatal ESM resolution error:
  "The requested module './filebrowser.js' does not provide an export
   named 'getPendingNavigate'"
App boot halts before connect() runs, so no WebSocket is ever opened and
the "Reconnecting to server…" overlay never clears. Every authenticated
user was hit on every load; the login page (standalone inline script) was
unaffected, which masked it as a connection problem.

Fix: import the two functions from pending-navigate.js in both consumers.
  - app.js: getPendingNavigate from ./modules/pending-navigate.js
  - app-messages.js: getPendingNavigate + peekPendingNavigate from ./pending-navigate.js

Verified via headless browser against the live daemon: WS opens, overlay
hides, app renders. lr-a3ca tests passed because they import the real
module directly and never exercise the cross-module browser import graph.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@akuehner akuehner merged commit e07bbe4 into main Jun 11, 2026
1 check passed
@akuehner akuehner deleted the fix/lr-8657-pending-navigate-imports branch June 11, 2026 12:40
akuehner added a commit that referenced this pull request Jun 11, 2026
Adds test/esm-import-check.test.js — a static analysis pass that walks
every .js file in lib/public/, extracts named imports from relative
specifiers, and verifies that each imported name is actually exported by
the target module.

Catches the failure class from lr-8657 / PR #223: stale named imports
that point to a file where the export has moved or been renamed. All
276 existing unit tests pass; the new check adds test #277 and runs in
under 2 ms.

Constraints honoured:
- Static only: no dynamic require/import, no browser code execution.
- Skips bare specifiers (node:*, ws, …).
- Skips export * chains to avoid false-positives on unbounded re-exports.
- Zero new npm dependencies.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@clagentic-release-bot

Copy link
Copy Markdown

This issue has been resolved in version 1.5.0-beta.1 (beta).

To update, run:

npx @clagentic/console@1.5.0-beta.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant