v5.4.0
The DevX swarm's non-blocker friction clusters, cleared: waiting is
narrated, ports tell the truth, artifacts say where they are, and error
prose explains the extension instead of the engine.
Added
extension_waitnarrates its budget.timeoutMsis a documented
argument (default 45000, clamped 1000 to 50000; the legacytimeout
spelling stays as a deprecated alias), every result carriesbudgetMs
andelapsedMs, and a timeout says what WAS observed plus a
call-again hint instead of an opaque failure. The status splits
compiledfrombrowserAttached, and anoBrowserbuild-only
session returns immediately withbuildOnly: trueand a plain
statement that no browser will ever attach.extension_buildwithzip: truereturnszipPath, the absolute
path of the file the engine actually wrote (its name sanitizer strips
punctuation, so the filename rarely matches the project name), and
zipSourcePathforzipSource: true. When a zip cannot be located
after a successful build the result says so inzipPathNoteinstead
of omitting the field silently.
Fixed
extension_devreports the actually-bound port. The engine's
ready.json carries the bound port from its first stamp, so dev reads
it after the health window and re-registers the session with the true
port; when the stamp has not landed yet, dev claims no port at all
and saysextension_waitreports the bound one. dev and wait now
share one source of truth and cannot disagree about the same session.extension_buildwarns when it writes over a live dev session's
dist: the dev browser may serve the production artifact until the
next recompile. The build is never blocked; the clobber is named.extension_inspectclassifies.zipfiles as archives and excludes
them fromshippableSizeand the 10MB store gate (the package is not
payload), with anarchiveNoteexplaining the exclusion.extension_whoamianchors its identity to the stored token that
extension_loginminted: it does not follow the current working
directory, and the wording now says so.extension_openexplains a popup-less extension instead of relaying
the engine error: a manifest pre-check reports that nothing sets
action.default_popup, lists the surfaces the manifest DOES declare,
and points at the right next verb. Headless popup errors state the
exact headed path (extension_devwithreplace: trueand
EXTENSION_HEADLESS=0).extension_dev'searlyOutputdrops V8 asm.js verdict lines (pure
noise); real errors are preserved.