A failed inspect or conversion hid the progress panel that held the
conversion log, cleared the selected archives and showed a single line,
so the only evidence of the failure was gone and a multi-GB input had to
be picked again. Compose the message with the phase, the current input,
the target, the libraries tag and the last 150 log lines, and show it in
the error box under "Failure details" so it can be copied into a report.
The report is a pure function in failure-report.mjs and is covered by
node tests.
Every conversion starts with a multi-MB libraries download, but the
worker only sent the phase, so the bar stayed indeterminate and the
percent stayed blank while the transfer ran: it read as a hang on a slow
connection. Send completed and total bytes from the download loop; the
existing 80 ms throttle keeps the messages bounded.
A blocked or offline connection died as a bare "Failed to fetch" during
the release lookup. Name the failure and the fix instead.
The batch summary passed the total file and module counts through the
byte formatter, so two apps with 1519 files and 5 modules showed
"1.5 KiB files" and "5 B modules". Counts are now printed as numbers,
as the per-app list and the single-app summary already do.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Backslash names and MS-DOS attributes from an MS-DOS host, a .. escape written with backslashes, and a Unix-host name with a backslash.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Output entries are written with a Unix host, but the source entry's external attributes were copied as is. ZIPs made on Windows carry only MS-DOS attributes, so app0 files were recorded with mode 0000 and Info-ZIP unzip extracts them unreadable. Entries without a Unix mode now get 0644.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Windows PowerShell's Compress-Archive stores entry names with \ as the separator and an MS-DOS host. The converter rejected every such ZIP as an unsafe path. Entries from an MS-DOS host now have \ turned into / before the path is validated, so .. and the other unsafe names are still rejected. Unix-host names keep rejecting \.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Before: a dump taken straight from a package holds SELF containers, so the app
root has no ELF, and converting it answered "Expected exactly one executable ELF
in the app root; found 0" while the Convert button stayed disabled, with nothing
pointing at what was wrong. A sce_module entry that is a SELF was dropped as well
without a word, although docs/user/USAGE.md documents the relinker skipping
SELF/fSELF containers with a warning.
Now the first bytes of each root file are matched against SELF_MAGIC_PS4 and
SELF_MAGIC_PS5 (the two containers pkg-to-anyps5 unwraps), so an executable case
names the file and asks for the app to be unwrapped first, and a skipped module
joins the same warnings list the conversion gate already reads, which makes the
acknowledge box appear for it too.
Use the published, checksum-verified library archive when GitHub's public rate limit prevents the latest-release check. Keep rejecting other request failures and version mismatches, and cover both paths in the worker test.\n\nCo-authored-by: Copilot <[email protected]>