9 Commits
Author SHA1 Message Date
phantomptrandClaude Opus 5.5 bf27ebc1d8 Build with Node releases that carry the October 2026 security fixes
CI and release builds use the newest Node 22.x (check-latest; the runner
image can lag behind 22.23.4), and the web UI image's frontend stage is
pinned to node:26.12.1-alpine. Node only runs at build time; no shipped
artifact contains it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JoFXdUvVCDAG8xRjtp52qt
2026-10-21 22:25:57 -07:00
PhantomPtr 1dad1cfa98 Fix package APIs under URL prefixes and prepare v7.1.13 (#494) 2026-10-21 10:36:55 -07:00
PhantomPtr 52f1c2a905 Fix SMB collection moves, browser uploads, avatar crop and proxy hosting (#492)
* Add regression cases for avatar framing, prefixed healthchecks and browser payload access

* Cover SMB permission classification and browser file staging regressions

* Exercise avatar position application and browser ELF selection in browser CI

* Document reverse proxy setup and exercise intact SMB folder moves in CI

* fix: browser intake, avatar framing and prefixed healthchecks

* test: inspect SMB metadata before moving a populated game folder

* fix: share browser payload routes with engine state

* fix: translate browser flows and validate prefixed Docker hosting

* test: isolate writable Samba data from daemon runtime files

* fix: close SMB readers before moving inspected collection folders

* test: capture Samba rename decision and fixture permissions in CI

* test: use an authenticated Samba account for move contracts

* fix: forward browser crop coordinates and remove CI timing races
2026-10-21 09:39:05 -07:00
phantomptrandClaude Opus 5.5 99dda9acb8 console page: build, shell, controller navigation
The page the helper serves on the PS5 itself: client/src/console/ built by
vite.console.config.ts into one self-contained dist-console/index.html
(script and styles inlined, safari13, 253 KiB raw / 84.5 KiB gzip; the
build fails over 450 KiB raw or 150 KiB gzip). payload/Makefile gzips it
into build/webui_page.c and the helper serves it at GET /, with
GET /api/token for the per-start token.

- Shell: top bar (logo, console chip from /api/status), rail of the
  implemented sections (Home, Files, Settings placeholders), hint bar
  showing only verified bindings, reload banner on a 401.
- nav.ts: spatial focus (aligned neighbours first), the R11 default input
  table (keyboard + Gamepad "standard", all unverified), D-pad repeat.
- api.ts: token fetched once, X-PS5U-Token on every POST, 401 → expired.
- strings.ts: cw_* keys from all 21 locales via build-console-strings.mjs
  (vm-eval like the i18n gate), English fallback.
- CI: client npm ci before every make payload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS
2026-10-17 05:23:26 -07:00
PhantomPtrandClaude Opus 5.5 9a6b5571a7 6.6.0: Bug report wizard, event timeline, multi-console fixes, faster builds
- Bug report wizard (4 steps, time range, GitHub/Discord/zip), redacted on both sides.
- Engine event journal + app journal merged into one timeline; helper stderr mirrored from each PS5.
- Results that finish after a console switch land on the console they started on.
- Faster local gate and CI (nextest, parallel lanes, sharded C interop/ASan, cache restore/save).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ub1mez9eaVtTF8pMEFXvA9
2026-10-08 23:31:25 -07:00
PhantomPtrandClaude Opus 5.5 534772d55a 5.41.0: installs the PS5 declined, working Docker images, Payload Manager fallback (#347)
* fix: installs the PS5 declined, Docker images that work, Payload Manager as a backup loader (5.41.0)

Installs
- A package the console serves itself (Upload & install, USB, the phone app)
  is refused on FW 13.60 with 0x80B2116F (Sony's DbgGetPatchInfo/DbgCancelPatch
  path, especially over an installed app). The unified install now re-serves
  the console's copy from the engine (ps5:// read back through the helper) and
  a refused link through the engine's link proxy. HW-verified on a 13.60 Pro:
  stream, Upload & install fresh and over an installed app, USB.
- Installer 1.2.0: fixed past Last-Modified, logs to /data/ps5upload/installer.log.
- NET_REACH (frame 148/149): the console checks it can reach the engine before
  a stream install and names a firewall/isolation cause in seconds.
- Staged-route refusals get their own reason and message (staged_refused).
- Folder-game register on 13.x: sceAppInstUtilAppInstallAll fallback,
  /system_ex rw remount on EROFS, repeated uninstall for its two records.
- Removed the incorrect "no fake packages above FW 11.60" warnings.

Loaders
- itsPLK Payload Manager (:8084) fallback: starts the installer, recovers a
  wedged elfldr (HW-verified) and puts the helper back when :9021 is dead.
  Only ever uses its own ps5upload-* folders.
- Setup wizard skips payloads already running; "Send only ps5upload".

Engine / self-hosting
- Engine clients ignore proxy env vars; errors carry the real cause.
- Docker: writable /tmp and /data (also under a user: override), HEALTHCHECK
  via --healthcheck, PS5UPLOAD_ALLOW_IP takes CIDR ranges, actionable 403,
  bridge-network warning, engine/compose.yaml, scripts/docker-smoke.sh run in
  the PR gate and before every release push.
- Desktop app with a remote engine browses the engine's disk; From this device
  uploads first. Android engine listens on the LAN so the phone can stream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test: accept Windows' timeout as the probe's underlying cause

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* style: rustfmt the probe test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:38:55 -07:00
PhantomPtrandClaude Opus 5.5 6f5abad2b5 elfldr that recovers by itself; 75-minute publish builds; 5.37.1 notes (#338)
* feat(elfldr): vendor elfldr with a read deadline, embedded in the engine

elfldr serves one connection at a time and its reads had no deadline,
so a client that went silent without closing (a dropped link, a machine
or console asleep mid-send) left it running but deaf on :9021 — users
had to load elfldr again. Measured on the Phat (FW 5.10): the stock
build answered nothing while a silent connection stayed open; with a
15 s SO_RCVTIMEO it dropped that connection and answered the next
request at once, and a payload sent with 10 s pauses still loaded.

third_party/elfldr is upstream 02cfe91 plus ps5upload.patch (GPLv3,
credited), with the tested ELF checked in so every engine build embeds
it; `make elfldr` rebuilds it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(elfldr): the engine swaps a console's stock elfldr for the patched one

GET /api/ps5/elfldr/health tells healthy / stuck / absent from a request
elfldr answers without running anything. POST /api/ps5/elfldr/ensure
replaces the standard elfldr.elf with the embedded patched build when it
answers and isn't the one this engine installed (a reboot or autoloader
brings the stock one back), leaves any other loader on :9021 alone, and
returns once the new one answers. On the Phat: upgraded (pid 685,
answering at once), then 'current'; the helper was untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(publish): give each client build 75 minutes

The Intel macOS build ran past the 45-minute limit for v5.37.0 (about
33 minutes for v5.35.0 and v5.36.0), which cancelled it and skipped
create-release, so v5.37.0 was never published.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(engine): history tests get their own temp dirs

TmpDir named directories by pid and nanoseconds, but macOS time ticks in
microseconds: two tests starting together shared a directory and one
deleted it under the other (a_legacy_host_port_file_is_still_read read
nothing). A counter makes each name unique. The elfldr embed test reads
the embedded bytes directly instead of clearing an env var mid-run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(elfldr): the app keeps the patched elfldr in place and never sends into a stuck one

Before sending the helper, the app checks the console's loader: a stuck
one (took the connection, never answered) is waited out for 20 s — the
patched build clears in 15 — and one that stays stuck is reported
plainly ('load elfldr again') instead of a socket error. Once the helper
is up, the engine swaps the stock elfldr for the patched build: at once
after a fresh helper send (a reboot or wake brings the stock one back),
else at most every 10 minutes per console. Desktop, browser and Android
share the engine routes; strings in all 20 languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(changelog): 5.37.1 — elfldr recovers by itself; 5.37.0 folded in

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(elfldr): swap it in when the helper is already up at launch

Only ensurePayloadCurrent asked for the patched elfldr, and a helper
that is already up when the app opens never goes through it — on the
Phat the stock elfldr stayed. The status poll's 'arrives at up' edge
(first sighting included) now asks too, after the same settle as the
log capture and never during a transfer.

Hardware (Phat FW 5.10, web build and Android app): stock elfldr
replaced ~10 s after opening; a silent :9021 connection held while the
helper was shut down — the helper came back through the patched
elfldr; with the stock elfldr wedged, the Android app sent nothing for
150 s (health: stuck), then redeployed and swapped elfldr once released.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(convert): the compress stage pays for reading and writing on one thread

kraken_image::compress runs the encoder on a pool, but one thread reads
the source and writes each compressed block, so the stage takes the
longer of encoding and read+write — not the slower of reading and
encoding, as the estimate assumed. With the Windows Battlefield 6 run's
speeds the model now gives 75 min for a 71-min build.

The estimate also reports the speeds it measured (rates), because the
small read/write samples can be fooled by caches: on a source read an
hour earlier the read sample hit the file cache at 8.6 GB/s and the
estimate came out at 25 min for a 54-min build. Calibrating from past
builds is the follow-up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(changelog): build-time estimate, stated as measured

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(docker): 25 minutes for the PR image checks

Both PR gates build the whole image (engine, and the client for the web
UI one) in about 7-10 minutes; the engine gate took 9m55s and the web UI
gate was cancelled at its 10-minute limit on PR #338.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 14:55:05 -07:00
PhantomPtrandClaude Opus 5.5 3f34434287 ci(docker): read the installer ELF from the artifact's installer/ dir (#333)
The payload artifact keeps payload/installer/ps5upload-installer.elf as
installer/ps5upload-installer.elf; the image jobs still copied it from the
old dpi/ path and failed on the v5.35.0 tag.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 05:27:27 -07:00
phantomptrandClaude Opus 5.5 c14782944d PS5Upload v5.35.0
Upload, install, convert and manage PS5 game packages over the network.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 04:31:13 -07:00